{"version":3,"file":"server.cjs","names":["defineRoot","QuestionnaireCoordinator","defineRoot","contribution","defineToolRestriction","DOOM_VOICE_AUTO_MODE_ID","ASK_USER_QUESTION_TOOL_NAME","ASK_USER_QUESTION_TOOL_NAME","QuestionParamsSchema","validateQuestionnaire","buildToolResult","QuestionnaireCoordinator","runQuestionnaire","buildQuestionnaireResponse","defineServerTool","defineServerPlugin","rootSession","composeRootHooks","toolRestrictionAskUserQuestion","toolAskUserQuestion"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool-restriction/askUserQuestion.server.ts","../../src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts","../../src/extensions/workspaces/sessions/(backend)/tool/askUserQuestion.server.ts","../../generated/server.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { QuestionnaireCoordinator } from '../../../../../services/questionnaireCoordinator';\n\nconst root = defineRoot((_context: DoomServerPluginContext) => {\n  const coordinator = new QuestionnaireCoordinator();\n  return {\n    value: { coordinator },\n    onDispose: () => coordinator.shutdown(),\n  };\n});\n\nexport type UserFeedbackServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { defineToolRestriction } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessToolRestriction } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_VOICE_AUTO_MODE_ID } from '@agimon-ai/doompi-core/voiceTools';\n\nimport { ASK_USER_QUESTION_TOOL_NAME } from '../../../../../constants/tool';\n\nexport default defineToolRestriction({\n  when: { state: { 'minor-mode': DOOM_VOICE_AUTO_MODE_ID } },\n  excludedTools: [ASK_USER_QUESTION_TOOL_NAME],\n} satisfies DoomHeadlessToolRestriction);\n","import { type DoomHeadlessTool, type DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\n\nimport { ASK_USER_QUESTION_TOOL_NAME } from '../../../../../constants/tool';\nimport type { QuestionParams } from '../../../../../schemas/questionnaire';\nimport { QuestionParamsSchema } from '../../../../../schemas/questionnaire';\nimport { QuestionnaireCoordinator } from '../../../../../services/questionnaireCoordinator';\nimport { runQuestionnaire, type QuestionnaireInteraction } from '../../../../../services/questionnaireService';\nimport { buildQuestionnaireResponse, buildToolResult } from '../../../../../services/responseService';\nimport { validateQuestionnaire } from '../../../../../services/validationService';\nimport type { QuestionnaireResult } from '../../../../../types/questionnaire';\n\nfunction output(result: {\n  content: Array<{ type: 'text'; text: string }>;\n  details: QuestionnaireResult;\n}): DoomHeadlessToolResult {\n  return { content: result.content, details: result.details };\n}\n\nexport function createAskUserHeadlessTool(\n  coordinator?: QuestionnaireCoordinator,\n): DoomHeadlessTool<typeof QuestionParamsSchema> {\n  const tool: DoomHeadlessTool<typeof QuestionParamsSchema> = {\n    name: ASK_USER_QUESTION_TOOL_NAME,\n    label: 'Ask User Question',\n    description: 'Ask the user one or more structured questions during execution.',\n    parameters: QuestionParamsSchema,\n    promptSnippet: 'Ask the user structured questions when requirements are ambiguous',\n    executionMode: 'serial',\n    async execute(_toolCallId, parameters, signal, _onUpdate, executionContext) {\n      const params = parameters as QuestionParams;\n      const validation = validateQuestionnaire(params);\n      if (!validation.ok) {\n        return output(buildToolResult(validation.message, { answers: [], cancelled: true, error: validation.error }));\n      }\n      const activeCoordinator = coordinator ?? new QuestionnaireCoordinator();\n      try {\n        const result = await activeCoordinator.enqueue(async ({ signal: requestSignal, reportProgress }) => {\n          requestSignal.throwIfAborted();\n          const interaction: QuestionnaireInteraction = {\n            select: async (title, options, interactionSignal) => {\n              const response = await executionContext.client.request(\n                {\n                  kind: 'select',\n                  title,\n                  options: options.map((label) => ({ label, value: label })),\n                },\n                interactionSignal,\n              );\n              return typeof response === 'string' ? response : undefined;\n            },\n            input: async (title, placeholder, interactionSignal) => {\n              const response = await executionContext.client.request(\n                { kind: 'input', title, message: placeholder },\n                interactionSignal,\n              );\n              return typeof response === 'string' ? response : undefined;\n            },\n          };\n          const questionnaire = await runQuestionnaire(interaction, params, requestSignal, reportProgress);\n          requestSignal.throwIfAborted();\n          return questionnaire;\n        }, signal);\n        return output(buildQuestionnaireResponse(result, params));\n      } finally {\n        if (coordinator === undefined) {\n          activeCoordinator.shutdown();\n          await activeCoordinator.waitForIdle();\n        }\n      }\n    },\n  };\n  return tool;\n}\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { UserFeedbackServerScope } from '../_lib/root.server';\nimport { createAskUserHeadlessTool } from '../_tools/askUserHeadless';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, UserFeedbackServerScope>) =>\n  createAskUserHeadlessTool(context.root.coordinator),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport toolRestrictionAskUserQuestion from '../src/extensions/workspaces/sessions/(backend)/tool-restriction/askUserQuestion.server';\nimport toolAskUserQuestion from '../src/extensions/workspaces/sessions/(backend)/tool/askUserQuestion.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n  typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n  (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n  name: '@agimon-ai/doompi-user-feedback',\n  session: async (context) => {\n    const scopeSession = await rootSession(context);\n    const contextSession = { ...context, root: scopeSession.value };\n    return {\n      ...composeRootHooks(scopeSession),\n      get toolRestrictions(): DoomServerSessionPlugin['toolRestrictions'] { return [at(toolRestrictionAskUserQuestion, contextSession)]; },\n      get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'ask_user_question' }, at(toolAskUserQuestion, contextSession))]; },\n      services: [...(scopeSession.services ?? [])],\n      get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n    };\n  },\n});\n\nexport default facet;\n"],"mappings":";;;;;;;;;AAKA,MAAM,QAAA,GAAOA,qCAAAA,WAAAA,EAAY,aAAsC;CAC7D,MAAM,cAAc,IAAIC,0BAAAA,yBAAyB;CACjD,OAAO;EACL,OAAO,EAAE,YAAY;EACrB,iBAAiB,YAAY,SAAS;CACxC;AACF,CAAC;;;ACPD,IAAA,uBAAA,GAAeC,qCAAAA,WAAAA,CAAWC,IAAY;;;ACEtC,IAAA,oCAAA,GAAeC,qCAAAA,sBAAAA,CAAsB;CACnC,MAAM,EAAE,OAAO,EAAE,cAAcC,kCAAAA,wBAAwB,EAAE;CACzD,eAAe,CAACC,0BAAAA,2BAA2B;AAC7C,CAAuC;;;ACEvC,SAAS,OAAO,QAGW;CACzB,OAAO;EAAE,SAAS,OAAO;EAAS,SAAS,OAAO;CAAQ;AAC5D;AAEA,SAAgB,0BACd,aAC+C;CAmD/C,OAAO;EAjDL,MAAMC,0BAAAA;EACN,OAAO;EACP,aAAa;EACb,YAAYC,0BAAAA;EACZ,eAAe;EACf,eAAe;EACf,MAAM,QAAQ,aAAa,YAAY,QAAQ,WAAW,kBAAkB;GAC1E,MAAM,SAAS;GACf,MAAM,aAAaC,0BAAAA,sBAAsB,MAAM;GAC/C,IAAI,CAAC,WAAW,IACd,OAAO,OAAOC,0BAAAA,gBAAgB,WAAW,SAAS;IAAE,SAAS,CAAC;IAAG,WAAW;IAAM,OAAO,WAAW;GAAM,CAAC,CAAC;GAE9G,MAAM,oBAAoB,eAAe,IAAIC,0BAAAA,yBAAyB;GACtE,IAAI;IACF,MAAM,SAAS,MAAM,kBAAkB,QAAQ,OAAO,EAAE,QAAQ,eAAe,qBAAqB;KAClG,cAAc,eAAe;KAqB7B,MAAM,gBAAgB,MAAMC,0BAAAA,iBAAiB;MAnB3C,QAAQ,OAAO,OAAO,SAAS,sBAAsB;OACnD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;QACE,MAAM;QACN;QACA,SAAS,QAAQ,KAAK,WAAW;SAAE;SAAO,OAAO;QAAM,EAAE;OAC3D,GACA,iBACF;OACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;MACnD;MACA,OAAO,OAAO,OAAO,aAAa,sBAAsB;OACtD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;QAAE,MAAM;QAAS;QAAO,SAAS;OAAY,GAC7C,iBACF;OACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;MACnD;KAEqD,GAAG,QAAQ,eAAe,cAAc;KAC/F,cAAc,eAAe;KAC7B,OAAO;IACT,GAAG,MAAM;IACT,OAAO,OAAOC,0BAAAA,2BAA2B,QAAQ,MAAM,CAAC;GAC1D,UAAU;IACR,IAAI,gBAAgB,KAAA,GAAW;KAC7B,kBAAkB,SAAS;KAC3B,MAAM,kBAAkB,YAAY;IACtC;GACF;EACF;CAEQ;AACZ;;;AClEA,IAAA,kCAAA,GAAeC,qCAAAA,iBAAAA,EAAkB,YAC/B,0BAA0B,QAAQ,KAAK,WAAW,CACpD;;;ACCA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,SAAA,GAAQC,mCAAAA,mBAAAA,CAAmB;CACtC,MAAM;CACN,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAMC,oBAAY,OAAO;EAC9C,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,IAAA,GAAGC,qCAAAA,iBAAAA,CAAiB,YAAY;GAChC,IAAI,mBAAgE;IAAE,OAAO,CAAC,GAAGC,kCAAgC,cAAc,CAAC;GAAG;GACnI,IAAI,QAA0C;IAAE,OAAO,CAAC,IAAI,EAAE,MAAM,oBAAoB,GAAG,GAAGC,gCAAqB,cAAc,CAAC,CAAC;GAAG;GACtI,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAoD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACzG;CACF;AACF,CAAC"}