@agimon-ai/doompi-user-feedback 0.0.1-alpha.65 → 0.0.1-alpha.67

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.
@@ -1 +1 @@
1
- {"version":3,"file":"root.server.cjs","names":["defineRoot","QuestionnaireCoordinator"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/server-facet';\n\nimport { QuestionnaireCoordinator } from '../../../../../services/questionnaireCoordinator';\n\nconst root = defineRoot((_context: DoomServerPluginContext) => {\n const coordinator = new QuestionnaireCoordinator();\n return { value: { coordinator }, onDispose: () => coordinator.shutdown() };\n});\n\nexport type UserFeedbackServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n"],"mappings":";;AAKA,MAAM,QAAA,kDAAOA,CAAAA,CAAAA,WAAAA,EAAY,aAAsC;CAC7D,MAAM,cAAc,IAAIC,cAAAA,yBAAyB;CACjD,OAAO;EAAE,OAAO,EAAE,YAAY;EAAG,iBAAiB,YAAY,SAAS;CAAE;AAC3E,CAAC"}
1
+ {"version":3,"file":"root.server.cjs","names":["defineRoot","QuestionnaireCoordinator"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/server-facet';\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"],"mappings":";;AAKA,MAAM,QAAA,kDAAOA,CAAAA,CAAAA,WAAAA,EAAY,aAAsC;CAC7D,MAAM,cAAc,IAAIC,cAAAA,yBAAyB;CACjD,OAAO;EACL,OAAO,EAAE,YAAY;EACrB,iBAAiB,YAAY,SAAS;CACxC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"root.server.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/server-facet';\n\nimport { QuestionnaireCoordinator } from '../../../../../services/questionnaireCoordinator';\n\nconst root = defineRoot((_context: DoomServerPluginContext) => {\n const coordinator = new QuestionnaireCoordinator();\n return { value: { coordinator }, onDispose: () => coordinator.shutdown() };\n});\n\nexport type UserFeedbackServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n"],"mappings":";;;AAKA,MAAM,OAAO,YAAY,aAAsC;CAC7D,MAAM,cAAc,IAAI,yBAAyB;CACjD,OAAO;EAAE,OAAO,EAAE,YAAY;EAAG,iBAAiB,YAAY,SAAS;CAAE;AAC3E,CAAC"}
1
+ {"version":3,"file":"root.server.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/server-facet';\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"],"mappings":";;;AAKA,MAAM,OAAO,YAAY,aAAsC;CAC7D,MAAM,cAAc,IAAI,yBAAyB;CACjD,OAAO;EACL,OAAO,EAAE,YAAY;EACrB,iBAAiB,YAAY,SAAS;CACxC;AACF,CAAC"}
@@ -1,8 +1,9 @@
1
1
  const require_tool = require("../../../../../constants/tool.cjs");
2
+ const require_index = require("../../../../../services/questionnaireCoordinator/index.cjs");
2
3
  const require_questionnaire = require("../../../../../schemas/questionnaire.cjs");
3
- const require_index = require("../../../../../services/responseService/index.cjs");
4
- const require_index$1 = require("../../../../../services/questionnaireService/index.cjs");
5
- const require_index$2 = require("../../../../../services/validationService/index.cjs");
4
+ const require_index$1 = require("../../../../../services/responseService/index.cjs");
5
+ const require_index$2 = require("../../../../../services/questionnaireService/index.cjs");
6
+ const require_index$3 = require("../../../../../services/validationService/index.cjs");
6
7
  //#region src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts
7
8
  function output(result) {
8
9
  return {
@@ -20,39 +21,47 @@ function createAskUserHeadlessTool(coordinator) {
20
21
  executionMode: "serial",
21
22
  async execute(_toolCallId, parameters, signal, _onUpdate, executionContext) {
22
23
  const params = parameters;
23
- const validation = require_index$2.validateQuestionnaire(params);
24
- if (!validation.ok) return output(require_index.buildToolResult(validation.message, {
24
+ const validation = require_index$3.validateQuestionnaire(params);
25
+ if (!validation.ok) return output(require_index$1.buildToolResult(validation.message, {
25
26
  answers: [],
26
27
  cancelled: true,
27
28
  error: validation.error
28
29
  }));
29
- const result = await coordinator.enqueue(async ({ signal: requestSignal, reportProgress }) => {
30
- requestSignal.throwIfAborted();
31
- const questionnaire = await require_index$1.runQuestionnaire({
32
- select: async (title, options, interactionSignal) => {
33
- const response = await executionContext.client.request({
34
- kind: "select",
35
- title,
36
- options: options.map((label) => ({
37
- label,
38
- value: label
39
- }))
40
- }, interactionSignal);
41
- return typeof response === "string" ? response : void 0;
42
- },
43
- input: async (title, placeholder, interactionSignal) => {
44
- const response = await executionContext.client.request({
45
- kind: "input",
46
- title,
47
- message: placeholder
48
- }, interactionSignal);
49
- return typeof response === "string" ? response : void 0;
50
- }
51
- }, params, requestSignal, reportProgress);
52
- requestSignal.throwIfAborted();
53
- return questionnaire;
54
- }, signal);
55
- return output(require_index.buildQuestionnaireResponse(result, params));
30
+ const activeCoordinator = coordinator ?? new require_index.QuestionnaireCoordinator();
31
+ try {
32
+ const result = await activeCoordinator.enqueue(async ({ signal: requestSignal, reportProgress }) => {
33
+ requestSignal.throwIfAborted();
34
+ const questionnaire = await require_index$2.runQuestionnaire({
35
+ select: async (title, options, interactionSignal) => {
36
+ const response = await executionContext.client.request({
37
+ kind: "select",
38
+ title,
39
+ options: options.map((label) => ({
40
+ label,
41
+ value: label
42
+ }))
43
+ }, interactionSignal);
44
+ return typeof response === "string" ? response : void 0;
45
+ },
46
+ input: async (title, placeholder, interactionSignal) => {
47
+ const response = await executionContext.client.request({
48
+ kind: "input",
49
+ title,
50
+ message: placeholder
51
+ }, interactionSignal);
52
+ return typeof response === "string" ? response : void 0;
53
+ }
54
+ }, params, requestSignal, reportProgress);
55
+ requestSignal.throwIfAborted();
56
+ return questionnaire;
57
+ }, signal);
58
+ return output(require_index$1.buildQuestionnaireResponse(result, params));
59
+ } finally {
60
+ if (coordinator === void 0) {
61
+ activeCoordinator.shutdown();
62
+ await activeCoordinator.waitForIdle();
63
+ }
64
+ }
56
65
  }
57
66
  };
58
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"askUserHeadless.cjs","names":["ASK_USER_QUESTION_TOOL_NAME","QuestionParamsSchema","validateQuestionnaire","buildToolResult","runQuestionnaire","buildQuestionnaireResponse"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts"],"sourcesContent":["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 result = await coordinator.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 },\n };\n return tool;\n}\n"],"mappings":";;;;;;AAWA,SAAS,OAAO,QAGW;CACzB,OAAO;EAAE,SAAS,OAAO;EAAS,SAAS,OAAO;CAAQ;AAC5D;AAEA,SAAgB,0BACd,aAC+C;CA2C/C,OAAO;EAzCL,MAAMA,aAAAA;EACN,OAAO;EACP,aAAa;EACb,YAAYC,sBAAAA;EACZ,eAAe;EACf,eAAe;EACf,MAAM,QAAQ,aAAa,YAAY,QAAQ,WAAW,kBAAkB;GAC1E,MAAM,SAAS;GACf,MAAM,aAAaC,gBAAAA,sBAAsB,MAAM;GAC/C,IAAI,CAAC,WAAW,IACd,OAAO,OAAOC,cAAAA,gBAAgB,WAAW,SAAS;IAAE,SAAS,CAAC;IAAG,WAAW;IAAM,OAAO,WAAW;GAAM,CAAC,CAAC;GAE9G,MAAM,SAAS,MAAM,YAAY,QAAQ,OAAO,EAAE,QAAQ,eAAe,qBAAqB;IAC5F,cAAc,eAAe;IAqB7B,MAAM,gBAAgB,MAAMC,gBAAAA,iBAAiB;KAnB3C,QAAQ,OAAO,OAAO,SAAS,sBAAsB;MACnD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;OACE,MAAM;OACN;OACA,SAAS,QAAQ,KAAK,WAAW;QAAE;QAAO,OAAO;OAAM,EAAE;MAC3D,GACA,iBACF;MACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;KACnD;KACA,OAAO,OAAO,OAAO,aAAa,sBAAsB;MACtD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;OAAE,MAAM;OAAS;OAAO,SAAS;MAAY,GAC7C,iBACF;MACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;KACnD;IAEqD,GAAG,QAAQ,eAAe,cAAc;IAC/F,cAAc,eAAe;IAC7B,OAAO;GACT,GAAG,MAAM;GACT,OAAO,OAAOC,cAAAA,2BAA2B,QAAQ,MAAM,CAAC;EAC1D;CAEQ;AACZ"}
1
+ {"version":3,"file":"askUserHeadless.cjs","names":["ASK_USER_QUESTION_TOOL_NAME","QuestionParamsSchema","validateQuestionnaire","buildToolResult","QuestionnaireCoordinator","runQuestionnaire","buildQuestionnaireResponse"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts"],"sourcesContent":["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"],"mappings":";;;;;;;AAWA,SAAS,OAAO,QAGW;CACzB,OAAO;EAAE,SAAS,OAAO;EAAS,SAAS,OAAO;CAAQ;AAC5D;AAEA,SAAgB,0BACd,aAC+C;CAmD/C,OAAO;EAjDL,MAAMA,aAAAA;EACN,OAAO;EACP,aAAa;EACb,YAAYC,sBAAAA;EACZ,eAAe;EACf,eAAe;EACf,MAAM,QAAQ,aAAa,YAAY,QAAQ,WAAW,kBAAkB;GAC1E,MAAM,SAAS;GACf,MAAM,aAAaC,gBAAAA,sBAAsB,MAAM;GAC/C,IAAI,CAAC,WAAW,IACd,OAAO,OAAOC,gBAAAA,gBAAgB,WAAW,SAAS;IAAE,SAAS,CAAC;IAAG,WAAW;IAAM,OAAO,WAAW;GAAM,CAAC,CAAC;GAE9G,MAAM,oBAAoB,eAAe,IAAIC,cAAAA,yBAAyB;GACtE,IAAI;IACF,MAAM,SAAS,MAAM,kBAAkB,QAAQ,OAAO,EAAE,QAAQ,eAAe,qBAAqB;KAClG,cAAc,eAAe;KAqB7B,MAAM,gBAAgB,MAAMC,gBAAAA,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,gBAAAA,2BAA2B,QAAQ,MAAM,CAAC;GAC1D,UAAU;IACR,IAAI,gBAAgB,KAAA,GAAW;KAC7B,kBAAkB,SAAS;KAC3B,MAAM,kBAAkB,YAAY;IACtC;GACF;EACF;CAEQ;AACZ"}
@@ -1,4 +1,5 @@
1
1
  import { ASK_USER_QUESTION_TOOL_NAME } from "../../../../../constants/tool.mjs";
2
+ import { QuestionnaireCoordinator } from "../../../../../services/questionnaireCoordinator/index.mjs";
2
3
  import { QuestionParamsSchema } from "../../../../../schemas/questionnaire.mjs";
3
4
  import { buildQuestionnaireResponse, buildToolResult } from "../../../../../services/responseService/index.mjs";
4
5
  import { runQuestionnaire } from "../../../../../services/questionnaireService/index.mjs";
@@ -26,33 +27,41 @@ function createAskUserHeadlessTool(coordinator) {
26
27
  cancelled: true,
27
28
  error: validation.error
28
29
  }));
29
- const result = await coordinator.enqueue(async ({ signal: requestSignal, reportProgress }) => {
30
- requestSignal.throwIfAborted();
31
- const questionnaire = await runQuestionnaire({
32
- select: async (title, options, interactionSignal) => {
33
- const response = await executionContext.client.request({
34
- kind: "select",
35
- title,
36
- options: options.map((label) => ({
37
- label,
38
- value: label
39
- }))
40
- }, interactionSignal);
41
- return typeof response === "string" ? response : void 0;
42
- },
43
- input: async (title, placeholder, interactionSignal) => {
44
- const response = await executionContext.client.request({
45
- kind: "input",
46
- title,
47
- message: placeholder
48
- }, interactionSignal);
49
- return typeof response === "string" ? response : void 0;
50
- }
51
- }, params, requestSignal, reportProgress);
52
- requestSignal.throwIfAborted();
53
- return questionnaire;
54
- }, signal);
55
- return output(buildQuestionnaireResponse(result, params));
30
+ const activeCoordinator = coordinator ?? new QuestionnaireCoordinator();
31
+ try {
32
+ const result = await activeCoordinator.enqueue(async ({ signal: requestSignal, reportProgress }) => {
33
+ requestSignal.throwIfAborted();
34
+ const questionnaire = await runQuestionnaire({
35
+ select: async (title, options, interactionSignal) => {
36
+ const response = await executionContext.client.request({
37
+ kind: "select",
38
+ title,
39
+ options: options.map((label) => ({
40
+ label,
41
+ value: label
42
+ }))
43
+ }, interactionSignal);
44
+ return typeof response === "string" ? response : void 0;
45
+ },
46
+ input: async (title, placeholder, interactionSignal) => {
47
+ const response = await executionContext.client.request({
48
+ kind: "input",
49
+ title,
50
+ message: placeholder
51
+ }, interactionSignal);
52
+ return typeof response === "string" ? response : void 0;
53
+ }
54
+ }, params, requestSignal, reportProgress);
55
+ requestSignal.throwIfAborted();
56
+ return questionnaire;
57
+ }, signal);
58
+ return output(buildQuestionnaireResponse(result, params));
59
+ } finally {
60
+ if (coordinator === void 0) {
61
+ activeCoordinator.shutdown();
62
+ await activeCoordinator.waitForIdle();
63
+ }
64
+ }
56
65
  }
57
66
  };
58
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"askUserHeadless.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts"],"sourcesContent":["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 result = await coordinator.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 },\n };\n return tool;\n}\n"],"mappings":";;;;;;AAWA,SAAS,OAAO,QAGW;CACzB,OAAO;EAAE,SAAS,OAAO;EAAS,SAAS,OAAO;CAAQ;AAC5D;AAEA,SAAgB,0BACd,aAC+C;CA2C/C,OAAO;EAzCL,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY;EACZ,eAAe;EACf,eAAe;EACf,MAAM,QAAQ,aAAa,YAAY,QAAQ,WAAW,kBAAkB;GAC1E,MAAM,SAAS;GACf,MAAM,aAAa,sBAAsB,MAAM;GAC/C,IAAI,CAAC,WAAW,IACd,OAAO,OAAO,gBAAgB,WAAW,SAAS;IAAE,SAAS,CAAC;IAAG,WAAW;IAAM,OAAO,WAAW;GAAM,CAAC,CAAC;GAE9G,MAAM,SAAS,MAAM,YAAY,QAAQ,OAAO,EAAE,QAAQ,eAAe,qBAAqB;IAC5F,cAAc,eAAe;IAqB7B,MAAM,gBAAgB,MAAM,iBAAiB;KAnB3C,QAAQ,OAAO,OAAO,SAAS,sBAAsB;MACnD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;OACE,MAAM;OACN;OACA,SAAS,QAAQ,KAAK,WAAW;QAAE;QAAO,OAAO;OAAM,EAAE;MAC3D,GACA,iBACF;MACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;KACnD;KACA,OAAO,OAAO,OAAO,aAAa,sBAAsB;MACtD,MAAM,WAAW,MAAM,iBAAiB,OAAO,QAC7C;OAAE,MAAM;OAAS;OAAO,SAAS;MAAY,GAC7C,iBACF;MACA,OAAO,OAAO,aAAa,WAAW,WAAW,KAAA;KACnD;IAEqD,GAAG,QAAQ,eAAe,cAAc;IAC/F,cAAc,eAAe;IAC7B,OAAO;GACT,GAAG,MAAM;GACT,OAAO,OAAO,2BAA2B,QAAQ,MAAM,CAAC;EAC1D;CAEQ;AACZ"}
1
+ {"version":3,"file":"askUserHeadless.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_tools/askUserHeadless.ts"],"sourcesContent":["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"],"mappings":";;;;;;;AAWA,SAAS,OAAO,QAGW;CACzB,OAAO;EAAE,SAAS,OAAO;EAAS,SAAS,OAAO;CAAQ;AAC5D;AAEA,SAAgB,0BACd,aAC+C;CAmD/C,OAAO;EAjDL,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY;EACZ,eAAe;EACf,eAAe;EACf,MAAM,QAAQ,aAAa,YAAY,QAAQ,WAAW,kBAAkB;GAC1E,MAAM,SAAS;GACf,MAAM,aAAa,sBAAsB,MAAM;GAC/C,IAAI,CAAC,WAAW,IACd,OAAO,OAAO,gBAAgB,WAAW,SAAS;IAAE,SAAS,CAAC;IAAG,WAAW;IAAM,OAAO,WAAW;GAAM,CAAC,CAAC;GAE9G,MAAM,oBAAoB,eAAe,IAAI,yBAAyB;GACtE,IAAI;IACF,MAAM,SAAS,MAAM,kBAAkB,QAAQ,OAAO,EAAE,QAAQ,eAAe,qBAAqB;KAClG,cAAc,eAAe;KAqB7B,MAAM,gBAAgB,MAAM,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,OAAO,2BAA2B,QAAQ,MAAM,CAAC;GAC1D,UAAU;IACR,IAAI,gBAAgB,KAAA,GAAW;KAC7B,kBAAkB,SAAS;KAC3B,MAAM,kBAAkB,YAAY;IACtC;GACF;EACF;CAEQ;AACZ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-user-feedback",
3
- "version": "0.0.1-alpha.65",
3
+ "version": "0.0.1-alpha.67",
4
4
  "description": "Structured user questions with interactive and autonomous Voice handoff for Pi agents.",
5
5
  "keywords": [
6
6
  "ai",
@@ -66,18 +66,18 @@
66
66
  "access": "public"
67
67
  },
68
68
  "dependencies": {
69
- "@agimon-ai/doompi-core": "0.0.1-alpha.76",
70
- "@agimon-ai/doompi-minor-mode": "0.0.1-alpha.76",
71
- "@agimon-ai/doompi-ui": "0.0.1-alpha.76",
72
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.34",
69
+ "@agimon-ai/doompi-core": "0.0.1-alpha.78",
70
+ "@agimon-ai/doompi-minor-mode": "0.0.1-alpha.78",
71
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.78",
72
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.36",
73
73
  "@deepseek-ai/cordis": "4.0.2",
74
74
  "typebox": "1.3.30"
75
75
  },
76
76
  "devDependencies": {
77
- "@agimon-ai/doompi-build": "0.0.1-alpha.5",
78
- "@agimon-ai/doompi-voice": "0.0.1-alpha.77",
79
- "@earendil-works/pi-coding-agent": "0.85.1",
80
- "@earendil-works/pi-tui": "0.85.1",
77
+ "@agimon-ai/doompi-build": "0.0.1-alpha.7",
78
+ "@agimon-ai/doompi-voice": "0.0.1-alpha.79",
79
+ "@earendil-works/pi-coding-agent": "0.86.0",
80
+ "@earendil-works/pi-tui": "0.86.0",
81
81
  "@tanstack/react-store": "0.11.1",
82
82
  "@tanstack/store": "0.11.1",
83
83
  "@types/node": "26.5.1",
@@ -90,8 +90,8 @@
90
90
  "vitest": "5.0.0"
91
91
  },
92
92
  "peerDependencies": {
93
- "@earendil-works/pi-coding-agent": "0.85.1",
94
- "@earendil-works/pi-tui": "0.85.1"
93
+ "@earendil-works/pi-coding-agent": "0.86.0",
94
+ "@earendil-works/pi-tui": "0.86.0"
95
95
  },
96
96
  "peerDependenciesMeta": {
97
97
  "@earendil-works/pi-coding-agent": {