botmux 2.46.1 → 2.47.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.en.md +5 -10
- package/README.md +5 -10
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +0 -11
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +9 -36
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +1 -26
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +1 -6
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +12 -58
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +1 -5
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -19
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +1 -5
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +2 -22
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +1 -2
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +2 -35
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +0 -59
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +0 -67
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +0 -8
- package/dist/cli/bots-list-output.d.ts.map +1 -1
- package/dist/cli/bots-list-output.js +0 -9
- package/dist/cli/bots-list-output.js.map +1 -1
- package/dist/cli.d.ts +1 -15
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +106 -603
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -17
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +0 -20
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +313 -762
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +0 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +2 -222
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/role-resolver.d.ts +1 -17
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +10 -64
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +5 -19
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -37
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +0 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +0 -141
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +24 -543
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +58 -213
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +1 -6
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +1 -9
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/web/app.js +0 -8
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +21 -205
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +5 -43
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +0 -4
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/workflows.js +3 -3
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard/workflow-api.d.ts +1 -8
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +4 -19
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard-web/app.js +375 -539
- package/dist/dashboard-web/index.html +1 -3
- package/dist/dashboard-web/style.css +0 -22
- package/dist/dashboard.js +2 -199
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +11 -104
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +11 -104
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +3 -108
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +50 -480
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +18 -241
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +0 -83
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +70 -286
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +4 -29
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +1 -2
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +2 -3
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +3 -3
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +2 -20
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +17 -49
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +31 -87
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/workflow-card-handler.d.ts +2 -2
- package/dist/im/lark/workflow-card-handler.d.ts.map +1 -1
- package/dist/im/lark/workflow-card-handler.js +1 -12
- package/dist/im/lark/workflow-card-handler.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts.map +1 -1
- package/dist/im/lark/workflow-progress-card.js +0 -53
- package/dist/im/lark/workflow-progress-card.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +0 -1
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +0 -23
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +0 -1
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/feishu-task-client.d.ts +28 -0
- package/dist/services/feishu-task-client.d.ts.map +1 -0
- package/dist/services/feishu-task-client.js +123 -0
- package/dist/services/feishu-task-client.js.map +1 -0
- package/dist/services/grant-store.d.ts +2 -12
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +4 -51
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/group-creator.d.ts +0 -10
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +1 -26
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/groups-store.d.ts +0 -30
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +12 -85
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts +0 -10
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +0 -11
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/session-store.js +1 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/task-store.d.ts +37 -0
- package/dist/services/task-store.d.ts.map +1 -0
- package/dist/services/task-store.js +115 -0
- package/dist/services/task-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +1 -8
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -20
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-tmux.d.ts +22 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +1 -25
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +1 -15
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts +0 -2
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +12 -178
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +0 -34
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +2 -119
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +0 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +0 -50
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +0 -83
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +2 -0
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +27 -198
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +2 -2
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +9 -412
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +3 -238
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +11 -114
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +0 -46
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/replay.d.ts +0 -21
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +0 -103
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +1017 -1712
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +1 -37
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/events/types.d.ts +1 -5
- package/dist/workflows/events/types.d.ts.map +1 -1
- package/dist/workflows/loader.d.ts +0 -14
- package/dist/workflows/loader.d.ts.map +1 -1
- package/dist/workflows/loader.js +0 -27
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loop.js +0 -58
- package/dist/workflows/loop.js.map +1 -1
- package/dist/workflows/ops-projection.d.ts +0 -58
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +0 -74
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/orchestrator.d.ts +1 -65
- package/dist/workflows/orchestrator.d.ts.map +1 -1
- package/dist/workflows/orchestrator.js +74 -486
- package/dist/workflows/orchestrator.js.map +1 -1
- package/dist/workflows/output-binding.d.ts +1 -8
- package/dist/workflows/output-binding.d.ts.map +1 -1
- package/dist/workflows/output-binding.js +11 -75
- package/dist/workflows/output-binding.js.map +1 -1
- package/dist/workflows/runtime.d.ts +1 -1
- package/dist/workflows/runtime.d.ts.map +1 -1
- package/dist/workflows/runtime.js +4 -39
- package/dist/workflows/runtime.js.map +1 -1
- package/dist/workflows/wait.d.ts +2 -23
- package/dist/workflows/wait.d.ts.map +1 -1
- package/dist/workflows/wait.js +17 -39
- package/dist/workflows/wait.js.map +1 -1
- package/package.json +1 -1
- package/dist/adapters/adopt-route.d.ts +0 -63
- package/dist/adapters/adopt-route.d.ts.map +0 -1
- package/dist/adapters/adopt-route.js +0 -195
- package/dist/adapters/adopt-route.js.map +0 -1
- package/dist/adapters/cli/codex-app.d.ts +0 -4
- package/dist/adapters/cli/codex-app.d.ts.map +0 -1
- package/dist/adapters/cli/codex-app.js +0 -72
- package/dist/adapters/cli/codex-app.js.map +0 -1
- package/dist/adapters/cli/hermes.d.ts +0 -4
- package/dist/adapters/cli/hermes.d.ts.map +0 -1
- package/dist/adapters/cli/hermes.js +0 -40
- package/dist/adapters/cli/hermes.js.map +0 -1
- package/dist/adapters/cli/mira.d.ts +0 -4
- package/dist/adapters/cli/mira.d.ts.map +0 -1
- package/dist/adapters/cli/mira.js +0 -67
- package/dist/adapters/cli/mira.js.map +0 -1
- package/dist/adapters/cli/mtr.d.ts +0 -5
- package/dist/adapters/cli/mtr.d.ts.map +0 -1
- package/dist/adapters/cli/mtr.js +0 -62
- package/dist/adapters/cli/mtr.js.map +0 -1
- package/dist/adapters/hook-command.d.ts +0 -18
- package/dist/adapters/hook-command.d.ts.map +0 -1
- package/dist/adapters/hook-command.js +0 -38
- package/dist/adapters/hook-command.js.map +0 -1
- package/dist/adapters/hook-installer.d.ts +0 -14
- package/dist/adapters/hook-installer.d.ts.map +0 -1
- package/dist/adapters/hook-installer.js +0 -192
- package/dist/adapters/hook-installer.js.map +0 -1
- package/dist/codex-app-runner.d.ts +0 -3
- package/dist/codex-app-runner.d.ts.map +0 -1
- package/dist/codex-app-runner.js +0 -512
- package/dist/codex-app-runner.js.map +0 -1
- package/dist/core/ask-api.d.ts +0 -47
- package/dist/core/ask-api.d.ts.map +0 -1
- package/dist/core/ask-api.js +0 -139
- package/dist/core/ask-api.js.map +0 -1
- package/dist/core/ask-args.d.ts +0 -53
- package/dist/core/ask-args.d.ts.map +0 -1
- package/dist/core/ask-args.js +0 -122
- package/dist/core/ask-args.js.map +0 -1
- package/dist/core/ask-broker.d.ts +0 -98
- package/dist/core/ask-broker.d.ts.map +0 -1
- package/dist/core/ask-broker.js +0 -329
- package/dist/core/ask-broker.js.map +0 -1
- package/dist/core/ask-hook/claude-code.d.ts +0 -50
- package/dist/core/ask-hook/claude-code.d.ts.map +0 -1
- package/dist/core/ask-hook/claude-code.js +0 -145
- package/dist/core/ask-hook/claude-code.js.map +0 -1
- package/dist/core/ask-hook/codex.d.ts +0 -43
- package/dist/core/ask-hook/codex.d.ts.map +0 -1
- package/dist/core/ask-hook/codex.js +0 -69
- package/dist/core/ask-hook/codex.js.map +0 -1
- package/dist/core/ask-hook/opencode.d.ts +0 -41
- package/dist/core/ask-hook/opencode.d.ts.map +0 -1
- package/dist/core/ask-hook/opencode.js +0 -108
- package/dist/core/ask-hook/opencode.js.map +0 -1
- package/dist/core/ask-hook/registry.d.ts +0 -3
- package/dist/core/ask-hook/registry.d.ts.map +0 -1
- package/dist/core/ask-hook/registry.js +0 -12
- package/dist/core/ask-hook/registry.js.map +0 -1
- package/dist/core/ask-hook/types.d.ts +0 -26
- package/dist/core/ask-hook/types.d.ts.map +0 -1
- package/dist/core/ask-hook/types.js +0 -2
- package/dist/core/ask-hook/types.js.map +0 -1
- package/dist/core/ask-types.d.ts +0 -146
- package/dist/core/ask-types.d.ts.map +0 -1
- package/dist/core/ask-types.js +0 -18
- package/dist/core/ask-types.js.map +0 -1
- package/dist/core/trigger-session.d.ts +0 -9
- package/dist/core/trigger-session.d.ts.map +0 -1
- package/dist/core/trigger-session.js +0 -158
- package/dist/core/trigger-session.js.map +0 -1
- package/dist/dashboard/connector-api.d.ts +0 -3
- package/dist/dashboard/connector-api.d.ts.map +0 -1
- package/dist/dashboard/connector-api.js +0 -351
- package/dist/dashboard/connector-api.js.map +0 -1
- package/dist/dashboard/federated-group-core.d.ts +0 -54
- package/dist/dashboard/federated-group-core.d.ts.map +0 -1
- package/dist/dashboard/federated-group-core.js +0 -165
- package/dist/dashboard/federated-group-core.js.map +0 -1
- package/dist/dashboard/federation-api.d.ts +0 -42
- package/dist/dashboard/federation-api.d.ts.map +0 -1
- package/dist/dashboard/federation-api.js +0 -408
- package/dist/dashboard/federation-api.js.map +0 -1
- package/dist/dashboard/federation-spoke-api.d.ts +0 -76
- package/dist/dashboard/federation-spoke-api.d.ts.map +0 -1
- package/dist/dashboard/federation-spoke-api.js +0 -618
- package/dist/dashboard/federation-spoke-api.js.map +0 -1
- package/dist/dashboard/team-group.d.ts +0 -18
- package/dist/dashboard/team-group.d.ts.map +0 -1
- package/dist/dashboard/team-group.js +0 -7
- package/dist/dashboard/team-group.js.map +0 -1
- package/dist/dashboard/trigger-api.d.ts +0 -13
- package/dist/dashboard/trigger-api.d.ts.map +0 -1
- package/dist/dashboard/trigger-api.js +0 -77
- package/dist/dashboard/trigger-api.js.map +0 -1
- package/dist/dashboard/web/connectors.d.ts +0 -2
- package/dist/dashboard/web/connectors.d.ts.map +0 -1
- package/dist/dashboard/web/connectors.js +0 -187
- package/dist/dashboard/web/connectors.js.map +0 -1
- package/dist/dashboard/web/team-federation.d.ts +0 -3
- package/dist/dashboard/web/team-federation.d.ts.map +0 -1
- package/dist/dashboard/web/team-federation.js +0 -487
- package/dist/dashboard/web/team-federation.js.map +0 -1
- package/dist/dashboard/webhook-routes.d.ts +0 -19
- package/dist/dashboard/webhook-routes.d.ts.map +0 -1
- package/dist/dashboard/webhook-routes.js +0 -321
- package/dist/dashboard/webhook-routes.js.map +0 -1
- package/dist/im/lark/ask-card.d.ts +0 -55
- package/dist/im/lark/ask-card.d.ts.map +0 -1
- package/dist/im/lark/ask-card.js +0 -328
- package/dist/im/lark/ask-card.js.map +0 -1
- package/dist/mira-output.d.ts +0 -3
- package/dist/mira-output.d.ts.map +0 -1
- package/dist/mira-output.js +0 -136
- package/dist/mira-output.js.map +0 -1
- package/dist/mira-runner.d.ts +0 -3
- package/dist/mira-runner.d.ts.map +0 -1
- package/dist/mira-runner.js +0 -534
- package/dist/mira-runner.js.map +0 -1
- package/dist/services/bot-owner-store.d.ts +0 -28
- package/dist/services/bot-owner-store.d.ts.map +0 -1
- package/dist/services/bot-owner-store.js +0 -82
- package/dist/services/bot-owner-store.js.map +0 -1
- package/dist/services/bot-profile-store.d.ts +0 -16
- package/dist/services/bot-profile-store.d.ts.map +0 -1
- package/dist/services/bot-profile-store.js +0 -98
- package/dist/services/bot-profile-store.js.map +0 -1
- package/dist/services/brand-store.d.ts +0 -15
- package/dist/services/brand-store.d.ts.map +0 -1
- package/dist/services/brand-store.js +0 -47
- package/dist/services/brand-store.js.map +0 -1
- package/dist/services/card-prefs-store.d.ts +0 -20
- package/dist/services/card-prefs-store.d.ts.map +0 -1
- package/dist/services/card-prefs-store.js +0 -82
- package/dist/services/card-prefs-store.js.map +0 -1
- package/dist/services/connector-store.d.ts +0 -58
- package/dist/services/connector-store.d.ts.map +0 -1
- package/dist/services/connector-store.js +0 -79
- package/dist/services/connector-store.js.map +0 -1
- package/dist/services/deployment-identity.d.ts +0 -22
- package/dist/services/deployment-identity.d.ts.map +0 -1
- package/dist/services/deployment-identity.js +0 -67
- package/dist/services/deployment-identity.js.map +0 -1
- package/dist/services/federation-membership-store.d.ts +0 -23
- package/dist/services/federation-membership-store.d.ts.map +0 -1
- package/dist/services/federation-membership-store.js +0 -66
- package/dist/services/federation-membership-store.js.map +0 -1
- package/dist/services/federation-roster.d.ts +0 -54
- package/dist/services/federation-roster.d.ts.map +0 -1
- package/dist/services/federation-roster.js +0 -51
- package/dist/services/federation-roster.js.map +0 -1
- package/dist/services/federation-store.d.ts +0 -76
- package/dist/services/federation-store.d.ts.map +0 -1
- package/dist/services/federation-store.js +0 -133
- package/dist/services/federation-store.js.map +0 -1
- package/dist/services/hermes-transcript.d.ts +0 -7
- package/dist/services/hermes-transcript.d.ts.map +0 -1
- package/dist/services/hermes-transcript.js +0 -117
- package/dist/services/hermes-transcript.js.map +0 -1
- package/dist/services/invite-store.d.ts +0 -28
- package/dist/services/invite-store.d.ts.map +0 -1
- package/dist/services/invite-store.js +0 -85
- package/dist/services/invite-store.js.map +0 -1
- package/dist/services/pairing-store.d.ts +0 -47
- package/dist/services/pairing-store.d.ts.map +0 -1
- package/dist/services/pairing-store.js +0 -132
- package/dist/services/pairing-store.js.map +0 -1
- package/dist/services/relay-picker.d.ts +0 -22
- package/dist/services/relay-picker.d.ts.map +0 -1
- package/dist/services/relay-picker.js +0 -62
- package/dist/services/relay-picker.js.map +0 -1
- package/dist/services/send-policy.d.ts +0 -55
- package/dist/services/send-policy.d.ts.map +0 -1
- package/dist/services/send-policy.js +0 -47
- package/dist/services/send-policy.js.map +0 -1
- package/dist/services/team-roster.d.ts +0 -38
- package/dist/services/team-roster.d.ts.map +0 -1
- package/dist/services/team-roster.js +0 -82
- package/dist/services/team-roster.js.map +0 -1
- package/dist/services/team-store.d.ts +0 -54
- package/dist/services/team-store.d.ts.map +0 -1
- package/dist/services/team-store.js +0 -156
- package/dist/services/team-store.js.map +0 -1
- package/dist/services/trigger-log-store.d.ts +0 -46
- package/dist/services/trigger-log-store.d.ts.map +0 -1
- package/dist/services/trigger-log-store.js +0 -132
- package/dist/services/trigger-log-store.js.map +0 -1
- package/dist/services/trigger-types.d.ts +0 -57
- package/dist/services/trigger-types.d.ts.map +0 -1
- package/dist/services/trigger-types.js +0 -28
- package/dist/services/trigger-types.js.map +0 -1
- package/dist/services/webhook-key.d.ts +0 -16
- package/dist/services/webhook-key.d.ts.map +0 -1
- package/dist/services/webhook-key.js +0 -123
- package/dist/services/webhook-key.js.map +0 -1
- package/dist/services/webhook-lifecycle-extractors.d.ts +0 -15
- package/dist/services/webhook-lifecycle-extractors.d.ts.map +0 -1
- package/dist/services/webhook-lifecycle-extractors.js +0 -59
- package/dist/services/webhook-lifecycle-extractors.js.map +0 -1
- package/dist/services/webhook-lifecycle-store.d.ts +0 -45
- package/dist/services/webhook-lifecycle-store.d.ts.map +0 -1
- package/dist/services/webhook-lifecycle-store.js +0 -159
- package/dist/services/webhook-lifecycle-store.js.map +0 -1
- package/dist/utils/daemon-discovery.d.ts +0 -11
- package/dist/utils/daemon-discovery.d.ts.map +0 -1
- package/dist/utils/daemon-discovery.js +0 -59
- package/dist/utils/daemon-discovery.js.map +0 -1
- package/dist/workflows/trigger-from-envelope.d.ts +0 -13
- package/dist/workflows/trigger-from-envelope.d.ts.map +0 -1
- package/dist/workflows/trigger-from-envelope.js +0 -67
- package/dist/workflows/trigger-from-envelope.js.map +0 -1
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Federation membership store (SPOKE side): which remote teams THIS deployment
|
|
3
|
-
* has joined, and the syncToken/hub needed to push bots + pull the shared roster.
|
|
4
|
-
*
|
|
5
|
-
* Storage: `{dataDir}/federation-memberships.json`, atomic writes. Keyed by
|
|
6
|
-
* `${hubUrl}::${teamId}` so a deployment can join multiple teams / hubs.
|
|
7
|
-
*/
|
|
8
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
|
|
9
|
-
import { join } from 'node:path';
|
|
10
|
-
import { randomUUID } from 'node:crypto';
|
|
11
|
-
function filePath(dataDir) {
|
|
12
|
-
return join(dataDir, 'federation-memberships.json');
|
|
13
|
-
}
|
|
14
|
-
function keyOf(hubUrl, teamId) {
|
|
15
|
-
return `${hubUrl}::${teamId}`;
|
|
16
|
-
}
|
|
17
|
-
function readFile(dataDir) {
|
|
18
|
-
const fp = filePath(dataDir);
|
|
19
|
-
if (!existsSync(fp))
|
|
20
|
-
return {};
|
|
21
|
-
try {
|
|
22
|
-
const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
|
|
23
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
24
|
-
return parsed;
|
|
25
|
-
}
|
|
26
|
-
catch { /* corrupt */ }
|
|
27
|
-
return {};
|
|
28
|
-
}
|
|
29
|
-
function writeFileAtomic(dataDir, data) {
|
|
30
|
-
if (!existsSync(dataDir))
|
|
31
|
-
mkdirSync(dataDir, { recursive: true });
|
|
32
|
-
const fp = filePath(dataDir);
|
|
33
|
-
const tmp = `${fp}.${process.pid}.${randomUUID()}.tmp`;
|
|
34
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
35
|
-
renameSync(tmp, fp);
|
|
36
|
-
}
|
|
37
|
-
/** Record (or replace) a remote-team membership. */
|
|
38
|
-
export function addMembership(dataDir, m, now = Date.now()) {
|
|
39
|
-
const data = readFile(dataDir);
|
|
40
|
-
const full = { ...m, joinedAt: m.joinedAt ?? now };
|
|
41
|
-
data[keyOf(m.hubUrl, m.teamId)] = full;
|
|
42
|
-
writeFileAtomic(dataDir, data);
|
|
43
|
-
return full;
|
|
44
|
-
}
|
|
45
|
-
/** All remote teams this deployment has joined. */
|
|
46
|
-
export function listMemberships(dataDir) {
|
|
47
|
-
return Object.values(readFile(dataDir));
|
|
48
|
-
}
|
|
49
|
-
/** Find the membership whose delegationToken matches (verifies an incoming
|
|
50
|
-
* hub→spoke delegate call came from a hub this deployment actually joined). */
|
|
51
|
-
export function findMembershipByDelegationToken(dataDir, token) {
|
|
52
|
-
if (!token)
|
|
53
|
-
return null;
|
|
54
|
-
return Object.values(readFile(dataDir)).find(m => m.delegationToken === token) ?? null;
|
|
55
|
-
}
|
|
56
|
-
/** Remove one membership. Returns true if removed. */
|
|
57
|
-
export function removeMembership(dataDir, hubUrl, teamId) {
|
|
58
|
-
const data = readFile(dataDir);
|
|
59
|
-
const key = keyOf(hubUrl, teamId);
|
|
60
|
-
if (!data[key])
|
|
61
|
-
return false;
|
|
62
|
-
delete data[key];
|
|
63
|
-
writeFileAtomic(dataDir, data);
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=federation-membership-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federation-membership-store.js","sourceRoot":"","sources":["../../src/services/federation-membership-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Aggregated cross-deployment roster (HUB side): the hub's own local bots
|
|
3
|
-
* ([[team-roster]]) merged with every member deployment's advertised bots
|
|
4
|
-
* ([[federation-store]]), each tagged with the deployment it belongs to so the
|
|
5
|
-
* UI can group by deployment (local first, then remote by name).
|
|
6
|
-
*
|
|
7
|
-
* Pure read from `{dataDir}` files — testable, no Lark API.
|
|
8
|
-
*/
|
|
9
|
-
import { type LiveBot } from './team-roster.js';
|
|
10
|
-
/** A federated deployment is considered stale (likely offline) if it hasn't
|
|
11
|
-
* synced within this window — its bots are flagged so the UI can de-emphasize them. */
|
|
12
|
-
export declare const FEDERATION_STALE_MS: number;
|
|
13
|
-
export interface AggregatedRosterBot {
|
|
14
|
-
larkAppId: string;
|
|
15
|
-
name: string;
|
|
16
|
-
cliId: string;
|
|
17
|
-
capability: string | null;
|
|
18
|
-
hasTeamRole: boolean;
|
|
19
|
-
/** Tenant-stable bot id (kept now so P2 拉群 by union_id needs no schema change). */
|
|
20
|
-
botUnionId?: string;
|
|
21
|
-
/** Owner (person) of this bot — union_id is tenant-stable, used to pull the
|
|
22
|
-
* owner into a federated group regardless of app scope. */
|
|
23
|
-
owner?: {
|
|
24
|
-
unionId?: string;
|
|
25
|
-
name?: string;
|
|
26
|
-
};
|
|
27
|
-
deployment: {
|
|
28
|
-
id: string;
|
|
29
|
-
name: string;
|
|
30
|
-
local: boolean;
|
|
31
|
-
stale: boolean;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export interface AggregatedDeployment {
|
|
35
|
-
id: string;
|
|
36
|
-
name: string;
|
|
37
|
-
local: boolean;
|
|
38
|
-
botCount: number;
|
|
39
|
-
lastSeenAt?: number;
|
|
40
|
-
/** true when a remote deployment hasn't synced within FEDERATION_STALE_MS. */
|
|
41
|
-
stale: boolean;
|
|
42
|
-
}
|
|
43
|
-
export interface AggregatedRoster {
|
|
44
|
-
team: {
|
|
45
|
-
id: string;
|
|
46
|
-
name: string;
|
|
47
|
-
memberCount: number;
|
|
48
|
-
};
|
|
49
|
-
deployments: AggregatedDeployment[];
|
|
50
|
-
bots: AggregatedRosterBot[];
|
|
51
|
-
}
|
|
52
|
-
/** Hub's local bots + all member deployments' bots, tagged + grouped by deployment. */
|
|
53
|
-
export declare function buildFederatedRoster(dataDir: string, teamId?: string, configOrder?: string[], now?: number, liveBots?: LiveBot[]): AggregatedRoster;
|
|
54
|
-
//# sourceMappingURL=federation-roster.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federation-roster.d.ts","sourceRoot":"","sources":["../../src/services/federation-roster.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAKjE;wFACwF;AACxF,eAAO,MAAM,mBAAmB,QAAgB,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;gEAC4D;IAC5D,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1E;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,IAAI,EAAE,mBAAmB,EAAE,CAAC;CAC7B;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAwB,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAmB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAoChL"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Aggregated cross-deployment roster (HUB side): the hub's own local bots
|
|
3
|
-
* ([[team-roster]]) merged with every member deployment's advertised bots
|
|
4
|
-
* ([[federation-store]]), each tagged with the deployment it belongs to so the
|
|
5
|
-
* UI can group by deployment (local first, then remote by name).
|
|
6
|
-
*
|
|
7
|
-
* Pure read from `{dataDir}` files — testable, no Lark API.
|
|
8
|
-
*/
|
|
9
|
-
import { buildTeamRoster } from './team-roster.js';
|
|
10
|
-
import { listFederatedDeployments } from './federation-store.js';
|
|
11
|
-
import { getDeploymentIdentity } from './deployment-identity.js';
|
|
12
|
-
import { getTeam, getDefaultTeam, DEFAULT_TEAM_ID } from './team-store.js';
|
|
13
|
-
/** A federated deployment is considered stale (likely offline) if it hasn't
|
|
14
|
-
* synced within this window — its bots are flagged so the UI can de-emphasize them. */
|
|
15
|
-
export const FEDERATION_STALE_MS = 5 * 60 * 1000;
|
|
16
|
-
/** Hub's local bots + all member deployments' bots, tagged + grouped by deployment. */
|
|
17
|
-
export function buildFederatedRoster(dataDir, teamId = DEFAULT_TEAM_ID, configOrder, now = Date.now(), liveBots) {
|
|
18
|
-
const team = getTeam(dataDir, teamId) ?? getDefaultTeam(dataDir);
|
|
19
|
-
const localId = getDeploymentIdentity(dataDir);
|
|
20
|
-
const local = buildTeamRoster(dataDir, teamId, configOrder, liveBots);
|
|
21
|
-
const deployments = [
|
|
22
|
-
{ id: localId.deploymentId, name: localId.name, local: true, botCount: local.bots.length, stale: false },
|
|
23
|
-
];
|
|
24
|
-
const bots = local.bots.map(b => ({
|
|
25
|
-
larkAppId: b.larkAppId,
|
|
26
|
-
name: b.name,
|
|
27
|
-
cliId: b.cliId,
|
|
28
|
-
capability: b.capability,
|
|
29
|
-
hasTeamRole: b.hasTeamRole,
|
|
30
|
-
owner: b.owner ? { unionId: b.owner.unionId, name: b.owner.name } : undefined,
|
|
31
|
-
deployment: { id: localId.deploymentId, name: localId.name, local: true, stale: false },
|
|
32
|
-
}));
|
|
33
|
-
for (const dep of listFederatedDeployments(dataDir, teamId)) {
|
|
34
|
-
const stale = now - dep.lastSeenAt > FEDERATION_STALE_MS;
|
|
35
|
-
deployments.push({ id: dep.deploymentId, name: dep.name, local: false, botCount: dep.bots.length, lastSeenAt: dep.lastSeenAt, stale });
|
|
36
|
-
for (const b of dep.bots) {
|
|
37
|
-
bots.push({
|
|
38
|
-
larkAppId: b.larkAppId,
|
|
39
|
-
name: b.botName,
|
|
40
|
-
cliId: b.cliId,
|
|
41
|
-
capability: b.capability ?? null,
|
|
42
|
-
hasTeamRole: !!b.hasTeamRole,
|
|
43
|
-
botUnionId: b.botUnionId,
|
|
44
|
-
owner: (b.ownerUnionId || b.ownerName) ? { unionId: b.ownerUnionId, name: b.ownerName } : undefined,
|
|
45
|
-
deployment: { id: dep.deploymentId, name: dep.name, local: false, stale },
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return { team: { id: team.id, name: team.name, memberCount: team.members.length }, deployments, bots };
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=federation-roster.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federation-roster.js","sourceRoot":"","sources":["../../src/services/federation-roster.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export interface FederatedBot {
|
|
2
|
-
larkAppId: string;
|
|
3
|
-
botName: string;
|
|
4
|
-
cliId: string;
|
|
5
|
-
/** Tenant-stable bot id (used by P2 拉群 to add the bot cross-app). */
|
|
6
|
-
botUnionId?: string;
|
|
7
|
-
capability?: string | null;
|
|
8
|
-
hasTeamRole?: boolean;
|
|
9
|
-
/** Owner (the person) of this bot, tenant-stable union_id — so 拉群 can pull
|
|
10
|
-
* the owner into the group by union_id (open_id is app-scoped, union_id not). */
|
|
11
|
-
ownerUnionId?: string;
|
|
12
|
-
ownerName?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface FederatedDeployment {
|
|
15
|
-
deploymentId: string;
|
|
16
|
-
name: string;
|
|
17
|
-
syncToken: string;
|
|
18
|
-
bots: FederatedBot[];
|
|
19
|
-
joinedAt: number;
|
|
20
|
-
lastSeenAt: number;
|
|
21
|
-
/** The spoke deployment's OWNER (the person), tenant-stable union_id. Hub uses
|
|
22
|
-
* this — derived from syncToken — as the trusted operator identity when this
|
|
23
|
-
* spoke initiates 拉群 (so the operator is pulled into the group). */
|
|
24
|
-
ownerUnionId?: string;
|
|
25
|
-
ownerName?: string;
|
|
26
|
-
/** Spoke's dashboard base URL — so this hub can call back to delegate 拉群
|
|
27
|
-
* (hub→spoke) when no local online bot can be the group creator. */
|
|
28
|
-
callbackUrl?: string;
|
|
29
|
-
/** Token the SPOKE issued to THIS hub at join; the hub presents it on
|
|
30
|
-
* delegate calls so the spoke can verify the request is from its hub. */
|
|
31
|
-
delegationToken?: string;
|
|
32
|
-
}
|
|
33
|
-
export interface RegisterInput {
|
|
34
|
-
deploymentId: string;
|
|
35
|
-
name: string;
|
|
36
|
-
bots: FederatedBot[];
|
|
37
|
-
ownerUnionId?: string;
|
|
38
|
-
ownerName?: string;
|
|
39
|
-
callbackUrl?: string;
|
|
40
|
-
delegationToken?: string;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Register a NEW remote deployment under a team and issue a fresh syncToken.
|
|
44
|
-
*
|
|
45
|
-
* NOT idempotent on purpose: `deploymentId` is public (it appears in the roster),
|
|
46
|
-
* so re-registering an existing id must NOT hand back its long-lived syncToken —
|
|
47
|
-
* otherwise anyone with an invite could claim another deployment's token by
|
|
48
|
-
* guessing its id. A duplicate returns `{ created: false }` with NO token; the
|
|
49
|
-
* caller surfaces `deployment_already_joined`. Ongoing bot refresh is via
|
|
50
|
-
* `syncDeployment` (syncToken), not this. Re-binding/rotation is a future
|
|
51
|
-
* explicit reset proving the old syncToken.
|
|
52
|
-
*/
|
|
53
|
-
export declare function registerDeployment(dataDir: string, teamId: string, input: RegisterInput, now?: number): {
|
|
54
|
-
syncToken: string;
|
|
55
|
-
created: boolean;
|
|
56
|
-
};
|
|
57
|
-
/** Resolve a syncToken to its {teamId, deployment}, or null. */
|
|
58
|
-
export declare function getDeploymentByToken(dataDir: string, syncToken: string): {
|
|
59
|
-
teamId: string;
|
|
60
|
-
deployment: FederatedDeployment;
|
|
61
|
-
} | null;
|
|
62
|
-
/** Refresh a deployment's advertised bots + heartbeat, by syncToken. Returns true if found. */
|
|
63
|
-
export declare function syncDeployment(dataDir: string, syncToken: string, bots: FederatedBot[], owner?: {
|
|
64
|
-
ownerUnionId?: string;
|
|
65
|
-
ownerName?: string;
|
|
66
|
-
name?: string;
|
|
67
|
-
}, now?: number): boolean;
|
|
68
|
-
/** Member deployments of a team (empty if none). */
|
|
69
|
-
export declare function listFederatedDeployments(dataDir: string, teamId: string): FederatedDeployment[];
|
|
70
|
-
/** Remove a deployment from a team (leave/kick). Returns true if removed. */
|
|
71
|
-
export declare function removeDeployment(dataDir: string, teamId: string, deploymentId: string): boolean;
|
|
72
|
-
/** Remove the deployment owning a syncToken (spoke-initiated leave/revoke). Returns true if removed. */
|
|
73
|
-
export declare function removeDeploymentByToken(dataDir: string, syncToken: string): boolean;
|
|
74
|
-
/** Drop all federation records for a team (e.g. when the team is deleted). */
|
|
75
|
-
export declare function removeTeamFederation(dataDir: string, teamId: string): void;
|
|
76
|
-
//# sourceMappingURL=federation-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federation-store.d.ts","sourceRoot":"","sources":["../../src/services/federation-store.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;sFACkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB;;yEAEqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;yEACqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;8EAC0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA8BD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,GAAE,MAAmB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAQ3J;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,mBAAmB,CAAA;CAAE,GAAG,IAAI,CAQnI;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAiBhM;AAED,oDAAoD;AACpD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAE/F;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAS/F;AAED,wGAAwG;AACxG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQnF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM1E"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Federation store (HUB side): which remote deployments have joined each team,
|
|
3
|
-
* and the bots they last advertised. The hub aggregates these with its own local
|
|
4
|
-
* roster so every member sees a shared cross-deployment roster.
|
|
5
|
-
*
|
|
6
|
-
* A deployment registers once via an invite (→ teamId) and is issued a long-lived
|
|
7
|
-
* `syncToken` (high-entropy, never logged) used for subsequent sync/roster pulls.
|
|
8
|
-
*
|
|
9
|
-
* Storage: `{dataDir}/federations.json`, atomic writes. Single dashboard writer
|
|
10
|
-
* (same assumption as invite-store): register/sync are read-modify-write.
|
|
11
|
-
*/
|
|
12
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
|
|
13
|
-
import { join } from 'node:path';
|
|
14
|
-
import { randomBytes, randomUUID } from 'node:crypto';
|
|
15
|
-
function filePath(dataDir) {
|
|
16
|
-
return join(dataDir, 'federations.json');
|
|
17
|
-
}
|
|
18
|
-
function readFile(dataDir) {
|
|
19
|
-
const fp = filePath(dataDir);
|
|
20
|
-
if (!existsSync(fp))
|
|
21
|
-
return { version: 1, teams: {} };
|
|
22
|
-
try {
|
|
23
|
-
const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
|
|
24
|
-
if (parsed && typeof parsed.teams === 'object' && parsed.teams)
|
|
25
|
-
return { version: 1, teams: parsed.teams };
|
|
26
|
-
}
|
|
27
|
-
catch { /* corrupt — fall through */ }
|
|
28
|
-
return { version: 1, teams: {} };
|
|
29
|
-
}
|
|
30
|
-
function writeFileAtomic(dataDir, data) {
|
|
31
|
-
if (!existsSync(dataDir))
|
|
32
|
-
mkdirSync(dataDir, { recursive: true });
|
|
33
|
-
const fp = filePath(dataDir);
|
|
34
|
-
const tmp = `${fp}.${process.pid}.${randomUUID()}.tmp`;
|
|
35
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
36
|
-
renameSync(tmp, fp);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Register a NEW remote deployment under a team and issue a fresh syncToken.
|
|
40
|
-
*
|
|
41
|
-
* NOT idempotent on purpose: `deploymentId` is public (it appears in the roster),
|
|
42
|
-
* so re-registering an existing id must NOT hand back its long-lived syncToken —
|
|
43
|
-
* otherwise anyone with an invite could claim another deployment's token by
|
|
44
|
-
* guessing its id. A duplicate returns `{ created: false }` with NO token; the
|
|
45
|
-
* caller surfaces `deployment_already_joined`. Ongoing bot refresh is via
|
|
46
|
-
* `syncDeployment` (syncToken), not this. Re-binding/rotation is a future
|
|
47
|
-
* explicit reset proving the old syncToken.
|
|
48
|
-
*/
|
|
49
|
-
export function registerDeployment(dataDir, teamId, input, now = Date.now()) {
|
|
50
|
-
const data = readFile(dataDir);
|
|
51
|
-
const list = data.teams[teamId] ?? (data.teams[teamId] = []);
|
|
52
|
-
if (list.some(d => d.deploymentId === input.deploymentId))
|
|
53
|
-
return { syncToken: '', created: false };
|
|
54
|
-
const syncToken = randomBytes(24).toString('base64url');
|
|
55
|
-
list.push({ deploymentId: input.deploymentId, name: input.name, syncToken, bots: input.bots, joinedAt: now, lastSeenAt: now, ownerUnionId: input.ownerUnionId, ownerName: input.ownerName, callbackUrl: input.callbackUrl, delegationToken: input.delegationToken });
|
|
56
|
-
writeFileAtomic(dataDir, data);
|
|
57
|
-
return { syncToken, created: true };
|
|
58
|
-
}
|
|
59
|
-
/** Resolve a syncToken to its {teamId, deployment}, or null. */
|
|
60
|
-
export function getDeploymentByToken(dataDir, syncToken) {
|
|
61
|
-
if (!syncToken)
|
|
62
|
-
return null;
|
|
63
|
-
const data = readFile(dataDir);
|
|
64
|
-
for (const [teamId, list] of Object.entries(data.teams)) {
|
|
65
|
-
const deployment = list.find(d => d.syncToken === syncToken);
|
|
66
|
-
if (deployment)
|
|
67
|
-
return { teamId, deployment };
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
/** Refresh a deployment's advertised bots + heartbeat, by syncToken. Returns true if found. */
|
|
72
|
-
export function syncDeployment(dataDir, syncToken, bots, owner, now = Date.now()) {
|
|
73
|
-
const data = readFile(dataDir);
|
|
74
|
-
for (const list of Object.values(data.teams)) {
|
|
75
|
-
const deployment = list.find(d => d.syncToken === syncToken);
|
|
76
|
-
if (deployment) {
|
|
77
|
-
deployment.bots = bots;
|
|
78
|
-
deployment.lastSeenAt = now;
|
|
79
|
-
// Owner + name can change after join (e.g. binding adopts the owner's
|
|
80
|
-
// Feishu name) — keep them fresh on sync, only overwriting when sent.
|
|
81
|
-
if (owner?.ownerUnionId !== undefined)
|
|
82
|
-
deployment.ownerUnionId = owner.ownerUnionId;
|
|
83
|
-
if (owner?.ownerName !== undefined)
|
|
84
|
-
deployment.ownerName = owner.ownerName;
|
|
85
|
-
if (owner?.name)
|
|
86
|
-
deployment.name = owner.name; // non-empty only → roster grouping follows the owner's Feishu name
|
|
87
|
-
writeFileAtomic(dataDir, data);
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
/** Member deployments of a team (empty if none). */
|
|
94
|
-
export function listFederatedDeployments(dataDir, teamId) {
|
|
95
|
-
return readFile(dataDir).teams[teamId] ?? [];
|
|
96
|
-
}
|
|
97
|
-
/** Remove a deployment from a team (leave/kick). Returns true if removed. */
|
|
98
|
-
export function removeDeployment(dataDir, teamId, deploymentId) {
|
|
99
|
-
const data = readFile(dataDir);
|
|
100
|
-
const list = data.teams[teamId];
|
|
101
|
-
if (!list)
|
|
102
|
-
return false;
|
|
103
|
-
const before = list.length;
|
|
104
|
-
data.teams[teamId] = list.filter(d => d.deploymentId !== deploymentId);
|
|
105
|
-
if (data.teams[teamId].length === before)
|
|
106
|
-
return false;
|
|
107
|
-
writeFileAtomic(dataDir, data);
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
/** Remove the deployment owning a syncToken (spoke-initiated leave/revoke). Returns true if removed. */
|
|
111
|
-
export function removeDeploymentByToken(dataDir, syncToken) {
|
|
112
|
-
if (!syncToken)
|
|
113
|
-
return false;
|
|
114
|
-
const data = readFile(dataDir);
|
|
115
|
-
for (const list of Object.values(data.teams)) {
|
|
116
|
-
const idx = list.findIndex(d => d.syncToken === syncToken);
|
|
117
|
-
if (idx >= 0) {
|
|
118
|
-
list.splice(idx, 1);
|
|
119
|
-
writeFileAtomic(dataDir, data);
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
/** Drop all federation records for a team (e.g. when the team is deleted). */
|
|
126
|
-
export function removeTeamFederation(dataDir, teamId) {
|
|
127
|
-
const data = readFile(dataDir);
|
|
128
|
-
if (data.teams[teamId]) {
|
|
129
|
-
delete data.teams[teamId];
|
|
130
|
-
writeFileAtomic(dataDir, data);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=federation-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"federation-store.js","sourceRoot":"","sources":["../../src/services/federation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CodexBridgeEvent } from './codex-transcript.js';
|
|
2
|
-
export declare function drainHermesStateDb(fromOffset: number, dbPath?: string): {
|
|
3
|
-
events: CodexBridgeEvent[];
|
|
4
|
-
newOffset: number;
|
|
5
|
-
};
|
|
6
|
-
export declare function currentHermesStateOffset(dbPath?: string): number;
|
|
7
|
-
//# sourceMappingURL=hermes-transcript.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hermes-transcript.d.ts","sourceRoot":"","sources":["../../src/services/hermes-transcript.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAqE9D,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAkB,GAAG;IAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAkBlI;AAED,wBAAgB,wBAAwB,CAAC,MAAM,SAAkB,GAAG,MAAM,CAWzE"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reader for Hermes Agent's SQLite session store.
|
|
3
|
-
*
|
|
4
|
-
* Hermes persists CLI conversations in ~/.hermes/state.db. Unlike Codex/CoCo,
|
|
5
|
-
* there is no append-only JSONL file to tail, so the bridge uses the messages
|
|
6
|
-
* table's monotonically increasing row id as its offset. The worker only needs
|
|
7
|
-
* user rows to match Lark turns and assistant rows with visible final content
|
|
8
|
-
* to synthesize a fallback reply when Hermes printed to the terminal but did
|
|
9
|
-
* not call `botmux send`.
|
|
10
|
-
*/
|
|
11
|
-
import { existsSync } from 'node:fs';
|
|
12
|
-
import { homedir } from 'node:os';
|
|
13
|
-
import { join } from 'node:path';
|
|
14
|
-
import { spawnSync } from 'node:child_process';
|
|
15
|
-
const HERMES_STATE_DB = join(homedir(), '.hermes', 'state.db');
|
|
16
|
-
const CONTENT_JSON_PREFIX = String.fromCharCode(0) + 'json:';
|
|
17
|
-
function decodeContent(content) {
|
|
18
|
-
if (content === null || content === undefined)
|
|
19
|
-
return '';
|
|
20
|
-
if (typeof content !== 'string')
|
|
21
|
-
return String(content);
|
|
22
|
-
if (!content.startsWith(CONTENT_JSON_PREFIX))
|
|
23
|
-
return content;
|
|
24
|
-
try {
|
|
25
|
-
return stringifyDecodedContent(JSON.parse(content.slice(CONTENT_JSON_PREFIX.length)));
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return content;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function stringifyDecodedContent(value) {
|
|
32
|
-
if (typeof value === 'string')
|
|
33
|
-
return value;
|
|
34
|
-
if (Array.isArray(value)) {
|
|
35
|
-
const parts = [];
|
|
36
|
-
for (const item of value) {
|
|
37
|
-
if (typeof item === 'string')
|
|
38
|
-
parts.push(item);
|
|
39
|
-
else if (item && typeof item === 'object') {
|
|
40
|
-
const text = item.text ?? item.content;
|
|
41
|
-
if (typeof text === 'string')
|
|
42
|
-
parts.push(text);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return parts.join('');
|
|
46
|
-
}
|
|
47
|
-
if (value && typeof value === 'object') {
|
|
48
|
-
const text = value.text ?? value.content;
|
|
49
|
-
if (typeof text === 'string')
|
|
50
|
-
return text;
|
|
51
|
-
}
|
|
52
|
-
return '';
|
|
53
|
-
}
|
|
54
|
-
function runSql(offset, dbPath) {
|
|
55
|
-
const script = `
|
|
56
|
-
import json
|
|
57
|
-
import sqlite3
|
|
58
|
-
conn = sqlite3.connect(${JSON.stringify(dbPath)})
|
|
59
|
-
conn.row_factory = sqlite3.Row
|
|
60
|
-
rows = conn.execute(
|
|
61
|
-
"""
|
|
62
|
-
SELECT id, session_id, role, content, timestamp, finish_reason
|
|
63
|
-
FROM messages
|
|
64
|
-
WHERE id > ? AND role IN ('user', 'assistant')
|
|
65
|
-
ORDER BY id
|
|
66
|
-
""",
|
|
67
|
-
(${JSON.stringify(offset)},),
|
|
68
|
-
).fetchall()
|
|
69
|
-
print(json.dumps([dict(r) for r in rows], ensure_ascii=False))
|
|
70
|
-
`;
|
|
71
|
-
const proc = spawnSync('python3', ['-c', script], { encoding: 'utf8', maxBuffer: 10 * 1024 * 1024 });
|
|
72
|
-
if (proc.status !== 0)
|
|
73
|
-
throw new Error((proc.stderr || proc.error?.message || 'python3 sqlite query failed').trim());
|
|
74
|
-
const stdout = proc.stdout.trim();
|
|
75
|
-
if (!stdout)
|
|
76
|
-
return [];
|
|
77
|
-
return JSON.parse(stdout);
|
|
78
|
-
}
|
|
79
|
-
export function drainHermesStateDb(fromOffset, dbPath = HERMES_STATE_DB) {
|
|
80
|
-
if (!existsSync(dbPath))
|
|
81
|
-
return { events: [], newOffset: fromOffset };
|
|
82
|
-
const rows = runSql(fromOffset, dbPath);
|
|
83
|
-
let newOffset = fromOffset;
|
|
84
|
-
const events = [];
|
|
85
|
-
for (const row of rows) {
|
|
86
|
-
if (typeof row.id === 'number' && row.id > newOffset)
|
|
87
|
-
newOffset = row.id;
|
|
88
|
-
const text = decodeContent(row.content).trim();
|
|
89
|
-
if (!text)
|
|
90
|
-
continue;
|
|
91
|
-
const timestampMs = typeof row.timestamp === 'number' ? row.timestamp * 1000 : Date.now();
|
|
92
|
-
if (row.role === 'user') {
|
|
93
|
-
events.push({ uuid: `hermes:${row.id}`, timestampMs, kind: 'user', text, sourceSessionId: row.session_id });
|
|
94
|
-
}
|
|
95
|
-
else if (row.role === 'assistant') {
|
|
96
|
-
if (row.finish_reason !== 'stop')
|
|
97
|
-
continue;
|
|
98
|
-
events.push({ uuid: `hermes:${row.id}`, timestampMs, kind: 'assistant_final', text, sourceSessionId: row.session_id });
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return { events, newOffset };
|
|
102
|
-
}
|
|
103
|
-
export function currentHermesStateOffset(dbPath = HERMES_STATE_DB) {
|
|
104
|
-
if (!existsSync(dbPath))
|
|
105
|
-
return 0;
|
|
106
|
-
const script = `
|
|
107
|
-
import sqlite3
|
|
108
|
-
conn = sqlite3.connect(${JSON.stringify(dbPath)})
|
|
109
|
-
row = conn.execute("SELECT COALESCE(MAX(id), 0) FROM messages").fetchone()
|
|
110
|
-
print(row[0] or 0)
|
|
111
|
-
`;
|
|
112
|
-
const proc = spawnSync('python3', ['-c', script], { encoding: 'utf8' });
|
|
113
|
-
if (proc.status !== 0)
|
|
114
|
-
return 0;
|
|
115
|
-
return Number.parseInt(proc.stdout.trim(), 10) || 0;
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=hermes-transcript.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hermes-transcript.js","sourceRoot":"","sources":["../../src/services/hermes-transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC/D,MAAM,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;AAW7D,SAAS,aAAa,CAAC,OAAgB;IACrC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC1C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAI,IAA8C,CAAC,IAAI,IAAK,IAA8B,CAAC,OAAO,CAAC;gBAC7G,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,GAAI,KAA+C,CAAC,IAAI,IAAK,KAA+B,CAAC,OAAO,CAAC;QAC/G,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,MAAc;IAC5C,MAAM,MAAM,GAAG;;;yBAGQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;;;;;;;OASxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;CAG5B,CAAC;IACA,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACrG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,6BAA6B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,MAAM,GAAG,eAAe;IAC7E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,GAAG,SAAS;YAAE,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1F,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9G,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,aAAa,KAAK,MAAM;gBAAE,SAAS;YAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAM,GAAG,eAAe;IAC/D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG;;yBAEQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;CAG9C,CAAC;IACA,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export interface TeamInvite {
|
|
2
|
-
code: string;
|
|
3
|
-
teamId: string;
|
|
4
|
-
createdBy: string;
|
|
5
|
-
createdAt: number;
|
|
6
|
-
expiresAt: number;
|
|
7
|
-
usedAt?: number;
|
|
8
|
-
}
|
|
9
|
-
export interface CreatedInvite {
|
|
10
|
-
code: string;
|
|
11
|
-
expiresAt: number;
|
|
12
|
-
}
|
|
13
|
-
/** Mint a single-use invite for a team. */
|
|
14
|
-
export declare function createInvite(dataDir: string, teamId: string, createdBy: string, ttlMs?: number, now?: number): CreatedInvite;
|
|
15
|
-
/** Drop every invite for a team (e.g. when the team is deleted), so stale codes
|
|
16
|
-
* can't later be consumed to join/switch into a non-existent team. Returns count. */
|
|
17
|
-
export declare function deleteInvitesForTeam(dataDir: string, teamId: string): number;
|
|
18
|
-
export type ConsumeInviteResult = {
|
|
19
|
-
ok: true;
|
|
20
|
-
teamId: string;
|
|
21
|
-
} | {
|
|
22
|
-
ok: false;
|
|
23
|
-
reason: 'not_found' | 'expired' | 'used';
|
|
24
|
-
};
|
|
25
|
-
/** Validate + burn an invite (single-use). Determines the precise failure
|
|
26
|
-
* reason BEFORE pruning, so an expired code reports `expired` (not `not_found`). */
|
|
27
|
-
export declare function consumeInvite(dataDir: string, code: string, now?: number): ConsumeInviteResult;
|
|
28
|
-
//# sourceMappingURL=invite-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite-store.d.ts","sourceRoot":"","sources":["../../src/services/invite-store.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAgCD,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAAE;AAEnE,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,EAAE,GAAG,GAAE,MAAmB,GAAG,aAAa,CAMxJ;AAED;sFACsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC;AAE5D;qFACqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,mBAAmB,CAS1G"}
|