@opengsd/gsd-pi 1.0.2-dev.50223bc → 1.0.2-dev.5961fbf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resource-loader.d.ts +5 -0
- package/dist/resource-loader.js +24 -8
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/gsd/auto/loop.js +19 -0
- package/dist/resources/extensions/gsd/auto/phases.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +2 -54
- package/dist/resources/extensions/gsd/worktree-post-create-hook.js +117 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/1834.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +0 -1
- package/dist/worktree-cli.d.ts +0 -2
- package/dist/worktree-cli.js +21 -9
- package/package.json +9 -4
- package/packages/cloud-mcp-gateway/bin/gsd-cloud-mcp-gateway.js +14 -0
- package/packages/cloud-mcp-gateway/package.json +5 -4
- package/packages/contracts/package.json +2 -2
- package/packages/daemon/bin/gsd-daemon.js +14 -0
- package/packages/daemon/bin/gsd-mcp-runtime.js +14 -0
- package/packages/daemon/bin/gsd-mcp.js +14 -0
- package/packages/daemon/dist/channel-manager.d.ts +53 -0
- package/packages/daemon/dist/channel-manager.d.ts.map +1 -0
- package/packages/daemon/dist/channel-manager.js +167 -0
- package/packages/daemon/dist/channel-manager.js.map +1 -0
- package/packages/daemon/dist/cli.d.ts +3 -0
- package/packages/daemon/dist/cli.d.ts.map +1 -0
- package/packages/daemon/dist/cli.js +94 -0
- package/packages/daemon/dist/cli.js.map +1 -0
- package/packages/daemon/dist/cloud-cli.d.ts +7 -0
- package/packages/daemon/dist/cloud-cli.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-cli.js +96 -0
- package/packages/daemon/dist/cloud-cli.js.map +1 -0
- package/packages/daemon/dist/cloud-config.d.ts +18 -0
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-config.js +209 -0
- package/packages/daemon/dist/cloud-config.js.map +1 -0
- package/packages/daemon/dist/cloud-config.test.d.ts +2 -0
- package/packages/daemon/dist/cloud-config.test.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-config.test.js +132 -0
- package/packages/daemon/dist/cloud-config.test.js.map +1 -0
- package/packages/daemon/dist/cloud-runtime.d.ts +26 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-runtime.js +180 -0
- package/packages/daemon/dist/cloud-runtime.js.map +1 -0
- package/packages/daemon/dist/cloud-runtime.test.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.test.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-runtime.test.js +28 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -0
- package/packages/daemon/dist/cloud-token.d.ts +3 -0
- package/packages/daemon/dist/cloud-token.d.ts.map +1 -0
- package/packages/daemon/dist/cloud-token.js +37 -0
- package/packages/daemon/dist/cloud-token.js.map +1 -0
- package/packages/daemon/dist/commands.d.ts +25 -0
- package/packages/daemon/dist/commands.d.ts.map +1 -0
- package/packages/daemon/dist/commands.js +81 -0
- package/packages/daemon/dist/commands.js.map +1 -0
- package/packages/daemon/dist/config.d.ts +17 -0
- package/packages/daemon/dist/config.d.ts.map +1 -0
- package/packages/daemon/dist/config.js +146 -0
- package/packages/daemon/dist/config.js.map +1 -0
- package/packages/daemon/dist/daemon.d.ts +38 -0
- package/packages/daemon/dist/daemon.d.ts.map +1 -0
- package/packages/daemon/dist/daemon.js +194 -0
- package/packages/daemon/dist/daemon.js.map +1 -0
- package/packages/daemon/dist/daemon.test.d.ts +2 -0
- package/packages/daemon/dist/daemon.test.d.ts.map +1 -0
- package/packages/daemon/dist/daemon.test.js +692 -0
- package/packages/daemon/dist/daemon.test.js.map +1 -0
- package/packages/daemon/dist/discord-bot.d.ts +70 -0
- package/packages/daemon/dist/discord-bot.d.ts.map +1 -0
- package/packages/daemon/dist/discord-bot.js +433 -0
- package/packages/daemon/dist/discord-bot.js.map +1 -0
- package/packages/daemon/dist/discord-bot.test.d.ts +2 -0
- package/packages/daemon/dist/discord-bot.test.d.ts.map +1 -0
- package/packages/daemon/dist/discord-bot.test.js +667 -0
- package/packages/daemon/dist/discord-bot.test.js.map +1 -0
- package/packages/daemon/dist/event-bridge.d.ts +72 -0
- package/packages/daemon/dist/event-bridge.d.ts.map +1 -0
- package/packages/daemon/dist/event-bridge.js +366 -0
- package/packages/daemon/dist/event-bridge.js.map +1 -0
- package/packages/daemon/dist/event-bridge.test.d.ts +9 -0
- package/packages/daemon/dist/event-bridge.test.d.ts.map +1 -0
- package/packages/daemon/dist/event-bridge.test.js +528 -0
- package/packages/daemon/dist/event-bridge.test.js.map +1 -0
- package/packages/daemon/dist/event-formatter.d.ts +34 -0
- package/packages/daemon/dist/event-formatter.d.ts.map +1 -0
- package/packages/daemon/dist/event-formatter.js +355 -0
- package/packages/daemon/dist/event-formatter.js.map +1 -0
- package/packages/daemon/dist/event-formatter.test.d.ts +2 -0
- package/packages/daemon/dist/event-formatter.test.d.ts.map +1 -0
- package/packages/daemon/dist/event-formatter.test.js +333 -0
- package/packages/daemon/dist/event-formatter.test.js.map +1 -0
- package/packages/daemon/dist/index.d.ts +25 -0
- package/packages/daemon/dist/index.d.ts.map +1 -0
- package/packages/daemon/dist/index.js +17 -0
- package/packages/daemon/dist/index.js.map +1 -0
- package/packages/daemon/dist/launchd.d.ts +49 -0
- package/packages/daemon/dist/launchd.d.ts.map +1 -0
- package/packages/daemon/dist/launchd.js +188 -0
- package/packages/daemon/dist/launchd.js.map +1 -0
- package/packages/daemon/dist/launchd.test.d.ts +2 -0
- package/packages/daemon/dist/launchd.test.d.ts.map +1 -0
- package/packages/daemon/dist/launchd.test.js +296 -0
- package/packages/daemon/dist/launchd.test.js.map +1 -0
- package/packages/daemon/dist/local-tool-executor.d.ts +22 -0
- package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -0
- package/packages/daemon/dist/local-tool-executor.js +307 -0
- package/packages/daemon/dist/local-tool-executor.js.map +1 -0
- package/packages/daemon/dist/local-tool-executor.test.d.ts +2 -0
- package/packages/daemon/dist/local-tool-executor.test.d.ts.map +1 -0
- package/packages/daemon/dist/local-tool-executor.test.js +111 -0
- package/packages/daemon/dist/local-tool-executor.test.js.map +1 -0
- package/packages/daemon/dist/logger.d.ts +25 -0
- package/packages/daemon/dist/logger.d.ts.map +1 -0
- package/packages/daemon/dist/logger.js +72 -0
- package/packages/daemon/dist/logger.js.map +1 -0
- package/packages/daemon/dist/mcp-cli.d.ts +3 -0
- package/packages/daemon/dist/mcp-cli.d.ts.map +1 -0
- package/packages/daemon/dist/mcp-cli.js +8 -0
- package/packages/daemon/dist/mcp-cli.js.map +1 -0
- package/packages/daemon/dist/mcp-cli.test.d.ts +2 -0
- package/packages/daemon/dist/mcp-cli.test.d.ts.map +1 -0
- package/packages/daemon/dist/mcp-cli.test.js +13 -0
- package/packages/daemon/dist/mcp-cli.test.js.map +1 -0
- package/packages/daemon/dist/mcp-runtime-cli.d.ts +3 -0
- package/packages/daemon/dist/mcp-runtime-cli.d.ts.map +1 -0
- package/packages/daemon/dist/mcp-runtime-cli.js +8 -0
- package/packages/daemon/dist/mcp-runtime-cli.js.map +1 -0
- package/packages/daemon/dist/message-batcher.d.ts +78 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -0
- package/packages/daemon/dist/message-batcher.js +173 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -0
- package/packages/daemon/dist/message-batcher.test.d.ts +2 -0
- package/packages/daemon/dist/message-batcher.test.d.ts.map +1 -0
- package/packages/daemon/dist/message-batcher.test.js +242 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -0
- package/packages/daemon/dist/orchestrator.d.ts +98 -0
- package/packages/daemon/dist/orchestrator.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator.js +359 -0
- package/packages/daemon/dist/orchestrator.js.map +1 -0
- package/packages/daemon/dist/orchestrator.test.d.ts +8 -0
- package/packages/daemon/dist/orchestrator.test.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator.test.js +425 -0
- package/packages/daemon/dist/orchestrator.test.js.map +1 -0
- package/packages/daemon/dist/project-scanner.d.ts +18 -0
- package/packages/daemon/dist/project-scanner.d.ts.map +1 -0
- package/packages/daemon/dist/project-scanner.js +90 -0
- package/packages/daemon/dist/project-scanner.js.map +1 -0
- package/packages/daemon/dist/project-scanner.test.d.ts +5 -0
- package/packages/daemon/dist/project-scanner.test.d.ts.map +1 -0
- package/packages/daemon/dist/project-scanner.test.js +183 -0
- package/packages/daemon/dist/project-scanner.test.js.map +1 -0
- package/packages/daemon/dist/session-manager.d.ts +70 -0
- package/packages/daemon/dist/session-manager.d.ts.map +1 -0
- package/packages/daemon/dist/session-manager.js +358 -0
- package/packages/daemon/dist/session-manager.js.map +1 -0
- package/packages/daemon/dist/session-manager.test.d.ts +9 -0
- package/packages/daemon/dist/session-manager.test.d.ts.map +1 -0
- package/packages/daemon/dist/session-manager.test.js +616 -0
- package/packages/daemon/dist/session-manager.test.js.map +1 -0
- package/packages/daemon/dist/types.d.ts +133 -0
- package/packages/daemon/dist/types.d.ts.map +1 -0
- package/packages/daemon/dist/types.js +8 -0
- package/packages/daemon/dist/types.js.map +1 -0
- package/packages/daemon/dist/verbosity.d.ts +27 -0
- package/packages/daemon/dist/verbosity.d.ts.map +1 -0
- package/packages/daemon/dist/verbosity.js +86 -0
- package/packages/daemon/dist/verbosity.js.map +1 -0
- package/packages/daemon/dist/verbosity.test.d.ts +2 -0
- package/packages/daemon/dist/verbosity.test.d.ts.map +1 -0
- package/packages/daemon/dist/verbosity.test.js +136 -0
- package/packages/daemon/dist/verbosity.test.js.map +1 -0
- package/packages/daemon/package.json +9 -8
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +8 -8
- package/packages/mcp-server/bin/gsd-mcp-server.js +14 -0
- package/packages/mcp-server/package.json +6 -5
- package/packages/native/package.json +3 -3
- package/packages/pi-agent-core/package.json +4 -4
- package/packages/pi-ai/bin/pi-ai.js +14 -0
- package/packages/pi-ai/dist/models.generated.d.ts +0 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +18 -35
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +5 -4
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +5 -3
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/package.json +9 -9
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +3 -3
- package/pkg/package.json +1 -1
- package/scripts/ensure-workspace-builds.cjs +4 -4
- package/scripts/install/deps.js +10 -0
- package/src/resources/extensions/gsd/auto/loop.ts +22 -0
- package/src/resources/extensions/gsd/auto/phases.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +2 -56
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +141 -1
- package/src/resources/extensions/gsd/worktree-post-create-hook.ts +127 -0
- package/dist/tsconfig.extensions.tsbuildinfo +0 -1
- /package/dist/web/standalone/.next/static/{JP7xjsa5zSaO76XhE-mFJ → spUYLkQXoHJyxYOMH9VQy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{JP7xjsa5zSaO76XhE-mFJ → spUYLkQXoHJyxYOMH9VQy}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-bot.js","sourceRoot":"","sources":["../src/discord-bot.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DiscordBot — wraps discord.js Client with login/destroy lifecycle, auth guard,\n * and integration with the daemon's SessionManager.\n *\n * Auth model (D016): single Discord user ID allowlist. All non-owner interactions\n * silently ignored; rejections logged at debug level (userId only, no PII).\n */\n\nimport {\n Client,\n GatewayIntentBits,\n REST,\n StringSelectMenuBuilder,\n ActionRowBuilder,\n ComponentType,\n type Interaction,\n type Guild,\n type StringSelectMenuInteraction,\n} from 'discord.js';\nimport type { DaemonConfig, VerbosityLevel, ProjectInfo } from './types.js';\nimport type { Logger } from './logger.js';\nimport type { SessionManager } from './session-manager.js';\nimport { ChannelManager } from './channel-manager.js';\nimport { buildCommands, registerGuildCommands, formatSessionStatus } from './commands.js';\nimport type { EventBridge } from './event-bridge.js';\n\n// ---------------------------------------------------------------------------\n// Pure helpers — exported for testability\n// ---------------------------------------------------------------------------\n\n/**\n * Auth guard: returns true iff userId matches the configured owner_id.\n * Rejects empty or missing ownerId to fail closed.\n */\nexport function isAuthorized(userId: string, ownerId: string): boolean {\n if (!ownerId || !userId) return false;\n return userId === ownerId;\n}\n\n/**\n * Validates that all required discord config fields are present.\n * Throws with a descriptive message on the first missing field.\n */\nexport function validateDiscordConfig(\n config: DaemonConfig['discord'],\n): asserts config is NonNullable<DaemonConfig['discord']> {\n if (!config) {\n throw new Error('Discord config is undefined');\n }\n if (!config.token || config.token.trim() === '') {\n throw new Error('Discord config missing required field: token');\n }\n if (!config.guild_id || config.guild_id.trim() === '') {\n throw new Error('Discord config missing required field: guild_id');\n }\n if (!config.owner_id || config.owner_id.trim() === '') {\n throw new Error('Discord config missing required field: owner_id');\n }\n}\n\n// ---------------------------------------------------------------------------\n// DiscordBot class\n// ---------------------------------------------------------------------------\n\nexport interface DiscordBotOptions {\n config: NonNullable<DaemonConfig['discord']>;\n logger: Logger;\n sessionManager: SessionManager;\n /** Optional function to scan for projects (passed from Daemon). */\n scanProjects?: () => Promise<ProjectInfo[]>;\n}\n\nexport class DiscordBot {\n private client: Client | null = null;\n private destroyed = false;\n private channelManager: ChannelManager | null = null;\n private eventBridge: EventBridge | null = null;\n\n private readonly config: NonNullable<DaemonConfig['discord']>;\n private readonly logger: Logger;\n private readonly sessionManager: SessionManager;\n private readonly scanProjects?: () => Promise<ProjectInfo[]>;\n\n constructor(opts: DiscordBotOptions) {\n this.config = opts.config;\n this.logger = opts.logger;\n this.sessionManager = opts.sessionManager;\n this.scanProjects = opts.scanProjects;\n }\n\n /**\n * Create the discord.js Client, register event handlers, and log in.\n * Throws on login failure — the caller (Daemon) decides whether to continue without the bot.\n */\n async login(): Promise<void> {\n const client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n ],\n });\n\n client.once('ready', (readyClient) => {\n const guildNames = readyClient.guilds.cache.map((g) => g.name).join(', ');\n this.logger.info('bot ready', {\n username: readyClient.user.tag,\n guilds: guildNames,\n });\n\n // Register slash commands for the configured guild\n const rest = new REST({ version: '10' }).setToken(this.config.token);\n const commands = buildCommands();\n registerGuildCommands(\n rest,\n readyClient.user.id,\n this.config.guild_id,\n commands,\n this.logger,\n ).catch((err) => {\n // Should not reach here — registerGuildCommands catches internally\n this.logger.warn('unexpected command registration error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n });\n\n client.on('interactionCreate', (interaction: Interaction) => {\n this.handleInteraction(interaction);\n });\n\n // Debug: log all incoming messages at debug level\n client.on('messageCreate', (msg) => {\n this.logger.debug('raw messageCreate', {\n authorId: msg.author.id,\n authorBot: msg.author.bot,\n channelId: msg.channelId,\n contentLength: msg.content.length,\n hasContent: msg.content.length > 0,\n });\n });\n\n // Reconnection observability — structured logging for all shard lifecycle events (R027)\n client.on('shardError', (error) => {\n this.logger.error('discord shard error', { error: error.message });\n });\n client.on('shardDisconnect', (event, shardId) => {\n this.logger.warn('discord shard disconnected', { shardId, code: event.code });\n });\n client.on('shardReconnecting', (shardId) => {\n this.logger.info('discord shard reconnecting', { shardId });\n });\n client.on('shardResume', (shardId, replayedEvents) => {\n this.logger.info('discord shard resumed', { shardId, replayedEvents });\n });\n client.on('warn', (message) => {\n this.logger.warn('discord warning', { message });\n });\n client.on('error', (error) => {\n this.logger.error('discord error', { error: error.message });\n });\n\n // Wait for both login AND the 'ready' event.\n // client.login() resolves on WebSocket auth, but the 'ready' event fires\n // asynchronously later. We need 'ready' before getChannelManager() works.\n let readyTimeout: ReturnType<typeof setTimeout> | undefined;\n let readySettled = false;\n const readyPromise = new Promise<void>((resolve, reject) => {\n readyTimeout = setTimeout(() => {\n if (!readySettled) { readySettled = true; reject(new Error('Discord ready timeout (30s)')); }\n }, 30_000);\n const cleanup = () => {\n if (readyTimeout) { clearTimeout(readyTimeout); readyTimeout = undefined; }\n };\n client.once('ready', () => {\n cleanup();\n if (!readySettled) { readySettled = true; resolve(); }\n });\n client.once('error', (err) => {\n cleanup();\n if (!readySettled) { readySettled = true; reject(err); }\n });\n // shardDisconnect fires on fatal gateway errors (e.g. 4014 disallowed intents)\n client.once('shardDisconnect', (event) => {\n cleanup();\n if (!readySettled) { readySettled = true; reject(new Error(`Shard disconnected: ${event.code}`)); }\n });\n });\n\n try {\n await client.login(this.config.token);\n } catch (err) {\n // Login itself failed — clean up the ready timer so it doesn't fire as unhandled rejection\n if (readyTimeout) { clearTimeout(readyTimeout); readyTimeout = undefined; }\n readySettled = true;\n throw err;\n }\n await readyPromise;\n this.client = client;\n this.destroyed = false;\n }\n\n /**\n * Destroy the discord.js Client. Idempotent — safe to call multiple times\n * or before login().\n */\n async destroy(): Promise<void> {\n if (this.destroyed || !this.client) {\n this.destroyed = true;\n return;\n }\n\n try {\n // discord.js destroy() is synchronous but may throw on double-destroy\n this.client.destroy();\n this.logger.info('bot destroyed');\n } catch (err) {\n // Swallow cleanup errors — shutdown must not fail\n this.logger.debug('bot destroy error (swallowed)', {\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n this.client = null;\n this.destroyed = true;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Public accessors\n // ---------------------------------------------------------------------------\n\n /**\n * Lazily create a ChannelManager from the configured guild.\n * Returns null if the client isn't ready or the guild isn't found.\n */\n getChannelManager(): ChannelManager | null {\n if (this.channelManager) return this.channelManager;\n if (!this.client?.isReady()) return null;\n\n const guild = this.client.guilds.cache.get(this.config.guild_id);\n if (!guild) {\n this.logger.warn('guild not found for channel manager', { guildId: this.config.guild_id });\n return null;\n }\n\n this.channelManager = new ChannelManager({ guild, logger: this.logger });\n return this.channelManager;\n }\n\n /**\n * Return the underlying discord.js Client, or null if not logged in.\n * Used by Daemon to pass to EventBridge as BridgeClient.\n */\n getClient(): Client | null {\n return this.client;\n }\n\n /**\n * Set the EventBridge reference so the bot can dispatch /gsd-verbose commands.\n * Called by Daemon after creating the EventBridge.\n */\n setEventBridge(bridge: EventBridge): void {\n this.eventBridge = bridge;\n }\n\n // ---------------------------------------------------------------------------\n // Private: interaction handling\n // ---------------------------------------------------------------------------\n\n private handleInteraction(interaction: Interaction): void {\n if (!isAuthorized(interaction.user.id, this.config.owner_id)) {\n this.logger.debug('auth rejected', { userId: interaction.user.id });\n return;\n }\n\n // Only handle chat input (slash) commands\n if (!interaction.isChatInputCommand()) {\n this.logger.debug('non-command interaction', {\n type: interaction.type,\n userId: interaction.user.id,\n });\n return;\n }\n\n const { commandName } = interaction;\n this.logger.info('command handled', { commandName, userId: interaction.user.id });\n\n switch (commandName) {\n case 'gsd-status': {\n const sessions = this.sessionManager.getAllSessions();\n const content = formatSessionStatus(sessions);\n interaction.reply({ content, ephemeral: true }).catch((err) => {\n this.logger.warn('gsd-status reply failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n }\n case 'gsd-start':\n this.handleGsdStart(interaction).catch((err) => {\n this.logger.warn('gsd-start handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n case 'gsd-stop':\n this.handleGsdStop(interaction).catch((err) => {\n this.logger.warn('gsd-stop handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n case 'gsd-verbose': {\n if (!this.eventBridge) {\n interaction.reply({ content: 'Event bridge not available.', ephemeral: true }).catch((err) => {\n this.logger.warn('gsd-verbose reply failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n }\n const level = (interaction.options.getString('level') ?? 'default') as VerbosityLevel;\n const channelId = interaction.channelId;\n this.eventBridge.getVerbosityManager().setLevel(channelId, level);\n interaction.reply({ content: `Verbosity set to **${level}** for this channel.`, ephemeral: true }).catch((err) => {\n this.logger.warn('gsd-verbose reply failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n }\n default:\n interaction.reply({ content: 'Unknown command', ephemeral: true }).catch((err) => {\n this.logger.warn('unknown command reply failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: /gsd-start handler\n // ---------------------------------------------------------------------------\n\n private async handleGsdStart(interaction: import('discord.js').ChatInputCommandInteraction): Promise<void> {\n await interaction.deferReply({ ephemeral: true });\n this.logger.info('gsd-start: scanning projects');\n\n if (!this.scanProjects) {\n await interaction.editReply({ content: 'Project scanning not available.' });\n return;\n }\n\n let projects: ProjectInfo[];\n try {\n projects = await this.scanProjects();\n } catch (err) {\n this.logger.error('gsd-start: scan failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n await interaction.editReply({ content: 'Failed to scan for projects.' });\n return;\n }\n\n if (projects.length === 0) {\n await interaction.editReply({ content: 'No projects found.' });\n return;\n }\n\n // Discord select menus support max 25 options\n const truncated = projects.slice(0, 25);\n const select = new StringSelectMenuBuilder()\n .setCustomId('gsd-start-select')\n .setPlaceholder('Select a project to start')\n .addOptions(\n truncated.map((p) => ({\n label: p.name.slice(0, 100), // Discord label max 100 chars\n value: p.path,\n description: p.markers.join(', ').slice(0, 100) || undefined,\n })),\n );\n\n const row = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(select);\n const reply = await interaction.editReply({\n content: `Select a project to start (${truncated.length}${projects.length > 25 ? ` of ${projects.length}` : ''} projects):`,\n components: [row],\n });\n\n try {\n const collected = await reply.awaitMessageComponent({\n componentType: ComponentType.StringSelect,\n time: 60_000,\n filter: (i) => i.user.id === interaction.user.id,\n }) as StringSelectMenuInteraction;\n\n const projectPath = collected.values[0];\n this.logger.info('gsd-start: project selected', { projectPath });\n\n // Defer the update immediately — startSession can take 10-30s to spawn the GSD process,\n // and Discord's component interaction token expires in 3 seconds without deferral.\n await collected.deferUpdate();\n\n try {\n const sessionId = await this.sessionManager.startSession({ projectDir: projectPath });\n await interaction.editReply({\n content: `✅ Session started for **${projectPath}** (ID: \\`${sessionId}\\`)`,\n components: [],\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.logger.error('gsd-start: startSession failed', { error: errMsg, projectPath });\n await interaction.editReply({\n content: `❌ Failed to start session: ${errMsg}`,\n components: [],\n });\n }\n } catch {\n // Timeout or other collector error\n this.logger.info('gsd-start: selection timed out');\n await interaction.editReply({ content: 'Selection timed out.', components: [] });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: /gsd-stop handler\n // ---------------------------------------------------------------------------\n\n private async handleGsdStop(interaction: import('discord.js').ChatInputCommandInteraction): Promise<void> {\n await interaction.deferReply({ ephemeral: true });\n this.logger.info('gsd-stop: listing sessions');\n\n const allSessions = this.sessionManager.getAllSessions();\n const activeSessions = allSessions.filter(\n (s) => s.status === 'running' || s.status === 'blocked' || s.status === 'starting',\n );\n\n if (activeSessions.length === 0) {\n await interaction.editReply({ content: 'No active sessions.' });\n return;\n }\n\n // Discord select menus support max 25 options\n const truncated = activeSessions.slice(0, 25);\n const select = new StringSelectMenuBuilder()\n .setCustomId('gsd-stop-select')\n .setPlaceholder('Select a session to stop')\n .addOptions(\n truncated.map((s) => ({\n label: `${s.projectName} (${s.status})`.slice(0, 100),\n value: s.sessionId,\n })),\n );\n\n const row = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(select);\n const reply = await interaction.editReply({\n content: `Select a session to stop (${truncated.length} active):`,\n components: [row],\n });\n\n try {\n const collected = await reply.awaitMessageComponent({\n componentType: ComponentType.StringSelect,\n time: 60_000,\n filter: (i) => i.user.id === interaction.user.id,\n }) as StringSelectMenuInteraction;\n\n const sessionId = collected.values[0];\n this.logger.info('gsd-stop: session selected', { sessionId });\n\n try {\n await this.sessionManager.cancelSession(sessionId);\n await collected.update({\n content: `✅ Session \\`${sessionId}\\` stopped.`,\n components: [],\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.logger.error('gsd-stop: cancelSession failed', { error: errMsg, sessionId });\n await collected.update({\n content: `❌ Failed to stop session: ${errMsg}`,\n components: [],\n });\n }\n } catch {\n // Timeout or other collector error\n this.logger.info('gsd-stop: selection timed out');\n await interaction.editReply({ content: 'Selection timed out.', components: [] });\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-bot.test.d.ts","sourceRoot":"","sources":["../src/discord-bot.test.ts"],"names":[],"mappings":""}
|