@phuetz/code-buddy 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.fr.md +56 -0
- package/README.md +74 -16
- package/codebuddy-runtime.json +5 -5
- package/dist/agent/codebuddy-agent.d.ts +18 -0
- package/dist/agent/codebuddy-agent.js +45 -8
- package/dist/agent/execution/agent-executor.d.ts +0 -9
- package/dist/agent/execution/agent-executor.js +176 -12
- package/dist/agent/execution/context-pipeline.d.ts +9 -0
- package/dist/agent/execution/context-pipeline.js +64 -2
- package/dist/agent/execution/tool-loop-guard.d.ts +76 -0
- package/dist/agent/execution/tool-loop-guard.js +165 -0
- package/dist/agent/execution/tool-selection-strategy.d.ts +7 -0
- package/dist/agent/execution/tool-selection-strategy.js +32 -2
- package/dist/agent/facades/session-facade.d.ts +0 -6
- package/dist/agent/facades/session-facade.js +0 -45
- package/dist/agent/hermes-claw-migrate.d.ts +0 -21
- package/dist/agent/hermes-claw-migrate.js +9 -4
- package/dist/agent/hermes-protocol-gateways.js +8 -1
- package/dist/agent/repo-profiler.js +17 -4
- package/dist/agent/self-improvement/authored-tool-runtime.js +10 -2
- package/dist/agent/self-improvement/evolution/ast-novelty.d.ts +5 -0
- package/dist/agent/self-improvement/evolution/ast-novelty.js +58 -23
- package/dist/agent/self-improvement/evolution/code-variant-store.d.ts +3 -0
- package/dist/agent/self-improvement/evolution/evolution-engine.js +2 -0
- package/dist/agent/self-improvement/evolution/protected-paths.js +6 -0
- package/dist/agent/self-improvement/evolution/variant-fitness.d.ts +13 -2
- package/dist/agent/self-improvement/evolution/variant-fitness.js +184 -58
- package/dist/agent/self-improvement/evolution/worktree-scorer.d.ts +2 -0
- package/dist/agent/self-improvement/evolution/worktree-scorer.js +15 -0
- package/dist/agent/self-improvement/evolutionary-archive.d.ts +2 -1
- package/dist/agent/self-improvement/evolutionary-archive.js +34 -5
- package/dist/agent/self-improvement/proposal-store.d.ts +1 -0
- package/dist/agent/self-improvement/proposal-store.js +79 -17
- package/dist/agent/self-improvement/skill-apply-journal.d.ts +44 -0
- package/dist/agent/self-improvement/skill-apply-journal.js +178 -0
- package/dist/agent/self-improvement/skill-behavior-benchmark.d.ts +3 -0
- package/dist/agent/self-improvement/skill-behavior-benchmark.js +19 -0
- package/dist/agent/self-improvement/skill-behavior-gate.d.ts +34 -0
- package/dist/agent/self-improvement/skill-behavior-gate.js +96 -0
- package/dist/agent/self-improvement/skill-engine.d.ts +22 -0
- package/dist/agent/self-improvement/skill-engine.js +385 -13
- package/dist/agent/self-improvement/skill-gate.d.ts +2 -0
- package/dist/agent/self-improvement/skill-gate.js +17 -2
- package/dist/agent/self-improvement/skill-mutator.d.ts +6 -1
- package/dist/agent/self-improvement/skill-mutator.js +51 -15
- package/dist/agent/self-improvement/skill-types.d.ts +2 -1
- package/dist/agent/self-improvement/types.d.ts +11 -0
- package/dist/agent/tool-handler.d.ts +1 -1
- package/dist/agent/tool-handler.js +28 -9
- package/dist/auth/profile-manager.js +1 -1
- package/dist/channels/companion-channel-turn.d.ts +53 -4
- package/dist/channels/companion-channel-turn.js +218 -16
- package/dist/channels/slash-parity.d.ts +4 -6
- package/dist/channels/slash-parity.js +9 -44
- package/dist/cli/session-commands.d.ts +9 -0
- package/dist/cli/session-commands.js +45 -5
- package/dist/cli/session-picker.d.ts +43 -0
- package/dist/cli/session-picker.js +128 -0
- package/dist/codebuddy/a2a-call-tool-defs.d.ts +26 -0
- package/dist/codebuddy/a2a-call-tool-defs.js +12 -0
- package/dist/codebuddy/fleet-tool-defs.d.ts +2 -0
- package/dist/codebuddy/fleet-tool-defs.js +55 -0
- package/dist/codebuddy/providers/chatgpt-headers.d.ts +18 -0
- package/dist/codebuddy/providers/chatgpt-headers.js +37 -0
- package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +2 -1
- package/dist/codebuddy/providers/provider-chatgpt-responses.js +10 -23
- package/dist/codebuddy/providers/provider-openai-compat.d.ts +7 -0
- package/dist/codebuddy/providers/provider-openai-compat.js +29 -1
- package/dist/codebuddy/ragchat-tool-defs.d.ts +31 -0
- package/dist/codebuddy/ragchat-tool-defs.js +19 -0
- package/dist/codebuddy/resource-catalog-tool-defs.d.ts +28 -0
- package/dist/codebuddy/resource-catalog-tool-defs.js +18 -0
- package/dist/codebuddy/tool-definitions/agent-tools.js +2 -2
- package/dist/codebuddy/tool-definitions/code-exec-tools.js +5 -1
- package/dist/codebuddy/tool-definitions/cron-tools.js +6 -0
- package/dist/codebuddy/tool-definitions/self-describe-tools.js +6 -1
- package/dist/codebuddy/tools.d.ts +0 -6
- package/dist/codebuddy/tools.js +25 -3
- package/dist/commands/cli/daemon-commands.js +3 -1
- package/dist/commands/cli/evolve-command.js +21 -5
- package/dist/commands/cli/fleet-collaboration-commands.d.ts +2 -0
- package/dist/commands/cli/fleet-collaboration-commands.js +57 -0
- package/dist/commands/cli/fleet-commands.js +29 -0
- package/dist/commands/cli/fleet-mission-commands.d.ts +3 -0
- package/dist/commands/cli/fleet-mission-commands.js +72 -0
- package/dist/commands/cli/fleet-rooms-commands.d.ts +10 -0
- package/dist/commands/cli/fleet-rooms-commands.js +289 -0
- package/dist/commands/cli/tools-commands.js +2 -1
- package/dist/commands/cli/triage-command.d.ts +8 -0
- package/dist/commands/cli/triage-command.js +72 -0
- package/dist/commands/cli/utility-commands.js +25 -1
- package/dist/commands/client-dispatcher.d.ts +7 -0
- package/dist/commands/client-dispatcher.js +73 -21
- package/dist/commands/cron-cli/index.d.ts +3 -1
- package/dist/commands/cron-cli/index.js +25 -0
- package/dist/commands/device-auth.d.ts +10 -0
- package/dist/commands/device-auth.js +91 -0
- package/dist/commands/enhanced-command-handler.d.ts +9 -0
- package/dist/commands/enhanced-command-handler.js +28 -6
- package/dist/commands/handlers/agent-handlers.d.ts +1 -1
- package/dist/commands/handlers/agent-handlers.js +4 -4
- package/dist/commands/handlers/channel-handlers.js +53 -2
- package/dist/commands/handlers/export-handlers.d.ts +3 -2
- package/dist/commands/handlers/export-handlers.js +55 -28
- package/dist/commands/handlers/extra-handlers.js +5 -1
- package/dist/commands/handlers/grill-me-handler.js +26 -18
- package/dist/commands/handlers/memory-handlers.d.ts +6 -2
- package/dist/commands/handlers/memory-handlers.js +35 -15
- package/dist/commands/handlers/missing-handlers.d.ts +2 -2
- package/dist/commands/handlers/missing-handlers.js +12 -4
- package/dist/commands/handlers/resources-handler.d.ts +12 -0
- package/dist/commands/handlers/resources-handler.js +52 -0
- package/dist/commands/handlers/starter-handlers.d.ts +1 -1
- package/dist/commands/handlers/starter-handlers.js +32 -2
- package/dist/commands/handlers/switch-handler.d.ts +1 -1
- package/dist/commands/handlers/switch-handler.js +15 -0
- package/dist/commands/handlers/test-handlers.js +4 -86
- package/dist/commands/handlers/ui-handlers.js +11 -5
- package/dist/commands/login-chatgpt.d.ts +8 -0
- package/dist/commands/login-chatgpt.js +17 -0
- package/dist/commands/mcp-import.d.ts +11 -0
- package/dist/commands/mcp-import.js +67 -0
- package/dist/commands/mcp-invoke.d.ts +2 -0
- package/dist/commands/mcp-invoke.js +68 -0
- package/dist/commands/mcp.d.ts +13 -0
- package/dist/commands/mcp.js +66 -21
- package/dist/commands/pipeline.d.ts +7 -1
- package/dist/commands/pipeline.js +104 -7
- package/dist/commands/resources.d.ts +2 -0
- package/dist/commands/resources.js +64 -0
- package/dist/commands/skills-cli/index.js +35 -12
- package/dist/commands/slash/builtin-commands.js +16 -3
- package/dist/commands/slash/index.d.ts +3 -1
- package/dist/commands/slash/index.js +2 -0
- package/dist/commands/slash/surfaces.d.ts +53 -0
- package/dist/commands/slash/surfaces.js +177 -0
- package/dist/commands/slash/types.d.ts +17 -0
- package/dist/commands/try.d.ts +1 -1
- package/dist/commands/try.js +1 -1
- package/dist/companion/companion-identity.d.ts +43 -0
- package/dist/companion/companion-identity.js +136 -0
- package/dist/companion/companion-toolset.d.ts +66 -0
- package/dist/companion/companion-toolset.js +368 -0
- package/dist/companion/companion-turn.d.ts +10 -2
- package/dist/companion/companion-turn.js +38 -1
- package/dist/config/code-exec-policy.d.ts +25 -0
- package/dist/config/code-exec-policy.js +39 -0
- package/dist/config/model-tools.d.ts +9 -0
- package/dist/config/model-tools.js +103 -0
- package/dist/context/context-manager-v2.js +2 -2
- package/dist/context/lm-resizer-compressor.js +3 -2
- package/dist/context/lm-resizer-diagnostics.d.ts +9 -0
- package/dist/context/lm-resizer-diagnostics.js +30 -0
- package/dist/context/tool-output-masking.js +3 -4
- package/dist/curator/curator.d.ts +6 -0
- package/dist/curator/curator.js +53 -3
- package/dist/daemon/cron-agent-bridge.d.ts +6 -0
- package/dist/daemon/cron-agent-bridge.js +31 -4
- package/dist/doctor/index.d.ts +11 -2
- package/dist/doctor/index.js +84 -21
- package/dist/doctor/integrations.d.ts +197 -0
- package/dist/doctor/integrations.js +241 -0
- package/dist/doctor/triage.d.ts +108 -0
- package/dist/doctor/triage.js +304 -0
- package/dist/errors/crash-handler.js +2 -0
- package/dist/fleet/collaboration.d.ts +44 -0
- package/dist/fleet/collaboration.js +170 -0
- package/dist/fleet/fleet-listener.d.ts +1 -0
- package/dist/fleet/fleet-listener.js +87 -46
- package/dist/fleet/fleet-registry.d.ts +2 -0
- package/dist/fleet/resource-catalog.d.ts +245 -0
- package/dist/fleet/resource-catalog.js +211 -0
- package/dist/fleet/rooms/room-access.d.ts +138 -0
- package/dist/fleet/rooms/room-access.js +196 -0
- package/dist/fleet/rooms/room-client.d.ts +158 -0
- package/dist/fleet/rooms/room-client.js +685 -0
- package/dist/fleet/rooms/room-event.d.ts +139 -0
- package/dist/fleet/rooms/room-event.js +330 -0
- package/dist/fleet/rooms/room-filter.d.ts +48 -0
- package/dist/fleet/rooms/room-filter.js +152 -0
- package/dist/fleet/rooms/room-hub.d.ts +154 -0
- package/dist/fleet/rooms/room-hub.js +363 -0
- package/dist/fleet/rooms/room-identity.d.ts +26 -0
- package/dist/fleet/rooms/room-identity.js +82 -0
- package/dist/fleet/rooms/room-lock.d.ts +34 -0
- package/dist/fleet/rooms/room-lock.js +180 -0
- package/dist/fleet/rooms/room-observations.d.ts +7 -0
- package/dist/fleet/rooms/room-observations.js +61 -0
- package/dist/fleet/rooms/room-server.d.ts +28 -0
- package/dist/fleet/rooms/room-server.js +75 -0
- package/dist/fleet/rooms/room-store.d.ts +119 -0
- package/dist/fleet/rooms/room-store.js +448 -0
- package/dist/fleet/rooms/room-ws-bridge.d.ts +27 -0
- package/dist/fleet/rooms/room-ws-bridge.js +137 -0
- package/dist/fleet/sensory-mission-bridge.d.ts +42 -0
- package/dist/fleet/sensory-mission-bridge.js +136 -0
- package/dist/git/worktree-sessions.js +1 -0
- package/dist/harness/contract.d.ts +4 -4
- package/dist/harness/fleet-supervisor.d.ts +16 -0
- package/dist/harness/fleet-supervisor.js +64 -0
- package/dist/harness/index.d.ts +4 -0
- package/dist/harness/index.js +4 -0
- package/dist/harness/mission-runner.d.ts +3 -0
- package/dist/harness/mission-runner.js +53 -0
- package/dist/harness/mission-store.d.ts +93 -0
- package/dist/harness/mission-store.js +297 -0
- package/dist/harness/tool-harness.d.ts +56 -0
- package/dist/harness/tool-harness.js +153 -0
- package/dist/hooks/use-enhanced-input.js +48 -4
- package/dist/hooks/use-input-handler.d.ts +1 -0
- package/dist/hooks/use-input-handler.js +82 -22
- package/dist/hooks/use-input-history.js +1 -0
- package/dist/identity/lisa-introspection.js +5 -2
- package/dist/identity/operational-self-model.d.ts +2 -0
- package/dist/identity/operational-self-model.js +4 -0
- package/dist/index.js +52 -6
- package/dist/mcp/client.d.ts +11 -0
- package/dist/mcp/client.js +68 -3
- package/dist/mcp/config.d.ts +20 -0
- package/dist/mcp/config.js +121 -8
- package/dist/mcp/import-normalize.d.ts +12 -0
- package/dist/mcp/import-normalize.js +114 -0
- package/dist/mcp/mcp-oauth-constants.d.ts +8 -0
- package/dist/mcp/mcp-oauth-constants.js +9 -0
- package/dist/mcp/mcp-oauth-provider.d.ts +80 -0
- package/dist/mcp/mcp-oauth-provider.js +241 -0
- package/dist/mcp/mcp-oauth.d.ts +60 -1
- package/dist/mcp/mcp-oauth.js +241 -65
- package/dist/mcp/transports.d.ts +14 -5
- package/dist/mcp/transports.js +112 -101
- package/dist/mcp/types.d.ts +5 -0
- package/dist/media/comfyui-recipe-contract.d.ts +7 -7
- package/dist/memory/facts-memory.d.ts +11 -1
- package/dist/memory/facts-memory.js +47 -8
- package/dist/memory/memory-candidate-queue.d.ts +2 -2
- package/dist/memory/memory-candidate-queue.js +6 -6
- package/dist/memory/persistent-memory.d.ts +13 -8
- package/dist/memory/persistent-memory.js +77 -30
- package/dist/nodes/device-node.js +5 -9
- package/dist/observability/mobile-supervision-gateway-contract.js +20 -7
- package/dist/observability/run-event-writer.d.ts +21 -0
- package/dist/observability/run-event-writer.js +81 -0
- package/dist/observability/run-store.d.ts +5 -0
- package/dist/observability/run-store.js +18 -13
- package/dist/observability/run-trajectory.js +1 -1
- package/dist/optimization/prompt-cache.d.ts +19 -2
- package/dist/optimization/prompt-cache.js +41 -6
- package/dist/orchestration/orchestrator.d.ts +21 -0
- package/dist/orchestration/orchestrator.js +122 -15
- package/dist/persistence/session-content.d.ts +8 -0
- package/dist/persistence/session-content.js +76 -0
- package/dist/persistence/session-handoff.d.ts +64 -0
- package/dist/persistence/session-handoff.js +80 -0
- package/dist/persistence/session-history.d.ts +4 -0
- package/dist/persistence/session-history.js +38 -0
- package/dist/persistence/session-store.d.ts +9 -0
- package/dist/persistence/session-store.js +48 -20
- package/dist/personas/persona-manager.js +17 -1
- package/dist/plugins/code-explorer/CodeExplorerManager.d.ts +10 -4
- package/dist/plugins/code-explorer/CodeExplorerManager.js +69 -16
- package/dist/plugins/plugin-manager.js +10 -1
- package/dist/prompts/prompt-manager.js +11 -4
- package/dist/prompts/system-base.js +6 -2
- package/dist/protocols/a2a/codebuddy-executor.d.ts +11 -2
- package/dist/protocols/a2a/codebuddy-executor.js +9 -8
- package/dist/protocols/a2a/index.d.ts +1 -1
- package/dist/protocols/a2a/jsonrpc-v1.d.ts +41 -0
- package/dist/protocols/a2a/jsonrpc-v1.js +145 -0
- package/dist/protocols/a2a/peer-config.d.ts +20 -0
- package/dist/protocols/a2a/peer-config.js +55 -0
- package/dist/providers/codex-oauth.js +30 -6
- package/dist/providers/model-provider-compat.js +2 -1
- package/dist/sandbox/os-sandbox.d.ts +1 -1
- package/dist/scheduler/cron-scheduler.d.ts +15 -2
- package/dist/scheduler/cron-scheduler.js +35 -4
- package/dist/scheduler/job-notepad.d.ts +69 -0
- package/dist/scheduler/job-notepad.js +339 -0
- package/dist/security/audit-logger.d.ts +1 -1
- package/dist/security/compute-confinement.d.ts +4 -0
- package/dist/security/compute-confinement.js +89 -0
- package/dist/security/session-encryption.d.ts +4 -0
- package/dist/security/session-encryption.js +31 -0
- package/dist/sensory/voice-loop.d.ts +17 -0
- package/dist/sensory/voice-loop.js +72 -15
- package/dist/server/auth/device-session-context.d.ts +9 -0
- package/dist/server/auth/device-session-context.js +13 -0
- package/dist/server/auth/device-store.d.ts +89 -0
- package/dist/server/auth/device-store.js +261 -0
- package/dist/server/auth/device-token.d.ts +3 -0
- package/dist/server/auth/device-token.js +6 -0
- package/dist/server/auth/jwt.js +4 -0
- package/dist/server/index.d.ts +0 -10
- package/dist/server/index.js +28 -0
- package/dist/server/middleware/auth.js +3 -2
- package/dist/server/routes/a2a-jsonrpc.d.ts +9 -0
- package/dist/server/routes/a2a-jsonrpc.js +66 -0
- package/dist/server/routes/a2a-protocol.d.ts +12 -0
- package/dist/server/routes/a2a-protocol.js +1 -1
- package/dist/server/routes/device-auth.d.ts +4 -0
- package/dist/server/routes/device-auth.js +40 -0
- package/dist/server/types.d.ts +4 -0
- package/dist/server/websocket/handler.d.ts +13 -0
- package/dist/server/websocket/handler.js +102 -17
- package/dist/services/prompt-builder.d.ts +2 -0
- package/dist/services/prompt-builder.js +16 -6
- package/dist/services/runtime-settings-context.d.ts +81 -0
- package/dist/services/runtime-settings-context.js +79 -0
- package/dist/skills/executor.js +2 -0
- package/dist/skills/hub.js +16 -14
- package/dist/skills/local-inventory.d.ts +21 -0
- package/dist/skills/local-inventory.js +72 -0
- package/dist/skills/skill-loader.js +2 -2
- package/dist/skills/skill-usage-store.d.ts +49 -0
- package/dist/skills/skill-usage-store.js +121 -0
- package/dist/testing/ai-integration-tests.js +8 -5
- package/dist/themes/theme-manager.d.ts +12 -0
- package/dist/themes/theme-manager.js +29 -0
- package/dist/themes/theme-schema.d.ts +24 -24
- package/dist/tools/a2a-call-tool.d.ts +34 -0
- package/dist/tools/a2a-call-tool.js +75 -0
- package/dist/tools/bash/streaming-executor.d.ts +1 -0
- package/dist/tools/bash/streaming-executor.js +78 -90
- package/dist/tools/code-exec-preflight-runner.d.ts +41 -0
- package/dist/tools/code-exec-preflight-runner.js +254 -0
- package/dist/tools/code-exec-preflight.d.ts +44 -0
- package/dist/tools/code-exec-preflight.js +501 -0
- package/dist/tools/code-exec-tool.d.ts +48 -1
- package/dist/tools/code-exec-tool.js +191 -47
- package/dist/tools/comment-watcher.js +29 -12
- package/dist/tools/core-code-inspection.d.ts +56 -0
- package/dist/tools/core-code-inspection.js +86 -0
- package/dist/tools/create-skill-tool.d.ts +2 -3
- package/dist/tools/create-skill-tool.js +16 -75
- package/dist/tools/cronjob-tool.d.ts +1 -0
- package/dist/tools/cronjob-tool.js +1 -0
- package/dist/tools/env-doctor-tool.d.ts +2 -0
- package/dist/tools/env-doctor-tool.js +4 -3
- package/dist/tools/execute-code-rpc-invoker.d.ts +1 -1
- package/dist/tools/execute-code-rpc-invoker.js +35 -19
- package/dist/tools/execute-code-runner.d.ts +2 -0
- package/dist/tools/execute-code-runner.js +52 -17
- package/dist/tools/fleet-room-tool.d.ts +104 -0
- package/dist/tools/fleet-room-tool.js +124 -0
- package/dist/tools/integration-tool-hints.d.ts +4 -0
- package/dist/tools/integration-tool-hints.js +19 -0
- package/dist/tools/list-peers-tool.d.ts +3 -0
- package/dist/tools/list-peers-tool.js +11 -4
- package/dist/tools/media-generation-tool.d.ts +16 -1
- package/dist/tools/media-generation-tool.js +341 -9
- package/dist/tools/merge-conflict-tool.js +53 -25
- package/dist/tools/metadata.d.ts +1 -5
- package/dist/tools/metadata.js +30 -28
- package/dist/tools/peer-tool-invoke-tool.d.ts +61 -0
- package/dist/tools/peer-tool-invoke-tool.js +396 -0
- package/dist/tools/ragchat-tool.d.ts +39 -0
- package/dist/tools/ragchat-tool.js +105 -0
- package/dist/tools/registry/fleet-tools.d.ts +21 -3
- package/dist/tools/registry/fleet-tools.js +137 -4
- package/dist/tools/registry/index.d.ts +1 -1
- package/dist/tools/registry/index.js +2 -2
- package/dist/tools/registry/knowledge-tools.d.ts +2 -2
- package/dist/tools/registry/knowledge-tools.js +2 -2
- package/dist/tools/registry/lessons-tools.d.ts +7 -0
- package/dist/tools/registry/lessons-tools.js +43 -3
- package/dist/tools/registry/memory-tools.d.ts +1 -1
- package/dist/tools/registry/memory-tools.js +8 -8
- package/dist/tools/registry/research-tools.d.ts +1 -0
- package/dist/tools/registry/research-tools.js +4 -13
- package/dist/tools/registry/self-describe-tools.d.ts +1 -1
- package/dist/tools/registry/self-describe-tools.js +43 -30
- package/dist/tools/resource-catalog-tool.d.ts +38 -0
- package/dist/tools/resource-catalog-tool.js +46 -0
- package/dist/tools/skills-inspection-tool.js +30 -1
- package/dist/tools/stream-tool-output.d.ts +3 -0
- package/dist/tools/stream-tool-output.js +33 -0
- package/dist/tools/tool-call-scheduler.d.ts +10 -0
- package/dist/tools/tool-call-scheduler.js +58 -0
- package/dist/tools/tool-effect.d.ts +5 -0
- package/dist/tools/tool-effect.js +26 -0
- package/dist/tools/tool-search.d.ts +12 -11
- package/dist/tools/tool-search.js +67 -26
- package/dist/tools/types.d.ts +6 -0
- package/dist/ui/components/ChatHistory.d.ts +1 -1
- package/dist/ui/components/ChatHistory.js +2 -2
- package/dist/ui/components/ChatInput.d.ts +2 -1
- package/dist/ui/components/ChatInput.js +42 -88
- package/dist/ui/components/ChatInterface.d.ts +4 -2
- package/dist/ui/components/ChatInterface.js +27 -63
- package/dist/ui/components/CommandSuggestions.d.ts +0 -1
- package/dist/ui/components/CommandSuggestions.js +4 -6
- package/dist/ui/components/FileAutocomplete.js +1 -1
- package/dist/ui/components/KeyboardHelp.js +8 -6
- package/dist/ui/components/ModelSelection.js +6 -5
- package/dist/ui/components/StatusBar.d.ts +2 -1
- package/dist/ui/components/StatusBar.js +8 -7
- package/dist/ui/context/theme-context.js +3 -2
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/ui/utils/markdown-renderer.js +4 -13
- package/dist/utils/atomic-write.d.ts +22 -0
- package/dist/utils/atomic-write.js +29 -0
- package/dist/utils/bounded-output.d.ts +16 -0
- package/dist/utils/bounded-output.js +63 -0
- package/dist/utils/config-validation/schema.d.ts +2 -2
- package/dist/utils/device-store-file.d.ts +4 -0
- package/dist/utils/device-store-file.js +40 -0
- package/dist/utils/export-manager.d.ts +9 -0
- package/dist/utils/export-manager.js +19 -0
- package/dist/utils/first-use-hints.d.ts +25 -0
- package/dist/utils/first-use-hints.js +58 -0
- package/dist/utils/graceful-shutdown.d.ts +8 -0
- package/dist/utils/graceful-shutdown.js +23 -7
- package/dist/utils/history-manager.js +1 -1
- package/dist/utils/update-notifier.js +16 -18
- package/dist/wizard/environment-detection.d.ts +5 -1
- package/dist/wizard/environment-detection.js +49 -7
- package/dist/wizard/onboarding.d.ts +5 -1
- package/dist/wizard/onboarding.js +90 -30
- package/dist/wizard/provider-onboarding.d.ts +2 -0
- package/dist/wizard/provider-onboarding.js +55 -17
- package/package.json +7 -3
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet rooms — membership and access policy.
|
|
3
|
+
*
|
|
4
|
+
* Buzz makes channel membership "the only gate", enforced by the relay before
|
|
5
|
+
* any read or write (`ARCHITECTURE.md` §7, `crates/buzz-relay/src/handlers/req.rs`).
|
|
6
|
+
* Here the hub operator declares members (public keys) and rooms in one file:
|
|
7
|
+
*
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "version": 1,
|
|
11
|
+
* "members": { "<pubkey hex>": { "name": "peer-alpha", "principals": ["key:abc"] } },
|
|
12
|
+
* "rooms": { "general": { "members": ["<pubkey hex>"], "readers": ["<pubkey hex>"] } }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* - `rooms.<id>.members` may read and write; `readers` may only read.
|
|
17
|
+
* - `principals` binds a key to WebSocket identities: when the field is ABSENT
|
|
18
|
+
* the key is accepted on any authenticated connection; when it is a list the
|
|
19
|
+
* connection principal must be in it; an EMPTY list refuses every connection.
|
|
20
|
+
*
|
|
21
|
+
* Fail-closed: a missing, unreadable or invalid file yields no member and no
|
|
22
|
+
* room. Refresh window: the file's `mtimeMs`/`ctimeMs`/size/inode are checked at
|
|
23
|
+
* most once per `reloadIntervalMs` (default 1000 ms), so a revocation applies
|
|
24
|
+
* to the first check after that window — including deliveries to subscriptions
|
|
25
|
+
* that are already open.
|
|
26
|
+
*
|
|
27
|
+
* @module fleet/rooms/room-access
|
|
28
|
+
*/
|
|
29
|
+
import { z } from 'zod';
|
|
30
|
+
export declare const MAX_ROOM_ACCESS_MEMBERS = 1024;
|
|
31
|
+
export declare const MAX_ROOM_ACCESS_ROOMS = 1024;
|
|
32
|
+
declare const configSchema: z.ZodObject<{
|
|
33
|
+
version: z.ZodLiteral<1>;
|
|
34
|
+
members: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
35
|
+
name: z.ZodString;
|
|
36
|
+
principals: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
37
|
+
}, "strict", z.ZodTypeAny, {
|
|
38
|
+
name: string;
|
|
39
|
+
principals?: string[] | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
name: string;
|
|
42
|
+
principals?: string[] | undefined;
|
|
43
|
+
}>>;
|
|
44
|
+
rooms: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
45
|
+
description: z.ZodOptional<z.ZodString>;
|
|
46
|
+
members: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
47
|
+
readers: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
48
|
+
}, "strict", z.ZodTypeAny, {
|
|
49
|
+
members: string[];
|
|
50
|
+
readers: string[];
|
|
51
|
+
description?: string | undefined;
|
|
52
|
+
}, {
|
|
53
|
+
description?: string | undefined;
|
|
54
|
+
members?: string[] | undefined;
|
|
55
|
+
readers?: string[] | undefined;
|
|
56
|
+
}>>;
|
|
57
|
+
}, "strict", z.ZodTypeAny, {
|
|
58
|
+
version: 1;
|
|
59
|
+
members: Record<string, {
|
|
60
|
+
name: string;
|
|
61
|
+
principals?: string[] | undefined;
|
|
62
|
+
}>;
|
|
63
|
+
rooms: Record<string, {
|
|
64
|
+
members: string[];
|
|
65
|
+
readers: string[];
|
|
66
|
+
description?: string | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
}, {
|
|
69
|
+
version: 1;
|
|
70
|
+
members: Record<string, {
|
|
71
|
+
name: string;
|
|
72
|
+
principals?: string[] | undefined;
|
|
73
|
+
}>;
|
|
74
|
+
rooms: Record<string, {
|
|
75
|
+
description?: string | undefined;
|
|
76
|
+
members?: string[] | undefined;
|
|
77
|
+
readers?: string[] | undefined;
|
|
78
|
+
}>;
|
|
79
|
+
}>;
|
|
80
|
+
export type RoomAccessConfigInput = z.input<typeof configSchema>;
|
|
81
|
+
export interface RoomMember {
|
|
82
|
+
readonly pubkey: string;
|
|
83
|
+
readonly name: string;
|
|
84
|
+
/** `undefined`: no binding. `[]`: refuse all connections. */
|
|
85
|
+
readonly principals?: readonly string[];
|
|
86
|
+
}
|
|
87
|
+
export type RoomAccessLevel = 'write' | 'read';
|
|
88
|
+
interface CompiledRoom {
|
|
89
|
+
description?: string;
|
|
90
|
+
writers: ReadonlySet<string>;
|
|
91
|
+
readers: ReadonlySet<string>;
|
|
92
|
+
}
|
|
93
|
+
interface CompiledConfig {
|
|
94
|
+
members: ReadonlyMap<string, RoomMember>;
|
|
95
|
+
rooms: ReadonlyMap<string, CompiledRoom>;
|
|
96
|
+
}
|
|
97
|
+
export declare function defaultRoomAccessPath(): string;
|
|
98
|
+
/** Validate and compile a configuration object; throws a readable error. */
|
|
99
|
+
export declare function compileRoomAccessConfig(input: unknown): CompiledConfig;
|
|
100
|
+
export interface RoomAccessPolicyOptions {
|
|
101
|
+
/** Read this JSON file (default `$CODEBUDDY_FLEET_ROOMS_CONFIG` or `<CODEBUDDY_HOME>/fleet/rooms.json`). */
|
|
102
|
+
path?: string;
|
|
103
|
+
/** Use an in-memory configuration instead of a file (tests, embedding). */
|
|
104
|
+
config?: RoomAccessConfigInput;
|
|
105
|
+
/** Minimum delay between two file checks, in ms (finite, >= 0). */
|
|
106
|
+
reloadIntervalMs?: number;
|
|
107
|
+
}
|
|
108
|
+
export declare class RoomAccessPolicy {
|
|
109
|
+
private readonly path?;
|
|
110
|
+
private readonly reloadIntervalMs;
|
|
111
|
+
private compiled;
|
|
112
|
+
private loadedStamp?;
|
|
113
|
+
private lastCheckMs;
|
|
114
|
+
private lastProblem?;
|
|
115
|
+
constructor(options?: RoomAccessPolicyOptions);
|
|
116
|
+
private report;
|
|
117
|
+
private deny;
|
|
118
|
+
private refresh;
|
|
119
|
+
/** Frozen member record, or undefined. */
|
|
120
|
+
member(pubkey: string): RoomMember | undefined;
|
|
121
|
+
/** May this key act on a connection authenticated as `principalId`? */
|
|
122
|
+
admit(pubkey: string, principalId: string): {
|
|
123
|
+
ok: true;
|
|
124
|
+
member: RoomMember;
|
|
125
|
+
} | {
|
|
126
|
+
ok: false;
|
|
127
|
+
reason: string;
|
|
128
|
+
};
|
|
129
|
+
access(pubkey: string, room: string): RoomAccessLevel | undefined;
|
|
130
|
+
canRead(pubkey: string, room: string): boolean;
|
|
131
|
+
canWrite(pubkey: string, room: string): boolean;
|
|
132
|
+
roomsFor(pubkey: string): Array<{
|
|
133
|
+
room: string;
|
|
134
|
+
access: RoomAccessLevel;
|
|
135
|
+
description?: string;
|
|
136
|
+
}>;
|
|
137
|
+
}
|
|
138
|
+
export {};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet rooms — membership and access policy.
|
|
3
|
+
*
|
|
4
|
+
* Buzz makes channel membership "the only gate", enforced by the relay before
|
|
5
|
+
* any read or write (`ARCHITECTURE.md` §7, `crates/buzz-relay/src/handlers/req.rs`).
|
|
6
|
+
* Here the hub operator declares members (public keys) and rooms in one file:
|
|
7
|
+
*
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "version": 1,
|
|
11
|
+
* "members": { "<pubkey hex>": { "name": "peer-alpha", "principals": ["key:abc"] } },
|
|
12
|
+
* "rooms": { "general": { "members": ["<pubkey hex>"], "readers": ["<pubkey hex>"] } }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* - `rooms.<id>.members` may read and write; `readers` may only read.
|
|
17
|
+
* - `principals` binds a key to WebSocket identities: when the field is ABSENT
|
|
18
|
+
* the key is accepted on any authenticated connection; when it is a list the
|
|
19
|
+
* connection principal must be in it; an EMPTY list refuses every connection.
|
|
20
|
+
*
|
|
21
|
+
* Fail-closed: a missing, unreadable or invalid file yields no member and no
|
|
22
|
+
* room. Refresh window: the file's `mtimeMs`/`ctimeMs`/size/inode are checked at
|
|
23
|
+
* most once per `reloadIntervalMs` (default 1000 ms), so a revocation applies
|
|
24
|
+
* to the first check after that window — including deliveries to subscriptions
|
|
25
|
+
* that are already open.
|
|
26
|
+
*
|
|
27
|
+
* @module fleet/rooms/room-access
|
|
28
|
+
*/
|
|
29
|
+
import fs from 'fs';
|
|
30
|
+
import { z } from 'zod';
|
|
31
|
+
import { getCodeBuddyPath } from '../../utils/codebuddy-home.js';
|
|
32
|
+
import { logger } from '../../utils/logger.js';
|
|
33
|
+
import { ROOM_ID_PATTERN } from './room-event.js';
|
|
34
|
+
export const MAX_ROOM_ACCESS_MEMBERS = 1_024;
|
|
35
|
+
export const MAX_ROOM_ACCESS_ROOMS = 1_024;
|
|
36
|
+
const MAX_CONFIG_BYTES = 1024 * 1024;
|
|
37
|
+
const pubkeySchema = z.string().regex(/^[0-9a-f]{64}$/);
|
|
38
|
+
const configSchema = z.object({
|
|
39
|
+
version: z.literal(1),
|
|
40
|
+
members: z.record(pubkeySchema, z.object({
|
|
41
|
+
name: z.string().min(1).max(64),
|
|
42
|
+
principals: z.array(z.string().min(1).max(256)).max(32).optional(),
|
|
43
|
+
}).strict()),
|
|
44
|
+
rooms: z.record(z.string().regex(ROOM_ID_PATTERN), z.object({
|
|
45
|
+
description: z.string().max(512).optional(),
|
|
46
|
+
members: z.array(pubkeySchema).max(MAX_ROOM_ACCESS_MEMBERS).default([]),
|
|
47
|
+
readers: z.array(pubkeySchema).max(MAX_ROOM_ACCESS_MEMBERS).default([]),
|
|
48
|
+
}).strict()),
|
|
49
|
+
}).strict();
|
|
50
|
+
const EMPTY_CONFIG = { members: new Map(), rooms: new Map() };
|
|
51
|
+
export function defaultRoomAccessPath() {
|
|
52
|
+
return process.env.CODEBUDDY_FLEET_ROOMS_CONFIG || getCodeBuddyPath('fleet', 'rooms.json');
|
|
53
|
+
}
|
|
54
|
+
/** Validate and compile a configuration object; throws a readable error. */
|
|
55
|
+
export function compileRoomAccessConfig(input) {
|
|
56
|
+
const parsed = configSchema.safeParse(input);
|
|
57
|
+
if (!parsed.success) {
|
|
58
|
+
const issue = parsed.error.issues[0];
|
|
59
|
+
throw new Error(`invalid rooms config at ${issue?.path.join('.') || '<root>'}: ${issue?.message ?? 'unknown'}`);
|
|
60
|
+
}
|
|
61
|
+
const memberEntries = Object.entries(parsed.data.members);
|
|
62
|
+
const roomEntries = Object.entries(parsed.data.rooms);
|
|
63
|
+
if (memberEntries.length > MAX_ROOM_ACCESS_MEMBERS) {
|
|
64
|
+
throw new Error(`invalid rooms config: more than ${MAX_ROOM_ACCESS_MEMBERS} members`);
|
|
65
|
+
}
|
|
66
|
+
if (roomEntries.length > MAX_ROOM_ACCESS_ROOMS) {
|
|
67
|
+
throw new Error(`invalid rooms config: more than ${MAX_ROOM_ACCESS_ROOMS} rooms`);
|
|
68
|
+
}
|
|
69
|
+
const members = new Map();
|
|
70
|
+
for (const [pubkey, member] of memberEntries) {
|
|
71
|
+
members.set(pubkey, Object.freeze({
|
|
72
|
+
pubkey,
|
|
73
|
+
name: member.name,
|
|
74
|
+
...(member.principals ? { principals: Object.freeze([...member.principals]) } : {}),
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
const rooms = new Map();
|
|
78
|
+
for (const [room, spec] of roomEntries) {
|
|
79
|
+
for (const pubkey of [...spec.members, ...spec.readers]) {
|
|
80
|
+
if (!members.has(pubkey)) {
|
|
81
|
+
throw new Error(`invalid rooms config: room ${room} lists an undeclared member ${pubkey.slice(0, 12)}…`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
rooms.set(room, {
|
|
85
|
+
...(spec.description ? { description: spec.description } : {}),
|
|
86
|
+
writers: new Set(spec.members),
|
|
87
|
+
readers: new Set([...spec.members, ...spec.readers]),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return { members, rooms };
|
|
91
|
+
}
|
|
92
|
+
export class RoomAccessPolicy {
|
|
93
|
+
path;
|
|
94
|
+
reloadIntervalMs;
|
|
95
|
+
compiled = EMPTY_CONFIG;
|
|
96
|
+
loadedStamp;
|
|
97
|
+
lastCheckMs = -Infinity;
|
|
98
|
+
lastProblem;
|
|
99
|
+
constructor(options = {}) {
|
|
100
|
+
const interval = options.reloadIntervalMs ?? 1_000;
|
|
101
|
+
if (typeof interval !== 'number' || !Number.isFinite(interval) || interval < 0) {
|
|
102
|
+
throw new RangeError('reloadIntervalMs must be a finite number >= 0');
|
|
103
|
+
}
|
|
104
|
+
this.reloadIntervalMs = interval;
|
|
105
|
+
if (options.config) {
|
|
106
|
+
this.compiled = compileRoomAccessConfig(options.config);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.path = options.path ?? defaultRoomAccessPath();
|
|
110
|
+
this.refresh(true);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
report(problem) {
|
|
114
|
+
if (problem && problem !== this.lastProblem) {
|
|
115
|
+
logger.warn(`[fleet-rooms] access policy denies everything: ${problem}`);
|
|
116
|
+
}
|
|
117
|
+
this.lastProblem = problem;
|
|
118
|
+
}
|
|
119
|
+
deny(problem) {
|
|
120
|
+
this.compiled = EMPTY_CONFIG;
|
|
121
|
+
this.report(problem);
|
|
122
|
+
}
|
|
123
|
+
refresh(force = false) {
|
|
124
|
+
if (!this.path)
|
|
125
|
+
return;
|
|
126
|
+
const now = Date.now();
|
|
127
|
+
if (!force && now - this.lastCheckMs < this.reloadIntervalMs)
|
|
128
|
+
return;
|
|
129
|
+
this.lastCheckMs = now;
|
|
130
|
+
let stat;
|
|
131
|
+
try {
|
|
132
|
+
stat = fs.statSync(this.path);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
this.loadedStamp = undefined;
|
|
136
|
+
this.deny(`no rooms config at ${this.path}`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const stamp = `${stat.mtimeMs}:${stat.ctimeMs}:${stat.size}:${stat.ino}`;
|
|
140
|
+
if (stamp === this.loadedStamp)
|
|
141
|
+
return;
|
|
142
|
+
this.loadedStamp = stamp;
|
|
143
|
+
if (stat.size > MAX_CONFIG_BYTES) {
|
|
144
|
+
this.deny(`rooms config larger than ${MAX_CONFIG_BYTES} bytes`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
this.compiled = compileRoomAccessConfig(JSON.parse(fs.readFileSync(this.path, 'utf8')));
|
|
149
|
+
this.report(undefined);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
this.deny(error instanceof Error ? error.message : String(error));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Frozen member record, or undefined. */
|
|
156
|
+
member(pubkey) {
|
|
157
|
+
this.refresh();
|
|
158
|
+
return this.compiled.members.get(pubkey);
|
|
159
|
+
}
|
|
160
|
+
/** May this key act on a connection authenticated as `principalId`? */
|
|
161
|
+
admit(pubkey, principalId) {
|
|
162
|
+
const member = this.member(pubkey);
|
|
163
|
+
if (!member)
|
|
164
|
+
return { ok: false, reason: 'restricted: key is not a declared room member' };
|
|
165
|
+
if (member.principals !== undefined && !member.principals.includes(principalId)) {
|
|
166
|
+
return { ok: false, reason: 'restricted: key is not bound to this connection identity' };
|
|
167
|
+
}
|
|
168
|
+
return { ok: true, member };
|
|
169
|
+
}
|
|
170
|
+
access(pubkey, room) {
|
|
171
|
+
this.refresh();
|
|
172
|
+
const spec = this.compiled.rooms.get(room);
|
|
173
|
+
if (!spec || !this.compiled.members.has(pubkey))
|
|
174
|
+
return undefined;
|
|
175
|
+
if (spec.writers.has(pubkey))
|
|
176
|
+
return 'write';
|
|
177
|
+
return spec.readers.has(pubkey) ? 'read' : undefined;
|
|
178
|
+
}
|
|
179
|
+
canRead(pubkey, room) {
|
|
180
|
+
return this.access(pubkey, room) !== undefined;
|
|
181
|
+
}
|
|
182
|
+
canWrite(pubkey, room) {
|
|
183
|
+
return this.access(pubkey, room) === 'write';
|
|
184
|
+
}
|
|
185
|
+
roomsFor(pubkey) {
|
|
186
|
+
this.refresh();
|
|
187
|
+
const result = [];
|
|
188
|
+
for (const [room, spec] of this.compiled.rooms) {
|
|
189
|
+
const access = this.access(pubkey, room);
|
|
190
|
+
if (access)
|
|
191
|
+
result.push({ room, access, ...(spec.description ? { description: spec.description } : {}) });
|
|
192
|
+
}
|
|
193
|
+
return result.sort((a, b) => a.room.localeCompare(b.room));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=room-access.js.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet rooms — member client.
|
|
3
|
+
*
|
|
4
|
+
* Reconnection follows the Buzz ACP harness (`crates/buzz-acp/src/relay.rs`):
|
|
5
|
+
* resubscribe after reconnect from a per-subscription cursor and drop events
|
|
6
|
+
* already seen with a two-generation id set (`TwoGenDedup`, 12 000 ids). The
|
|
7
|
+
* cursor is the hub `seq` (plus its `storeId`) instead of `created_at`, so
|
|
8
|
+
* member clock drift cannot open a hole.
|
|
9
|
+
*
|
|
10
|
+
* Everything received is untrusted data: signatures and room tags are checked
|
|
11
|
+
* again locally (the hub could be compromised), and `text` is the content
|
|
12
|
+
* passed through the fleet peer-text sanitizer. This client never runs a tool,
|
|
13
|
+
* a prompt or a command because of a message.
|
|
14
|
+
*
|
|
15
|
+
* @module fleet/rooms/room-client
|
|
16
|
+
*/
|
|
17
|
+
import { EventEmitter } from 'events';
|
|
18
|
+
import { type ReadonlyRoomEvent, type RoomEvent, type RoomMessageInput, type ThreadReference } from './room-event.js';
|
|
19
|
+
import { type RoomFilter } from './room-filter.js';
|
|
20
|
+
export interface FleetRoomClientOptions {
|
|
21
|
+
/** Hub WebSocket URL, e.g. `ws://127.0.0.1:3000/ws`. */
|
|
22
|
+
url: string;
|
|
23
|
+
apiKey?: string;
|
|
24
|
+
jwt?: string;
|
|
25
|
+
/** Member secret key (64 hex). Never logged or sent. */
|
|
26
|
+
secretKey: string;
|
|
27
|
+
/** Audience override for a hub reached through a proxy; defaults to `url`. */
|
|
28
|
+
audience?: string;
|
|
29
|
+
requestTimeoutMs?: number;
|
|
30
|
+
autoReconnect?: boolean;
|
|
31
|
+
reconnectInitialDelayMs?: number;
|
|
32
|
+
reconnectMaxDelayMs?: number;
|
|
33
|
+
/** Consecutive failed reconnection attempts before giving up. */
|
|
34
|
+
reconnectMaxAttempts?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface RoomCursor {
|
|
37
|
+
storeId: string;
|
|
38
|
+
throughSeq: number;
|
|
39
|
+
}
|
|
40
|
+
export interface RoomFetchOptions {
|
|
41
|
+
/** Maximum messages retained by this one-shot read (default 500, maximum 1000). */
|
|
42
|
+
maxMessages?: number;
|
|
43
|
+
/** Maximum approximate encoded result size (default and maximum 4 MiB). */
|
|
44
|
+
maxBytes?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ReceivedRoomMessage {
|
|
47
|
+
seq: number;
|
|
48
|
+
room: string;
|
|
49
|
+
author: string;
|
|
50
|
+
event: ReadonlyRoomEvent;
|
|
51
|
+
mentions: string[];
|
|
52
|
+
thread?: ThreadReference;
|
|
53
|
+
/** Content after the peer-text sanitizer; display it, never execute it. */
|
|
54
|
+
text: string;
|
|
55
|
+
}
|
|
56
|
+
export interface RoomEoseInfo {
|
|
57
|
+
storeId: string;
|
|
58
|
+
throughSeq: number;
|
|
59
|
+
gap: boolean;
|
|
60
|
+
epochChanged: boolean;
|
|
61
|
+
/** More replay records exist after `throughSeq`. */
|
|
62
|
+
truncated: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface RoomSubscriptionHandlers {
|
|
65
|
+
onMessage(message: ReceivedRoomMessage): void;
|
|
66
|
+
/** Stored events delivered; later messages are live. */
|
|
67
|
+
onEose?(info: RoomEoseInfo): void;
|
|
68
|
+
/** Terminal close (`restricted:`, `invalid:` …); the subscription is gone. */
|
|
69
|
+
onClosed?(message: string): void;
|
|
70
|
+
}
|
|
71
|
+
export interface RoomSubscriptionHandle {
|
|
72
|
+
readonly subId: string;
|
|
73
|
+
cursor(): RoomCursor | undefined;
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export declare class RoomClientError extends Error {
|
|
77
|
+
readonly code: string;
|
|
78
|
+
constructor(message: string, code: string);
|
|
79
|
+
}
|
|
80
|
+
interface RoomConnectionInfo {
|
|
81
|
+
pubkey: string;
|
|
82
|
+
name: string;
|
|
83
|
+
rooms: unknown[];
|
|
84
|
+
}
|
|
85
|
+
export declare class FleetRoomClient extends EventEmitter {
|
|
86
|
+
readonly pubkey: string;
|
|
87
|
+
readonly audience: string;
|
|
88
|
+
private readonly options;
|
|
89
|
+
private readonly requestTimeoutMs;
|
|
90
|
+
private readonly reconnectInitialDelayMs;
|
|
91
|
+
private readonly reconnectMaxDelayMs;
|
|
92
|
+
private readonly reconnectMaxAttempts;
|
|
93
|
+
private ws;
|
|
94
|
+
private ready;
|
|
95
|
+
private closing;
|
|
96
|
+
private everConnected;
|
|
97
|
+
private requestCounter;
|
|
98
|
+
private readonly pending;
|
|
99
|
+
private readonly subscriptions;
|
|
100
|
+
private readonly seen;
|
|
101
|
+
private reconnectTimer;
|
|
102
|
+
private reconnectAttempts;
|
|
103
|
+
private readyWaiters;
|
|
104
|
+
private opening;
|
|
105
|
+
private connectionInfo;
|
|
106
|
+
constructor(options: FleetRoomClientOptions);
|
|
107
|
+
get isReady(): boolean;
|
|
108
|
+
/** Connect, authenticate the WebSocket, then prove the member key. */
|
|
109
|
+
connect(): Promise<RoomConnectionInfo>;
|
|
110
|
+
private startOpen;
|
|
111
|
+
private open;
|
|
112
|
+
private proveIdentity;
|
|
113
|
+
private sendRaw;
|
|
114
|
+
private request;
|
|
115
|
+
private handleMessage;
|
|
116
|
+
private onEvent;
|
|
117
|
+
private onEose;
|
|
118
|
+
private onClosed;
|
|
119
|
+
private closeSubscriptionLocally;
|
|
120
|
+
private callHandler;
|
|
121
|
+
private sendSubscribe;
|
|
122
|
+
private waitUntilReady;
|
|
123
|
+
/**
|
|
124
|
+
* Sign and publish. Resolves once the hub has durably stored the message
|
|
125
|
+
* (or already had it). A connection lost before the acknowledgement is
|
|
126
|
+
* retried once with the SAME signed event, which the hub deduplicates.
|
|
127
|
+
*/
|
|
128
|
+
publish(input: RoomMessageInput): Promise<{
|
|
129
|
+
id: string;
|
|
130
|
+
seq: number;
|
|
131
|
+
duplicate: boolean;
|
|
132
|
+
storeId: string;
|
|
133
|
+
}>;
|
|
134
|
+
publishSigned(event: RoomEvent): Promise<{
|
|
135
|
+
id: string;
|
|
136
|
+
seq: number;
|
|
137
|
+
duplicate: boolean;
|
|
138
|
+
storeId: string;
|
|
139
|
+
}>;
|
|
140
|
+
/** Open a subscription; it survives reconnections until closed. */
|
|
141
|
+
subscribe(subId: string, filters: RoomFilter[], handlers: RoomSubscriptionHandlers, cursor?: RoomCursor): RoomSubscriptionHandle;
|
|
142
|
+
private openSubscription;
|
|
143
|
+
/**
|
|
144
|
+
* One-shot read: stored messages matching `filters` (or after `cursor`),
|
|
145
|
+
* returned with the cursor to resume from next time.
|
|
146
|
+
*/
|
|
147
|
+
fetch(filters: RoomFilter[], cursor?: RoomCursor, options?: RoomFetchOptions): Promise<{
|
|
148
|
+
messages: ReceivedRoomMessage[];
|
|
149
|
+
cursor: RoomCursor;
|
|
150
|
+
gap: boolean;
|
|
151
|
+
epochChanged: boolean;
|
|
152
|
+
truncated: boolean;
|
|
153
|
+
}>;
|
|
154
|
+
private onSocketClosed;
|
|
155
|
+
private scheduleReconnect;
|
|
156
|
+
close(): Promise<void>;
|
|
157
|
+
}
|
|
158
|
+
export {};
|