@agimon-ai/doompi 0.0.1-alpha.86 → 0.0.1-alpha.88

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.
Files changed (77) hide show
  1. package/dist/commands.cjs +19 -18
  2. package/dist/commands.d.mts +2 -1
  3. package/dist/commands.mjs +2 -1
  4. package/dist/doctorCommand.cjs +1 -0
  5. package/dist/doctorCommand.d.mts +2 -2
  6. package/dist/doctorCommand.mjs +2 -2
  7. package/dist/extensions/contextCatalog.cjs +38 -1
  8. package/dist/extensions/contextCatalog.cjs.map +1 -1
  9. package/dist/extensions/contextCatalog.mjs +37 -2
  10. package/dist/extensions/contextCatalog.mjs.map +1 -1
  11. package/dist/extensions/server.cjs +10 -1
  12. package/dist/extensions/server.cjs.map +1 -1
  13. package/dist/extensions/server.d.mts.map +1 -1
  14. package/dist/extensions/server.mjs +10 -1
  15. package/dist/extensions/server.mjs.map +1 -1
  16. package/dist/extensions/styleSystem.cjs +1 -1
  17. package/dist/extensions/styleSystem.mjs +1 -1
  18. package/dist/extensions/terminalChildSession.cjs +2 -1
  19. package/dist/extensions/terminalChildSession.cjs.map +1 -1
  20. package/dist/extensions/terminalChildSession.d.mts.map +1 -1
  21. package/dist/extensions/terminalChildSession.mjs +3 -2
  22. package/dist/extensions/terminalChildSession.mjs.map +1 -1
  23. package/dist/extensions/transitionCoordinator.cjs +1 -1
  24. package/dist/extensions/transitionCoordinator.mjs +1 -1
  25. package/dist/index.cjs +49 -48
  26. package/dist/index.d.mts +2 -1
  27. package/dist/index.mjs +5 -4
  28. package/dist/services.cjs +13 -13
  29. package/dist/services.mjs +2 -2
  30. package/dist/src/builders/cli/prepare.cjs +1 -1
  31. package/dist/src/builders/cli/prepare.mjs +1 -1
  32. package/dist/src/builders/server/computerUseBinding.cjs +166 -0
  33. package/dist/src/builders/server/computerUseBinding.cjs.map +1 -0
  34. package/dist/src/builders/server/computerUseBinding.mjs +166 -0
  35. package/dist/src/builders/server/computerUseBinding.mjs.map +1 -0
  36. package/dist/src/builders/server/runtime.cjs +17 -2
  37. package/dist/src/builders/server/runtime.cjs.map +1 -1
  38. package/dist/src/builders/server/runtime.mjs +17 -2
  39. package/dist/src/builders/server/runtime.mjs.map +1 -1
  40. package/dist/src/cli/commands/doctor/index.cjs +53 -18
  41. package/dist/src/cli/commands/doctor/index.cjs.map +1 -1
  42. package/dist/src/cli/commands/doctor/index.d.mts +13 -0
  43. package/dist/src/cli/commands/doctor/index.d.mts.map +1 -1
  44. package/dist/src/cli/commands/doctor/index.mjs +49 -15
  45. package/dist/src/cli/commands/doctor/index.mjs.map +1 -1
  46. package/dist/src/cli/commands/sync/index.cjs +36 -142
  47. package/dist/src/cli/commands/sync/index.cjs.map +1 -1
  48. package/dist/src/cli/commands/sync/index.d.mts +3 -18
  49. package/dist/src/cli/commands/sync/index.d.mts.map +1 -1
  50. package/dist/src/cli/commands/sync/index.mjs +11 -117
  51. package/dist/src/cli/commands/sync/index.mjs.map +1 -1
  52. package/dist/src/cli/commands/sync/inspection.cjs +128 -0
  53. package/dist/src/cli/commands/sync/inspection.cjs.map +1 -0
  54. package/dist/src/cli/commands/sync/inspection.d.mts +14 -0
  55. package/dist/src/cli/commands/sync/inspection.d.mts.map +1 -0
  56. package/dist/src/cli/commands/sync/inspection.mjs +119 -0
  57. package/dist/src/cli/commands/sync/inspection.mjs.map +1 -0
  58. package/dist/src/cli/commands/sync/prepare.cjs +2 -1
  59. package/dist/src/cli/commands/sync/prepare.cjs.map +1 -1
  60. package/dist/src/cli/commands/sync/prepare.mjs +2 -1
  61. package/dist/src/cli/commands/sync/prepare.mjs.map +1 -1
  62. package/dist/src/cli/commands/sync/workflow.cjs +3 -2
  63. package/dist/src/cli/commands/sync/workflow.cjs.map +1 -1
  64. package/dist/src/cli/commands/sync/workflow.mjs +2 -1
  65. package/dist/src/cli/commands/sync/workflow.mjs.map +1 -1
  66. package/dist/src/compiler/index.cjs +1 -1
  67. package/dist/src/compiler/index.mjs +1 -1
  68. package/dist/src/composition/harnessState/index.d.mts +3 -3
  69. package/dist/src/composition/harnessState/index.mjs +3 -3
  70. package/dist/src/extensions/setupDiagnostics.cjs +65 -0
  71. package/dist/src/extensions/setupDiagnostics.cjs.map +1 -0
  72. package/dist/src/extensions/setupDiagnostics.mjs +64 -0
  73. package/dist/src/extensions/setupDiagnostics.mjs.map +1 -0
  74. package/dist/syncCommand.cjs +6 -5
  75. package/dist/syncCommand.d.mts +3 -2
  76. package/dist/syncCommand.mjs +2 -1
  77. package/package.json +17 -17
package/dist/commands.cjs CHANGED
@@ -1,23 +1,24 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_baseCommand = require("./src/cli/commands/baseCommand.cjs");
3
3
  const require_index = require("./src/cli/commands/compat/index.cjs");
4
- const require_index$1 = require("./src/cli/commands/sync/index.cjs");
5
- const require_index$2 = require("./src/cli/commands/doctor/index.cjs");
6
- const require_index$3 = require("./src/cli/commands/emit-mcp/index.cjs");
7
- const require_index$4 = require("./src/cli/commands/explain/index.cjs");
8
- const require_index$5 = require("./src/cli/commands/init/index.cjs");
9
- const require_index$6 = require("./src/cli/commands/launch/index.cjs");
4
+ const require_inspection = require("./src/cli/commands/sync/inspection.cjs");
5
+ const require_index$1 = require("./src/cli/commands/doctor/index.cjs");
6
+ const require_index$2 = require("./src/cli/commands/emit-mcp/index.cjs");
7
+ const require_index$3 = require("./src/cli/commands/explain/index.cjs");
8
+ const require_index$4 = require("./src/cli/commands/init/index.cjs");
9
+ const require_index$5 = require("./src/cli/commands/launch/index.cjs");
10
+ const require_index$6 = require("./src/cli/commands/sync/index.cjs");
10
11
  exports.BaseCommand = require_baseCommand.BaseCommand;
11
12
  exports.CompatibilityCommand = require_index.CompatibilityCommand;
12
- exports.DoctorCommand = require_index$2.DoctorCommand;
13
- exports.EmitMcpCommand = require_index$3.EmitMcpCommand;
14
- exports.ExplainCommand = require_index$4.ExplainCommand;
15
- exports.InitCommand = require_index$5.InitCommand;
16
- exports.LaunchCommand = require_index$6.LaunchCommand;
17
- exports.SyncCommand = require_index$1.SyncCommand;
18
- exports.collectDrift = require_index$1.collectDrift;
19
- exports.explainMatrix = require_index$4.explainMatrix;
20
- exports.formatSyncResult = require_index$1.formatSyncResult;
21
- exports.recordedEnvironment = require_index$1.recordedEnvironment;
22
- exports.selectionEnvironment = require_index$1.selectionEnvironment;
23
- exports.toSelection = require_index$1.toSelection;
13
+ exports.DoctorCommand = require_index$1.DoctorCommand;
14
+ exports.EmitMcpCommand = require_index$2.EmitMcpCommand;
15
+ exports.ExplainCommand = require_index$3.ExplainCommand;
16
+ exports.InitCommand = require_index$4.InitCommand;
17
+ exports.LaunchCommand = require_index$5.LaunchCommand;
18
+ exports.SyncCommand = require_index$6.SyncCommand;
19
+ exports.collectDrift = require_inspection.collectDrift;
20
+ exports.explainMatrix = require_index$3.explainMatrix;
21
+ exports.formatSyncResult = require_index$6.formatSyncResult;
22
+ exports.recordedEnvironment = require_index$6.recordedEnvironment;
23
+ exports.selectionEnvironment = require_inspection.selectionEnvironment;
24
+ exports.toSelection = require_inspection.toSelection;
@@ -5,5 +5,6 @@ import { EmitMcpCommand } from "./src/cli/commands/emit-mcp/index.mjs";
5
5
  import { ExplainCommand, MatrixExplanation, explainMatrix } from "./src/cli/commands/explain/index.mjs";
6
6
  import { InitCommand } from "./src/cli/commands/init/index.mjs";
7
7
  import { LaunchCommand } from "./src/cli/commands/launch/index.mjs";
8
- import { SyncCommand, SyncCommandOptions, SyncResult, SyncSettingsMode, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection } from "./src/cli/commands/sync/index.mjs";
8
+ import { SyncSettingsMode, collectDrift, selectionEnvironment, toSelection } from "./src/cli/commands/sync/inspection.mjs";
9
+ import { SyncCommand, SyncCommandOptions, SyncResult, formatSyncResult, recordedEnvironment } from "./src/cli/commands/sync/index.mjs";
9
10
  export { BaseCommand, CompatibilityCommand, DoctorCommand, type DoctorOutput, EmitMcpCommand, ExplainCommand, InitCommand, LaunchCommand, type MatrixExplanation, SyncCommand, type SyncCommandOptions, type SyncResult, type SyncSettingsMode, collectDrift, explainMatrix, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
package/dist/commands.mjs CHANGED
@@ -1,9 +1,10 @@
1
1
  import { BaseCommand } from "./src/cli/commands/baseCommand.mjs";
2
2
  import { CompatibilityCommand } from "./src/cli/commands/compat/index.mjs";
3
- import { SyncCommand, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection } from "./src/cli/commands/sync/index.mjs";
3
+ import { collectDrift, selectionEnvironment, toSelection } from "./src/cli/commands/sync/inspection.mjs";
4
4
  import { DoctorCommand } from "./src/cli/commands/doctor/index.mjs";
5
5
  import { EmitMcpCommand } from "./src/cli/commands/emit-mcp/index.mjs";
6
6
  import { ExplainCommand, explainMatrix } from "./src/cli/commands/explain/index.mjs";
7
7
  import { InitCommand } from "./src/cli/commands/init/index.mjs";
8
8
  import { LaunchCommand } from "./src/cli/commands/launch/index.mjs";
9
+ import { SyncCommand, formatSyncResult, recordedEnvironment } from "./src/cli/commands/sync/index.mjs";
9
10
  export { BaseCommand, CompatibilityCommand, DoctorCommand, EmitMcpCommand, ExplainCommand, InitCommand, LaunchCommand, SyncCommand, collectDrift, explainMatrix, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_index = require("./src/cli/commands/doctor/index.cjs");
3
3
  exports.DoctorCommand = require_index.DoctorCommand;
4
+ exports.collectDoctorReport = require_index.collectDoctorReport;
4
5
  exports.runDoctor = require_index.runDoctor;
@@ -1,2 +1,2 @@
1
- import { DoctorCommand, DoctorOutput, runDoctor } from "./src/cli/commands/doctor/index.mjs";
2
- export { DoctorCommand, DoctorOutput, runDoctor };
1
+ import { DoctorCommand, DoctorOutput, collectDoctorReport, runDoctor } from "./src/cli/commands/doctor/index.mjs";
2
+ export { DoctorCommand, DoctorOutput, collectDoctorReport, runDoctor };
@@ -1,2 +1,2 @@
1
- import { DoctorCommand, runDoctor } from "./src/cli/commands/doctor/index.mjs";
2
- export { DoctorCommand, runDoctor };
1
+ import { DoctorCommand, collectDoctorReport, runDoctor } from "./src/cli/commands/doctor/index.mjs";
2
+ export { DoctorCommand, collectDoctorReport, runDoctor };
@@ -1,4 +1,11 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
1
2
  const require_contextCatalog = require("../src/builders/cli/contextCatalog.cjs");
3
+ const require_setupDiagnostics = require("../src/extensions/setupDiagnostics.cjs");
4
+ let node_os = require("node:os");
5
+ node_os = require_runtime.__toESM(node_os, 1);
6
+ let _agimon_ai_doompi_config_harnessStore = require("@agimon-ai/doompi-config/harnessStore");
7
+ let _agimon_ai_doompi_config_piContext = require("@agimon-ai/doompi-config/piContext");
8
+ let _agimon_ai_doompi_core_config = require("@agimon-ai/doompi-core/config");
2
9
  let _agimon_ai_doompi_core_contextDetailStore = require("@agimon-ai/doompi-core/contextDetailStore");
3
10
  let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
4
11
  let _agimon_ai_doompi_core_help = require("@agimon-ai/doompi-core/help");
@@ -9,6 +16,8 @@ let _agimon_ai_doompi_minor_mode = require("@agimon-ai/doompi-minor-mode");
9
16
  const HELP_CONTRIBUTION_SOURCE = "@agimon-ai/doompi";
10
17
  var contextCatalog_default = (0, _agimon_ai_doompi_core_piExtension.definePiExtension)("@agimon-ai/doompi/context-catalog", ({ pi }) => {
11
18
  let publisher;
19
+ let readSetupScope;
20
+ const helpGate = (0, _agimon_ai_doompi_core_help.createPiHelpToolGate)(HELP_CONTRIBUTION_SOURCE, [require_setupDiagnostics.DIAGNOSE_SETUP_NAME]);
12
21
  /**
13
22
  * A handler's context, kept so the prompt can be read when the composition is
14
23
  * published rather than only when an event fires.
@@ -22,6 +31,29 @@ var contextCatalog_default = (0, _agimon_ai_doompi_core_piExtension.definePiExte
22
31
  /** Pi hands out the base prompt until a turn replaces it with the one it sent. */
23
32
  let turned = false;
24
33
  const bind = (cordis) => {
34
+ cordis.inject([_agimon_ai_doompi_core_config.DOOM_CONFIG_SERVICE, _agimon_ai_doompi_core_cordisHost.DOOM_CORDIS_SESSION_SERVICE], (context) => {
35
+ const session = context.get(_agimon_ai_doompi_core_cordisHost.DOOM_CORDIS_SESSION_SERVICE);
36
+ const read = () => {
37
+ const harness = (0, _agimon_ai_doompi_config_piContext.requireDoomConfigContext)(context).harness;
38
+ return {
39
+ repoRoot: (0, _agimon_ai_doompi_config_harnessStore.requireHarnessRoot)(harness),
40
+ cwd: session.context.cwd,
41
+ environment: {
42
+ HOME: node_os.default.homedir(),
43
+ ...harness.profileEnvironment
44
+ },
45
+ selection: {
46
+ majorMode: harness.majorMode,
47
+ domains: [...harness.domains],
48
+ profile: harness.profile
49
+ }
50
+ };
51
+ };
52
+ readSetupScope = read;
53
+ return () => {
54
+ if (readSetupScope === read) readSetupScope = void 0;
55
+ };
56
+ });
25
57
  cordis.inject([_agimon_ai_doompi_core_help.DOOM_HELP_SERVICE], (helpContext) => {
26
58
  const contribution = (0, _agimon_ai_doompi_core_help.requireDoomHelpService)(helpContext).register({
27
59
  source: HELP_CONTRIBUTION_SOURCE,
@@ -76,7 +108,12 @@ var contextCatalog_default = (0, _agimon_ai_doompi_core_piExtension.definePiExte
76
108
  });
77
109
  };
78
110
  return {
79
- services: [bind],
111
+ services: [...helpGate.services, bind],
112
+ tools: [require_setupDiagnostics.createSetupDiagnosticsTool(() => {
113
+ if (!readSetupScope) throw new Error("Setup diagnostics require the current session configuration.");
114
+ return readSetupScope();
115
+ }, (signal) => helpGate.assertActive(require_setupDiagnostics.DIAGNOSE_SETUP_NAME, signal))],
116
+ onStart: helpGate.onStart,
80
117
  events: {
81
118
  session_start(_event, ctx) {
82
119
  promptContext = ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"contextCatalog.cjs","names":["definePiExtension","DOOM_HELP_SERVICE","requireDoomHelpService","DOOM_CORDIS_SESSION_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","requireMinorModeCatalog","createContextPublisher","writeContextDetail","removeContextDetail","DOOM_MCP_STATUS_SERVICE","readDoomMcpStatus"],"sources":["../../src/extensions/contextCatalog.ts"],"sourcesContent":["import { removeContextDetail, writeContextDetail } from '@agimon-ai/doompi-core/contextDetailStore';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { DOOM_MCP_STATUS_SERVICE, readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { definePiExtension } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createContextPublisher, type ContextPublisher } from '../builders/cli/contextCatalog';\nconst HELP_CONTRIBUTION_SOURCE = '@agimon-ai/doompi';\nexport default definePiExtension('@agimon-ai/doompi/context-catalog', ({ pi }) => {\n let publisher: ContextPublisher | undefined;\n /**\n * A handler's context, kept so the prompt can be read when the composition is\n * published rather than only when an event fires.\n *\n * `getSystemPrompt` reads the session's live state and refuses only once the\n * runner has been replaced, so a retained context answers for the session it\n * came from or throws. Publishing happens on a timer and on catalog changes,\n * neither of which carries a context of its own.\n */\n let promptContext: { getSystemPrompt: () => string } | undefined;\n /** Pi hands out the base prompt until a turn replaces it with the one it sent. */\n let turned = false;\n const bind = (cordis: Context): void => {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: HELP_CONTRIBUTION_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-extension',\n description:\n 'Create or update a DoomPi extension package inside the DoomPi monorepo or as an external npm package. Use for package layout, Pi discovery entries, shared Cordis lifecycle, package-owned Help, and extension verification.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const catalog = requireMinorModeCatalog(context);\n const current = createContextPublisher(pi, context, {\n readMinorModes: () =>\n catalog\n .getSnapshot()\n .modes.filter(({ state }) => state.activation === 'active')\n .map(({ descriptor }) => ({ id: descriptor.id, label: descriptor.label })),\n readSessionId: () => session.sessionId,\n writeDetail: (sessionId, revision, items) => void writeContextDetail(sessionId, revision, items),\n removeDetail: removeContextDetail,\n readSystemPrompt: () => {\n try {\n const text = promptContext?.getSystemPrompt();\n return text === undefined || text === '' ? undefined : { text, stage: turned ? 'effective' : 'base' };\n } catch {\n // A context from a retired runner is stale, not fatal: the panel\n // reports no prompt until the next event hands over a live one.\n return undefined;\n }\n },\n });\n publisher = current;\n const publish = () => {\n void current.publish();\n };\n const unsubscribe = catalog.subscribe(publish);\n const timer = setTimeout(publish, 500);\n context.inject([DOOM_MCP_STATUS_SERVICE], (mcpContext) => {\n const release = readDoomMcpStatus(mcpContext)?.onChange?.(publish);\n publish();\n return release;\n });\n return () => {\n clearTimeout(timer);\n unsubscribe();\n current.dispose();\n if (publisher === current) publisher = undefined;\n };\n });\n };\n return {\n services: [bind],\n events: {\n session_start(_event, ctx) {\n promptContext = ctx;\n void publisher?.publish();\n },\n turn_start(_event, ctx) {\n promptContext = ctx;\n turned = true;\n void publisher?.publish();\n },\n },\n };\n});\n"],"mappings":";;;;;;;;AASA,MAAM,2BAA2B;AACjC,IAAA,0BAAA,GAAeA,mCAAAA,kBAAAA,CAAkB,sCAAsC,EAAE,SAAS;CAChF,IAAI;;;;;;;;;;CAUJ,IAAI;;CAEJ,IAAI,SAAS;CACb,MAAM,QAAQ,WAA0B;EACtC,OAAO,OAAO,CAACC,4BAAAA,iBAAiB,IAAI,gBAAgB;GAClD,MAAM,gBAAA,GAAeC,4BAAAA,uBAAAA,CAAuB,WAAW,CAAC,CAAC,SAAS;IAChE,QAAQ;IACR,WAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA;IACA,QAAQ,CACN;KACE,MAAM;KACN,aACE;IACJ,CACF;GACF,CAAC;GACD,aAAa,aAAa,QAAQ;EACpC,CAAC;EAED,OAAO,OAAO,CAACC,kCAAAA,6BAA6BC,6BAAAA,+BAA+B,IAAI,YAAY;GACzF,MAAM,UAAU,QAAQ,IAAID,kCAAAA,2BAA2B;GACvD,MAAM,WAAA,GAAUE,6BAAAA,wBAAAA,CAAwB,OAAO;GAC/C,MAAM,UAAUC,uBAAAA,uBAAuB,IAAI,SAAS;IAClD,sBACE,QACG,YAAY,CAAC,CACb,MAAM,QAAQ,EAAE,YAAY,MAAM,eAAe,QAAQ,CAAC,CAC1D,KAAK,EAAE,kBAAkB;KAAE,IAAI,WAAW;KAAI,OAAO,WAAW;IAAM,EAAE;IAC7E,qBAAqB,QAAQ;IAC7B,cAAc,WAAW,UAAU,UAAU,MAAA,GAAKC,0CAAAA,mBAAAA,CAAmB,WAAW,UAAU,KAAK;IAC/F,cAAcC,0CAAAA;IACd,wBAAwB;KACtB,IAAI;MACF,MAAM,OAAO,eAAe,gBAAgB;MAC5C,OAAO,SAAS,KAAA,KAAa,SAAS,KAAK,KAAA,IAAY;OAAE;OAAM,OAAO,SAAS,cAAc;MAAO;KACtG,QAAQ;MAGN;KACF;IACF;GACF,CAAC;GACD,YAAY;GACZ,MAAM,gBAAgB;IACpB,QAAa,QAAQ;GACvB;GACA,MAAM,cAAc,QAAQ,UAAU,OAAO;GAC7C,MAAM,QAAQ,WAAW,SAAS,GAAG;GACrC,QAAQ,OAAO,CAACC,iCAAAA,uBAAuB,IAAI,eAAe;IACxD,MAAM,WAAA,GAAUC,iCAAAA,kBAAAA,CAAkB,UAAU,CAAC,EAAE,WAAW,OAAO;IACjE,QAAQ;IACR,OAAO;GACT,CAAC;GACD,aAAa;IACX,aAAa,KAAK;IAClB,YAAY;IACZ,QAAQ,QAAQ;IAChB,IAAI,cAAc,SAAS,YAAY,KAAA;GACzC;EACF,CAAC;CACH;CACA,OAAO;EACL,UAAU,CAAC,IAAI;EACf,QAAQ;GACN,cAAc,QAAQ,KAAK;IACzB,gBAAgB;IAChB,WAAgB,QAAQ;GAC1B;GACA,WAAW,QAAQ,KAAK;IACtB,gBAAgB;IAChB,SAAS;IACT,WAAgB,QAAQ;GAC1B;EACF;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"contextCatalog.cjs","names":["definePiExtension","createPiHelpToolGate","DIAGNOSE_SETUP_NAME","DOOM_CONFIG_SERVICE","DOOM_CORDIS_SESSION_SERVICE","requireDoomConfigContext","requireHarnessRoot","os","DOOM_HELP_SERVICE","requireDoomHelpService","DOOM_MINOR_MODE_CATALOG_SERVICE","requireMinorModeCatalog","createContextPublisher","writeContextDetail","removeContextDetail","DOOM_MCP_STATUS_SERVICE","readDoomMcpStatus","createSetupDiagnosticsTool"],"sources":["../../src/extensions/contextCatalog.ts"],"sourcesContent":["import os from 'node:os';\n\nimport { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { removeContextDetail, writeContextDetail } from '@agimon-ai/doompi-core/contextDetailStore';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { createPiHelpToolGate } from '@agimon-ai/doompi-core/help';\nimport { DOOM_MCP_STATUS_SERVICE, readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { definePiExtension } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createContextPublisher, type ContextPublisher } from '../builders/cli/contextCatalog';\nimport { createSetupDiagnosticsTool, DIAGNOSE_SETUP_NAME, type SetupDiagnosticScope } from './setupDiagnostics';\n\nconst HELP_CONTRIBUTION_SOURCE = '@agimon-ai/doompi';\nexport default definePiExtension('@agimon-ai/doompi/context-catalog', ({ pi }) => {\n let publisher: ContextPublisher | undefined;\n let readSetupScope: (() => SetupDiagnosticScope) | undefined;\n const helpGate = createPiHelpToolGate(HELP_CONTRIBUTION_SOURCE, [DIAGNOSE_SETUP_NAME]);\n /**\n * A handler's context, kept so the prompt can be read when the composition is\n * published rather than only when an event fires.\n *\n * `getSystemPrompt` reads the session's live state and refuses only once the\n * runner has been replaced, so a retained context answers for the session it\n * came from or throws. Publishing happens on a timer and on catalog changes,\n * neither of which carries a context of its own.\n */\n let promptContext: { getSystemPrompt: () => string } | undefined;\n /** Pi hands out the base prompt until a turn replaces it with the one it sent. */\n let turned = false;\n const bind = (cordis: Context): void => {\n cordis.inject([DOOM_CONFIG_SERVICE, DOOM_CORDIS_SESSION_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const read = (): SetupDiagnosticScope => {\n const harness = requireDoomConfigContext(context).harness;\n return {\n repoRoot: requireHarnessRoot(harness),\n cwd: session.context.cwd,\n environment: { HOME: os.homedir(), ...harness.profileEnvironment },\n selection: { majorMode: harness.majorMode, domains: [...harness.domains], profile: harness.profile },\n };\n };\n readSetupScope = read;\n return () => {\n if (readSetupScope === read) readSetupScope = undefined;\n };\n });\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: HELP_CONTRIBUTION_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-extension',\n description:\n 'Create or update a DoomPi extension package inside the DoomPi monorepo or as an external npm package. Use for package layout, Pi discovery entries, shared Cordis lifecycle, package-owned Help, and extension verification.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const catalog = requireMinorModeCatalog(context);\n const current = createContextPublisher(pi, context, {\n readMinorModes: () =>\n catalog\n .getSnapshot()\n .modes.filter(({ state }) => state.activation === 'active')\n .map(({ descriptor }) => ({ id: descriptor.id, label: descriptor.label })),\n readSessionId: () => session.sessionId,\n writeDetail: (sessionId, revision, items) => void writeContextDetail(sessionId, revision, items),\n removeDetail: removeContextDetail,\n readSystemPrompt: () => {\n try {\n const text = promptContext?.getSystemPrompt();\n return text === undefined || text === '' ? undefined : { text, stage: turned ? 'effective' : 'base' };\n } catch {\n // A context from a retired runner is stale, not fatal: the panel\n // reports no prompt until the next event hands over a live one.\n return undefined;\n }\n },\n });\n publisher = current;\n const publish = () => {\n void current.publish();\n };\n const unsubscribe = catalog.subscribe(publish);\n const timer = setTimeout(publish, 500);\n context.inject([DOOM_MCP_STATUS_SERVICE], (mcpContext) => {\n const release = readDoomMcpStatus(mcpContext)?.onChange?.(publish);\n publish();\n return release;\n });\n return () => {\n clearTimeout(timer);\n unsubscribe();\n current.dispose();\n if (publisher === current) publisher = undefined;\n };\n });\n };\n return {\n services: [...helpGate.services, bind],\n tools: [\n createSetupDiagnosticsTool(\n () => {\n if (!readSetupScope) throw new Error('Setup diagnostics require the current session configuration.');\n return readSetupScope();\n },\n (signal) => helpGate.assertActive(DIAGNOSE_SETUP_NAME, signal),\n ),\n ],\n onStart: helpGate.onStart,\n events: {\n session_start(_event, ctx) {\n promptContext = ctx;\n void publisher?.publish();\n },\n turn_start(_event, ctx) {\n promptContext = ctx;\n turned = true;\n void publisher?.publish();\n },\n },\n };\n});\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAM,2BAA2B;AACjC,IAAA,0BAAA,GAAeA,mCAAAA,kBAAAA,CAAkB,sCAAsC,EAAE,SAAS;CAChF,IAAI;CACJ,IAAI;CACJ,MAAM,YAAA,GAAWC,4BAAAA,qBAAAA,CAAqB,0BAA0B,CAACC,yBAAAA,mBAAmB,CAAC;;;;;;;;;;CAUrF,IAAI;;CAEJ,IAAI,SAAS;CACb,MAAM,QAAQ,WAA0B;EACtC,OAAO,OAAO,CAACC,8BAAAA,qBAAqBC,kCAAAA,2BAA2B,IAAI,YAAY;GAC7E,MAAM,UAAU,QAAQ,IAAIA,kCAAAA,2BAA2B;GACvD,MAAM,aAAmC;IACvC,MAAM,WAAA,GAAUC,mCAAAA,yBAAAA,CAAyB,OAAO,CAAC,CAAC;IAClD,OAAO;KACL,WAAA,GAAUC,sCAAAA,mBAAAA,CAAmB,OAAO;KACpC,KAAK,QAAQ,QAAQ;KACrB,aAAa;MAAE,MAAMC,QAAAA,QAAG,QAAQ;MAAG,GAAG,QAAQ;KAAmB;KACjE,WAAW;MAAE,WAAW,QAAQ;MAAW,SAAS,CAAC,GAAG,QAAQ,OAAO;MAAG,SAAS,QAAQ;KAAQ;IACrG;GACF;GACA,iBAAiB;GACjB,aAAa;IACX,IAAI,mBAAmB,MAAM,iBAAiB,KAAA;GAChD;EACF,CAAC;EACD,OAAO,OAAO,CAACC,4BAAAA,iBAAiB,IAAI,gBAAgB;GAClD,MAAM,gBAAA,GAAeC,4BAAAA,uBAAAA,CAAuB,WAAW,CAAC,CAAC,SAAS;IAChE,QAAQ;IACR,WAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA;IACA,QAAQ,CACN;KACE,MAAM;KACN,aACE;IACJ,CACF;GACF,CAAC;GACD,aAAa,aAAa,QAAQ;EACpC,CAAC;EAED,OAAO,OAAO,CAACL,kCAAAA,6BAA6BM,6BAAAA,+BAA+B,IAAI,YAAY;GACzF,MAAM,UAAU,QAAQ,IAAIN,kCAAAA,2BAA2B;GACvD,MAAM,WAAA,GAAUO,6BAAAA,wBAAAA,CAAwB,OAAO;GAC/C,MAAM,UAAUC,uBAAAA,uBAAuB,IAAI,SAAS;IAClD,sBACE,QACG,YAAY,CAAC,CACb,MAAM,QAAQ,EAAE,YAAY,MAAM,eAAe,QAAQ,CAAC,CAC1D,KAAK,EAAE,kBAAkB;KAAE,IAAI,WAAW;KAAI,OAAO,WAAW;IAAM,EAAE;IAC7E,qBAAqB,QAAQ;IAC7B,cAAc,WAAW,UAAU,UAAU,MAAA,GAAKC,0CAAAA,mBAAAA,CAAmB,WAAW,UAAU,KAAK;IAC/F,cAAcC,0CAAAA;IACd,wBAAwB;KACtB,IAAI;MACF,MAAM,OAAO,eAAe,gBAAgB;MAC5C,OAAO,SAAS,KAAA,KAAa,SAAS,KAAK,KAAA,IAAY;OAAE;OAAM,OAAO,SAAS,cAAc;MAAO;KACtG,QAAQ;MAGN;KACF;IACF;GACF,CAAC;GACD,YAAY;GACZ,MAAM,gBAAgB;IACpB,QAAa,QAAQ;GACvB;GACA,MAAM,cAAc,QAAQ,UAAU,OAAO;GAC7C,MAAM,QAAQ,WAAW,SAAS,GAAG;GACrC,QAAQ,OAAO,CAACC,iCAAAA,uBAAuB,IAAI,eAAe;IACxD,MAAM,WAAA,GAAUC,iCAAAA,kBAAAA,CAAkB,UAAU,CAAC,EAAE,WAAW,OAAO;IACjE,QAAQ;IACR,OAAO;GACT,CAAC;GACD,aAAa;IACX,aAAa,KAAK;IAClB,YAAY;IACZ,QAAQ,QAAQ;IAChB,IAAI,cAAc,SAAS,YAAY,KAAA;GACzC;EACF,CAAC;CACH;CACA,OAAO;EACL,UAAU,CAAC,GAAG,SAAS,UAAU,IAAI;EACrC,OAAO,CACLC,yBAAAA,iCACQ;GACJ,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,8DAA8D;GACnG,OAAO,eAAe;EACxB,IACC,WAAW,SAAS,aAAaf,yBAAAA,qBAAqB,MAAM,CAC/D,CACF;EACA,SAAS,SAAS;EAClB,QAAQ;GACN,cAAc,QAAQ,KAAK;IACzB,gBAAgB;IAChB,WAAgB,QAAQ;GAC1B;GACA,WAAW,QAAQ,KAAK;IACtB,gBAAgB;IAChB,SAAS;IACT,WAAgB,QAAQ;GAC1B;EACF;CACF;AACF,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import { createContextPublisher } from "../src/builders/cli/contextCatalog.mjs";
2
+ import { DIAGNOSE_SETUP_NAME, createSetupDiagnosticsTool } from "../src/extensions/setupDiagnostics.mjs";
3
+ import os from "node:os";
4
+ import { requireHarnessRoot } from "@agimon-ai/doompi-config/harnessStore";
5
+ import { requireDoomConfigContext } from "@agimon-ai/doompi-config/piContext";
6
+ import { DOOM_CONFIG_SERVICE } from "@agimon-ai/doompi-core/config";
2
7
  import { removeContextDetail, writeContextDetail } from "@agimon-ai/doompi-core/contextDetailStore";
3
8
  import { DOOM_CORDIS_SESSION_SERVICE } from "@agimon-ai/doompi-core/cordisHost";
4
- import { DOOM_HELP_SERVICE, requireDoomHelpService } from "@agimon-ai/doompi-core/help";
9
+ import { DOOM_HELP_SERVICE, createPiHelpToolGate, requireDoomHelpService } from "@agimon-ai/doompi-core/help";
5
10
  import { DOOM_MCP_STATUS_SERVICE, readDoomMcpStatus } from "@agimon-ai/doompi-core/mcpStatus";
6
11
  import { definePiExtension } from "@agimon-ai/doompi-core/piExtension";
7
12
  import { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from "@agimon-ai/doompi-minor-mode";
@@ -9,6 +14,8 @@ import { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from "@agimo
9
14
  const HELP_CONTRIBUTION_SOURCE = "@agimon-ai/doompi";
10
15
  var contextCatalog_default = definePiExtension("@agimon-ai/doompi/context-catalog", ({ pi }) => {
11
16
  let publisher;
17
+ let readSetupScope;
18
+ const helpGate = createPiHelpToolGate(HELP_CONTRIBUTION_SOURCE, [DIAGNOSE_SETUP_NAME]);
12
19
  /**
13
20
  * A handler's context, kept so the prompt can be read when the composition is
14
21
  * published rather than only when an event fires.
@@ -22,6 +29,29 @@ var contextCatalog_default = definePiExtension("@agimon-ai/doompi/context-catalo
22
29
  /** Pi hands out the base prompt until a turn replaces it with the one it sent. */
23
30
  let turned = false;
24
31
  const bind = (cordis) => {
32
+ cordis.inject([DOOM_CONFIG_SERVICE, DOOM_CORDIS_SESSION_SERVICE], (context) => {
33
+ const session = context.get(DOOM_CORDIS_SESSION_SERVICE);
34
+ const read = () => {
35
+ const harness = requireDoomConfigContext(context).harness;
36
+ return {
37
+ repoRoot: requireHarnessRoot(harness),
38
+ cwd: session.context.cwd,
39
+ environment: {
40
+ HOME: os.homedir(),
41
+ ...harness.profileEnvironment
42
+ },
43
+ selection: {
44
+ majorMode: harness.majorMode,
45
+ domains: [...harness.domains],
46
+ profile: harness.profile
47
+ }
48
+ };
49
+ };
50
+ readSetupScope = read;
51
+ return () => {
52
+ if (readSetupScope === read) readSetupScope = void 0;
53
+ };
54
+ });
25
55
  cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {
26
56
  const contribution = requireDoomHelpService(helpContext).register({
27
57
  source: HELP_CONTRIBUTION_SOURCE,
@@ -76,7 +106,12 @@ var contextCatalog_default = definePiExtension("@agimon-ai/doompi/context-catalo
76
106
  });
77
107
  };
78
108
  return {
79
- services: [bind],
109
+ services: [...helpGate.services, bind],
110
+ tools: [createSetupDiagnosticsTool(() => {
111
+ if (!readSetupScope) throw new Error("Setup diagnostics require the current session configuration.");
112
+ return readSetupScope();
113
+ }, (signal) => helpGate.assertActive(DIAGNOSE_SETUP_NAME, signal))],
114
+ onStart: helpGate.onStart,
80
115
  events: {
81
116
  session_start(_event, ctx) {
82
117
  promptContext = ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"contextCatalog.mjs","names":[],"sources":["../../src/extensions/contextCatalog.ts"],"sourcesContent":["import { removeContextDetail, writeContextDetail } from '@agimon-ai/doompi-core/contextDetailStore';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { DOOM_MCP_STATUS_SERVICE, readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { definePiExtension } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createContextPublisher, type ContextPublisher } from '../builders/cli/contextCatalog';\nconst HELP_CONTRIBUTION_SOURCE = '@agimon-ai/doompi';\nexport default definePiExtension('@agimon-ai/doompi/context-catalog', ({ pi }) => {\n let publisher: ContextPublisher | undefined;\n /**\n * A handler's context, kept so the prompt can be read when the composition is\n * published rather than only when an event fires.\n *\n * `getSystemPrompt` reads the session's live state and refuses only once the\n * runner has been replaced, so a retained context answers for the session it\n * came from or throws. Publishing happens on a timer and on catalog changes,\n * neither of which carries a context of its own.\n */\n let promptContext: { getSystemPrompt: () => string } | undefined;\n /** Pi hands out the base prompt until a turn replaces it with the one it sent. */\n let turned = false;\n const bind = (cordis: Context): void => {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: HELP_CONTRIBUTION_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-extension',\n description:\n 'Create or update a DoomPi extension package inside the DoomPi monorepo or as an external npm package. Use for package layout, Pi discovery entries, shared Cordis lifecycle, package-owned Help, and extension verification.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const catalog = requireMinorModeCatalog(context);\n const current = createContextPublisher(pi, context, {\n readMinorModes: () =>\n catalog\n .getSnapshot()\n .modes.filter(({ state }) => state.activation === 'active')\n .map(({ descriptor }) => ({ id: descriptor.id, label: descriptor.label })),\n readSessionId: () => session.sessionId,\n writeDetail: (sessionId, revision, items) => void writeContextDetail(sessionId, revision, items),\n removeDetail: removeContextDetail,\n readSystemPrompt: () => {\n try {\n const text = promptContext?.getSystemPrompt();\n return text === undefined || text === '' ? undefined : { text, stage: turned ? 'effective' : 'base' };\n } catch {\n // A context from a retired runner is stale, not fatal: the panel\n // reports no prompt until the next event hands over a live one.\n return undefined;\n }\n },\n });\n publisher = current;\n const publish = () => {\n void current.publish();\n };\n const unsubscribe = catalog.subscribe(publish);\n const timer = setTimeout(publish, 500);\n context.inject([DOOM_MCP_STATUS_SERVICE], (mcpContext) => {\n const release = readDoomMcpStatus(mcpContext)?.onChange?.(publish);\n publish();\n return release;\n });\n return () => {\n clearTimeout(timer);\n unsubscribe();\n current.dispose();\n if (publisher === current) publisher = undefined;\n };\n });\n };\n return {\n services: [bind],\n events: {\n session_start(_event, ctx) {\n promptContext = ctx;\n void publisher?.publish();\n },\n turn_start(_event, ctx) {\n promptContext = ctx;\n turned = true;\n void publisher?.publish();\n },\n },\n };\n});\n"],"mappings":";;;;;;;;AASA,MAAM,2BAA2B;AACjC,IAAA,yBAAe,kBAAkB,sCAAsC,EAAE,SAAS;CAChF,IAAI;;;;;;;;;;CAUJ,IAAI;;CAEJ,IAAI,SAAS;CACb,MAAM,QAAQ,WAA0B;EACtC,OAAO,OAAO,CAAC,iBAAiB,IAAI,gBAAgB;GAClD,MAAM,eAAe,uBAAuB,WAAW,CAAC,CAAC,SAAS;IAChE,QAAQ;IACR,WAAW,YAAY;IACvB,QAAQ,CACN;KACE,MAAM;KACN,aACE;IACJ,CACF;GACF,CAAC;GACD,aAAa,aAAa,QAAQ;EACpC,CAAC;EAED,OAAO,OAAO,CAAC,6BAA6B,+BAA+B,IAAI,YAAY;GACzF,MAAM,UAAU,QAAQ,IAAI,2BAA2B;GACvD,MAAM,UAAU,wBAAwB,OAAO;GAC/C,MAAM,UAAU,uBAAuB,IAAI,SAAS;IAClD,sBACE,QACG,YAAY,CAAC,CACb,MAAM,QAAQ,EAAE,YAAY,MAAM,eAAe,QAAQ,CAAC,CAC1D,KAAK,EAAE,kBAAkB;KAAE,IAAI,WAAW;KAAI,OAAO,WAAW;IAAM,EAAE;IAC7E,qBAAqB,QAAQ;IAC7B,cAAc,WAAW,UAAU,UAAU,KAAK,mBAAmB,WAAW,UAAU,KAAK;IAC/F,cAAc;IACd,wBAAwB;KACtB,IAAI;MACF,MAAM,OAAO,eAAe,gBAAgB;MAC5C,OAAO,SAAS,KAAA,KAAa,SAAS,KAAK,KAAA,IAAY;OAAE;OAAM,OAAO,SAAS,cAAc;MAAO;KACtG,QAAQ;MAGN;KACF;IACF;GACF,CAAC;GACD,YAAY;GACZ,MAAM,gBAAgB;IACpB,QAAa,QAAQ;GACvB;GACA,MAAM,cAAc,QAAQ,UAAU,OAAO;GAC7C,MAAM,QAAQ,WAAW,SAAS,GAAG;GACrC,QAAQ,OAAO,CAAC,uBAAuB,IAAI,eAAe;IACxD,MAAM,UAAU,kBAAkB,UAAU,CAAC,EAAE,WAAW,OAAO;IACjE,QAAQ;IACR,OAAO;GACT,CAAC;GACD,aAAa;IACX,aAAa,KAAK;IAClB,YAAY;IACZ,QAAQ,QAAQ;IAChB,IAAI,cAAc,SAAS,YAAY,KAAA;GACzC;EACF,CAAC;CACH;CACA,OAAO;EACL,UAAU,CAAC,IAAI;EACf,QAAQ;GACN,cAAc,QAAQ,KAAK;IACzB,gBAAgB;IAChB,WAAgB,QAAQ;GAC1B;GACA,WAAW,QAAQ,KAAK;IACtB,gBAAgB;IAChB,SAAS;IACT,WAAgB,QAAQ;GAC1B;EACF;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"contextCatalog.mjs","names":[],"sources":["../../src/extensions/contextCatalog.ts"],"sourcesContent":["import os from 'node:os';\n\nimport { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { removeContextDetail, writeContextDetail } from '@agimon-ai/doompi-core/contextDetailStore';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { createPiHelpToolGate } from '@agimon-ai/doompi-core/help';\nimport { DOOM_MCP_STATUS_SERVICE, readDoomMcpStatus } from '@agimon-ai/doompi-core/mcpStatus';\nimport { definePiExtension } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_MINOR_MODE_CATALOG_SERVICE, requireMinorModeCatalog } from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { createContextPublisher, type ContextPublisher } from '../builders/cli/contextCatalog';\nimport { createSetupDiagnosticsTool, DIAGNOSE_SETUP_NAME, type SetupDiagnosticScope } from './setupDiagnostics';\n\nconst HELP_CONTRIBUTION_SOURCE = '@agimon-ai/doompi';\nexport default definePiExtension('@agimon-ai/doompi/context-catalog', ({ pi }) => {\n let publisher: ContextPublisher | undefined;\n let readSetupScope: (() => SetupDiagnosticScope) | undefined;\n const helpGate = createPiHelpToolGate(HELP_CONTRIBUTION_SOURCE, [DIAGNOSE_SETUP_NAME]);\n /**\n * A handler's context, kept so the prompt can be read when the composition is\n * published rather than only when an event fires.\n *\n * `getSystemPrompt` reads the session's live state and refuses only once the\n * runner has been replaced, so a retained context answers for the session it\n * came from or throws. Publishing happens on a timer and on catalog changes,\n * neither of which carries a context of its own.\n */\n let promptContext: { getSystemPrompt: () => string } | undefined;\n /** Pi hands out the base prompt until a turn replaces it with the one it sent. */\n let turned = false;\n const bind = (cordis: Context): void => {\n cordis.inject([DOOM_CONFIG_SERVICE, DOOM_CORDIS_SESSION_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const read = (): SetupDiagnosticScope => {\n const harness = requireDoomConfigContext(context).harness;\n return {\n repoRoot: requireHarnessRoot(harness),\n cwd: session.context.cwd,\n environment: { HOME: os.homedir(), ...harness.profileEnvironment },\n selection: { majorMode: harness.majorMode, domains: [...harness.domains], profile: harness.profile },\n };\n };\n readSetupScope = read;\n return () => {\n if (readSetupScope === read) readSetupScope = undefined;\n };\n });\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: HELP_CONTRIBUTION_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-extension',\n description:\n 'Create or update a DoomPi extension package inside the DoomPi monorepo or as an external npm package. Use for package layout, Pi discovery entries, shared Cordis lifecycle, package-owned Help, and extension verification.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE, DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const session = context.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const catalog = requireMinorModeCatalog(context);\n const current = createContextPublisher(pi, context, {\n readMinorModes: () =>\n catalog\n .getSnapshot()\n .modes.filter(({ state }) => state.activation === 'active')\n .map(({ descriptor }) => ({ id: descriptor.id, label: descriptor.label })),\n readSessionId: () => session.sessionId,\n writeDetail: (sessionId, revision, items) => void writeContextDetail(sessionId, revision, items),\n removeDetail: removeContextDetail,\n readSystemPrompt: () => {\n try {\n const text = promptContext?.getSystemPrompt();\n return text === undefined || text === '' ? undefined : { text, stage: turned ? 'effective' : 'base' };\n } catch {\n // A context from a retired runner is stale, not fatal: the panel\n // reports no prompt until the next event hands over a live one.\n return undefined;\n }\n },\n });\n publisher = current;\n const publish = () => {\n void current.publish();\n };\n const unsubscribe = catalog.subscribe(publish);\n const timer = setTimeout(publish, 500);\n context.inject([DOOM_MCP_STATUS_SERVICE], (mcpContext) => {\n const release = readDoomMcpStatus(mcpContext)?.onChange?.(publish);\n publish();\n return release;\n });\n return () => {\n clearTimeout(timer);\n unsubscribe();\n current.dispose();\n if (publisher === current) publisher = undefined;\n };\n });\n };\n return {\n services: [...helpGate.services, bind],\n tools: [\n createSetupDiagnosticsTool(\n () => {\n if (!readSetupScope) throw new Error('Setup diagnostics require the current session configuration.');\n return readSetupScope();\n },\n (signal) => helpGate.assertActive(DIAGNOSE_SETUP_NAME, signal),\n ),\n ],\n onStart: helpGate.onStart,\n events: {\n session_start(_event, ctx) {\n promptContext = ctx;\n void publisher?.publish();\n },\n turn_start(_event, ctx) {\n promptContext = ctx;\n turned = true;\n void publisher?.publish();\n },\n },\n };\n});\n"],"mappings":";;;;;;;;;;;;;AAiBA,MAAM,2BAA2B;AACjC,IAAA,yBAAe,kBAAkB,sCAAsC,EAAE,SAAS;CAChF,IAAI;CACJ,IAAI;CACJ,MAAM,WAAW,qBAAqB,0BAA0B,CAAC,mBAAmB,CAAC;;;;;;;;;;CAUrF,IAAI;;CAEJ,IAAI,SAAS;CACb,MAAM,QAAQ,WAA0B;EACtC,OAAO,OAAO,CAAC,qBAAqB,2BAA2B,IAAI,YAAY;GAC7E,MAAM,UAAU,QAAQ,IAAI,2BAA2B;GACvD,MAAM,aAAmC;IACvC,MAAM,UAAU,yBAAyB,OAAO,CAAC,CAAC;IAClD,OAAO;KACL,UAAU,mBAAmB,OAAO;KACpC,KAAK,QAAQ,QAAQ;KACrB,aAAa;MAAE,MAAM,GAAG,QAAQ;MAAG,GAAG,QAAQ;KAAmB;KACjE,WAAW;MAAE,WAAW,QAAQ;MAAW,SAAS,CAAC,GAAG,QAAQ,OAAO;MAAG,SAAS,QAAQ;KAAQ;IACrG;GACF;GACA,iBAAiB;GACjB,aAAa;IACX,IAAI,mBAAmB,MAAM,iBAAiB,KAAA;GAChD;EACF,CAAC;EACD,OAAO,OAAO,CAAC,iBAAiB,IAAI,gBAAgB;GAClD,MAAM,eAAe,uBAAuB,WAAW,CAAC,CAAC,SAAS;IAChE,QAAQ;IACR,WAAW,YAAY;IACvB,QAAQ,CACN;KACE,MAAM;KACN,aACE;IACJ,CACF;GACF,CAAC;GACD,aAAa,aAAa,QAAQ;EACpC,CAAC;EAED,OAAO,OAAO,CAAC,6BAA6B,+BAA+B,IAAI,YAAY;GACzF,MAAM,UAAU,QAAQ,IAAI,2BAA2B;GACvD,MAAM,UAAU,wBAAwB,OAAO;GAC/C,MAAM,UAAU,uBAAuB,IAAI,SAAS;IAClD,sBACE,QACG,YAAY,CAAC,CACb,MAAM,QAAQ,EAAE,YAAY,MAAM,eAAe,QAAQ,CAAC,CAC1D,KAAK,EAAE,kBAAkB;KAAE,IAAI,WAAW;KAAI,OAAO,WAAW;IAAM,EAAE;IAC7E,qBAAqB,QAAQ;IAC7B,cAAc,WAAW,UAAU,UAAU,KAAK,mBAAmB,WAAW,UAAU,KAAK;IAC/F,cAAc;IACd,wBAAwB;KACtB,IAAI;MACF,MAAM,OAAO,eAAe,gBAAgB;MAC5C,OAAO,SAAS,KAAA,KAAa,SAAS,KAAK,KAAA,IAAY;OAAE;OAAM,OAAO,SAAS,cAAc;MAAO;KACtG,QAAQ;MAGN;KACF;IACF;GACF,CAAC;GACD,YAAY;GACZ,MAAM,gBAAgB;IACpB,QAAa,QAAQ;GACvB;GACA,MAAM,cAAc,QAAQ,UAAU,OAAO;GAC7C,MAAM,QAAQ,WAAW,SAAS,GAAG;GACrC,QAAQ,OAAO,CAAC,uBAAuB,IAAI,eAAe;IACxD,MAAM,UAAU,kBAAkB,UAAU,CAAC,EAAE,WAAW,OAAO;IACjE,QAAQ;IACR,OAAO;GACT,CAAC;GACD,aAAa;IACX,aAAa,KAAK;IAClB,YAAY;IACZ,QAAQ,QAAQ;IAChB,IAAI,cAAc,SAAS,YAAY,KAAA;GACzC;EACF,CAAC;CACH;CACA,OAAO;EACL,UAAU,CAAC,GAAG,SAAS,UAAU,IAAI;EACrC,OAAO,CACL,iCACQ;GACJ,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,8DAA8D;GACnG,OAAO,eAAe;EACxB,IACC,WAAW,SAAS,aAAa,qBAAqB,MAAM,CAC/D,CACF;EACA,SAAS,SAAS;EAClB,QAAQ;GACN,cAAc,QAAQ,KAAK;IACzB,gBAAgB;IAChB,WAAgB,QAAQ;GAC1B;GACA,WAAW,QAAQ,KAAK;IACtB,gBAAgB;IAChB,SAAS;IACT,WAAgB,QAAQ;GAC1B;EACF;CACF;AACF,CAAC"}
@@ -2,6 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
+ const require_setupDiagnostics = require("../src/extensions/setupDiagnostics.cjs");
5
6
  let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
6
7
  let _agimon_ai_doompi_core_machineApi = require("@agimon-ai/doompi-core/machineApi");
7
8
  let _agimon_ai_doompi_core_remoteApi = require("@agimon-ai/doompi-core/remoteApi");
@@ -11,7 +12,15 @@ let _agimon_ai_doompi_core_sessionFilesApi = require("@agimon-ai/doompi-core/ses
11
12
  const doompiServerFacet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
12
13
  name: "@agimon-ai/doompi",
13
14
  global: ({ host }) => ({ api: host.context.remoteControl ? [_agimon_ai_doompi_core_machineApi.machineApi, _agimon_ai_doompi_core_remoteApi.remoteApi] : [_agimon_ai_doompi_core_machineApi.machineApi] }),
14
- session: { api: [_agimon_ai_doompi_core_runtimeContextApi.api, _agimon_ai_doompi_core_sessionFilesApi.sessionFilesApi] }
15
+ session: ({ agent, signal: ownerSignal }) => ({
16
+ api: [_agimon_ai_doompi_core_runtimeContextApi.api, _agimon_ai_doompi_core_sessionFilesApi.sessionFilesApi],
17
+ tools: agent ? [require_setupDiagnostics.createSetupDiagnosticsTool(() => agent.context, (signal) => {
18
+ ownerSignal.throwIfAborted();
19
+ agent.assertActive("@agimon-ai/doompi");
20
+ if (!(agent.context.selection.state?.["minor-mode"] ?? []).includes("help")) throw new Error("Help mode is not active.");
21
+ return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;
22
+ })] : []
23
+ })
15
24
  });
16
25
  //#endregion
17
26
  exports.default = doompiServerFacet;
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["defineServerPlugin","machineApi","remoteApi","api","sessionFilesApi"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({\n api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi],\n }),\n session: {\n api: [api, sessionFilesApi],\n },\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;;;;;AAMA,MAAa,qBAAA,GAAoBA,mCAAAA,mBAAAA,CAAmB;CAClD,MAAM;CACN,SAAS,EAAE,YAAY,EACrB,KAAK,KAAK,QAAQ,gBAAgB,CAACC,kCAAAA,YAAYC,iCAAAA,SAAS,IAAI,CAACD,kCAAAA,UAAU,EACzE;CACA,SAAS,EACP,KAAK,CAACE,yCAAAA,KAAKC,uCAAAA,eAAe,EAC5B;AACF,CAAC"}
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","machineApi","remoteApi","api","sessionFilesApi","createSetupDiagnosticsTool"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nimport { createSetupDiagnosticsTool } from './setupDiagnostics';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),\n session: ({ agent, signal: ownerSignal }) => ({\n api: [api, sessionFilesApi],\n tools: agent\n ? [\n createSetupDiagnosticsTool(\n () => agent.context,\n (signal) => {\n ownerSignal.throwIfAborted();\n agent.assertActive('@agimon-ai/doompi');\n if (!(agent.context.selection.state?.['minor-mode'] ?? []).includes('help'))\n throw new Error('Help mode is not active.');\n return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;\n },\n ),\n ]\n : [],\n }),\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;;;;;;AAQA,MAAa,qBAAA,GAAoBA,mCAAAA,mBAAAA,CAAmB;CAClD,MAAM;CACN,SAAS,EAAE,YAAY,EAAE,KAAK,KAAK,QAAQ,gBAAgB,CAACC,kCAAAA,YAAYC,iCAAAA,SAAS,IAAI,CAACD,kCAAAA,UAAU,EAAE;CAClG,UAAU,EAAE,OAAO,QAAQ,mBAAmB;EAC5C,KAAK,CAACE,yCAAAA,KAAKC,uCAAAA,eAAe;EAC1B,OAAO,QACH,CACEC,yBAAAA,iCACQ,MAAM,UACX,WAAW;GACV,YAAY,eAAe;GAC3B,MAAM,aAAa,mBAAmB;GACtC,IAAI,EAAE,MAAM,QAAQ,UAAU,QAAQ,iBAAiB,CAAC,EAAA,CAAG,SAAS,MAAM,GACxE,MAAM,IAAI,MAAM,0BAA0B;GAC5C,OAAO,SAAS,YAAY,IAAI,CAAC,QAAQ,WAAW,CAAC,IAAI;EAC3D,CACF,CACF,IACA,CAAC;CACP;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAMa,gEAAiB"}
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAQa,gEAAiB"}
@@ -1,3 +1,4 @@
1
+ import { createSetupDiagnosticsTool } from "../src/extensions/setupDiagnostics.mjs";
1
2
  import { defineServerPlugin } from "@agimon-ai/doompi-core/serverFacet";
2
3
  import { machineApi } from "@agimon-ai/doompi-core/machineApi";
3
4
  import { remoteApi } from "@agimon-ai/doompi-core/remoteApi";
@@ -7,7 +8,15 @@ import { sessionFilesApi } from "@agimon-ai/doompi-core/sessionFilesApi";
7
8
  const doompiServerFacet = defineServerPlugin({
8
9
  name: "@agimon-ai/doompi",
9
10
  global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),
10
- session: { api: [api, sessionFilesApi] }
11
+ session: ({ agent, signal: ownerSignal }) => ({
12
+ api: [api, sessionFilesApi],
13
+ tools: agent ? [createSetupDiagnosticsTool(() => agent.context, (signal) => {
14
+ ownerSignal.throwIfAborted();
15
+ agent.assertActive("@agimon-ai/doompi");
16
+ if (!(agent.context.selection.state?.["minor-mode"] ?? []).includes("help")) throw new Error("Help mode is not active.");
17
+ return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;
18
+ })] : []
19
+ })
11
20
  });
12
21
  //#endregion
13
22
  export { doompiServerFacet as default, doompiServerFacet };
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({\n api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi],\n }),\n session: {\n api: [api, sessionFilesApi],\n },\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;AAMA,MAAa,oBAAoB,mBAAmB;CAClD,MAAM;CACN,SAAS,EAAE,YAAY,EACrB,KAAK,KAAK,QAAQ,gBAAgB,CAAC,YAAY,SAAS,IAAI,CAAC,UAAU,EACzE;CACA,SAAS,EACP,KAAK,CAAC,KAAK,eAAe,EAC5B;AACF,CAAC"}
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nimport { createSetupDiagnosticsTool } from './setupDiagnostics';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),\n session: ({ agent, signal: ownerSignal }) => ({\n api: [api, sessionFilesApi],\n tools: agent\n ? [\n createSetupDiagnosticsTool(\n () => agent.context,\n (signal) => {\n ownerSignal.throwIfAborted();\n agent.assertActive('@agimon-ai/doompi');\n if (!(agent.context.selection.state?.['minor-mode'] ?? []).includes('help'))\n throw new Error('Help mode is not active.');\n return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;\n },\n ),\n ]\n : [],\n }),\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;;AAQA,MAAa,oBAAoB,mBAAmB;CAClD,MAAM;CACN,SAAS,EAAE,YAAY,EAAE,KAAK,KAAK,QAAQ,gBAAgB,CAAC,YAAY,SAAS,IAAI,CAAC,UAAU,EAAE;CAClG,UAAU,EAAE,OAAO,QAAQ,mBAAmB;EAC5C,KAAK,CAAC,KAAK,eAAe;EAC1B,OAAO,QACH,CACE,iCACQ,MAAM,UACX,WAAW;GACV,YAAY,eAAe;GAC3B,MAAM,aAAa,mBAAmB;GACtC,IAAI,EAAE,MAAM,QAAQ,UAAU,QAAQ,iBAAiB,CAAC,EAAA,CAAG,SAAS,MAAM,GACxE,MAAM,IAAI,MAAM,0BAA0B;GAC5C,OAAO,SAAS,YAAY,IAAI,CAAC,QAAQ,WAAW,CAAC,IAAI;EAC3D,CACF,CACF,IACA,CAAC;CACP;AACF,CAAC"}
@@ -11,9 +11,9 @@ let node_child_process = require("node:child_process");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_runtime.__toESM(node_os, 1);
13
13
  let _agimon_ai_doompi_core_runtimeLogSinkTelemetry = require("@agimon-ai/doompi-core/runtimeLogSinkTelemetry");
14
- let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
15
14
  let _agimon_ai_doompi_config_piContext = require("@agimon-ai/doompi-config/piContext");
16
15
  let _agimon_ai_doompi_core_config = require("@agimon-ai/doompi-core/config");
16
+ let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
17
17
  //#region src/extensions/styleSystem.ts
18
18
  const STYLE_SYSTEM_PACKAGE = "style-system";
19
19
  const STYLE_SYSTEM_CONFIG_FILE = `${STYLE_SYSTEM_PACKAGE}.config.yaml`;
@@ -3,9 +3,9 @@ import path from "node:path";
3
3
  import { spawn } from "node:child_process";
4
4
  import os from "node:os";
5
5
  import { HARNESS_EVENT, createHarnessTelemetry } from "@agimon-ai/doompi-core/runtimeLogSinkTelemetry";
6
- import { connectDoomCordisHost } from "@agimon-ai/doompi-core/cordisHost";
7
6
  import { requireDoomConfigContext } from "@agimon-ai/doompi-config/piContext";
8
7
  import { DOOM_CONFIG_SERVICE } from "@agimon-ai/doompi-core/config";
8
+ import { connectDoomCordisHost } from "@agimon-ai/doompi-core/cordisHost";
9
9
  //#region src/extensions/styleSystem.ts
10
10
  const STYLE_SYSTEM_PACKAGE = "style-system";
11
11
  const STYLE_SYSTEM_CONFIG_FILE = `${STYLE_SYSTEM_PACKAGE}.config.yaml`;
@@ -36,7 +36,8 @@ function terminalChildSessionPlugin(cordis, models, sessionsRoot) {
36
36
  sessionsRoot,
37
37
  models,
38
38
  providers: () => registeredProviders(extensionContext.modelRegistry),
39
- defaultModel: () => extensionContext.model
39
+ defaultModel: () => extensionContext.model,
40
+ mcpTool: () => sessionContext.get(_agimon_ai_doompi_core_childSession.DOOM_CHILD_SESSION_MCP_TOOL_SERVICE)
40
41
  });
41
42
  sessionContext.provide(_agimon_ai_doompi_core_childSession.DOOM_CHILD_SESSION_SERVICE, childSessions.get());
42
43
  sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);
@@ -1 +1 @@
1
- {"version":3,"file":"terminalChildSession.cjs","names":["DOOM_CORDIS_SESSION_SERVICE","createTerminalPiChildSessionServiceProvider","DOOM_CHILD_SESSION_SERVICE","getAgentDir","ModelRuntime","path","connectDoomCordisHost"],"sources":["../../src/extensions/terminalChildSession.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { createTerminalPiChildSessionServiceProvider } from '@agimon-ai/doompi-core/terminalPiChildSessionService';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport { getAgentDir, ModelRuntime, type ExtensionAPI, type ModelRegistry } from '@earendil-works/pi-coding-agent';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi/terminal-child-session';\n\n/**\n * Collect the providers registered in this process by Pi extensions.\n *\n * The child ModelRuntime is built from auth.json and models.json, so it only\n * knows providers that exist on disk. A custom provider contributed through\n * `pi.registerProvider()` lives solely in the host registry, and its stream\n * closures cannot be reconstructed from a file. Reading the live registry per\n * spawn keeps late registrations visible.\n */\nfunction registeredProviders(registry: ModelRegistry): readonly Provider[] {\n const providers: Provider[] = [];\n for (const id of registry.getRegisteredProviderIds()) {\n const provider = registry.getRegisteredNativeProvider(id) ?? registry.getProvider(id);\n if (provider !== undefined) providers.push(provider);\n }\n return providers;\n}\n\nfunction terminalChildSessionPlugin(cordis: Context, models: ModelRuntime, sessionsRoot: string): void {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const extensionContext = session.context;\n const childSessions = createTerminalPiChildSessionServiceProvider({\n cwd: extensionContext.cwd,\n sessionsRoot,\n models,\n providers: () => registeredProviders(extensionContext.modelRegistry),\n defaultModel: () => extensionContext.model,\n });\n sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());\n sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);\n });\n}\n\n/** Bind terminal Pi child ownership inside the core Cordis composition, before feature packages consume it. */\nexport async function terminalChildSessionExtension(pi: ExtensionAPI): Promise<void> {\n const agentDir = getAgentDir();\n const models = await ModelRuntime.create({\n authPath: path.join(agentDir, 'auth.json'),\n modelsPath: path.join(agentDir, 'models.json'),\n refreshOnCreate: false,\n });\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const sessionsRoot = path.join(agentDir, 'sessions');\n const fiber = connection.root.plugin((cordis) => terminalChildSessionPlugin(cordis, models, sessionsRoot));\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n try {\n await fiber;\n } catch (error) {\n await fiber.dispose();\n await connection.dispose();\n throw error;\n }\n}\n\nexport default terminalChildSessionExtension;\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,iBAAiB;;;;;;;;;;AAWvB,SAAS,oBAAoB,UAA8C;CACzE,MAAM,YAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,SAAS,yBAAyB,GAAG;EACpD,MAAM,WAAW,SAAS,4BAA4B,EAAE,KAAK,SAAS,YAAY,EAAE;EACpF,IAAI,aAAa,KAAA,GAAW,UAAU,KAAK,QAAQ;CACrD;CACA,OAAO;AACT;AAEA,SAAS,2BAA2B,QAAiB,QAAsB,cAA4B;CACrG,OAAO,OAAO,CAACA,kCAAAA,2BAA2B,IAAI,mBAAmB;EAE/D,MAAM,mBADU,eAAe,IAAIA,kCAAAA,2BACJ,CAAC,CAAC;EACjC,MAAM,iBAAA,GAAgBC,qDAAAA,4CAAAA,CAA4C;GAChE,KAAK,iBAAiB;GACtB;GACA;GACA,iBAAiB,oBAAoB,iBAAiB,aAAa;GACnE,oBAAoB,iBAAiB;EACvC,CAAC;EACD,eAAe,QAAQC,oCAAAA,4BAA4B,cAAc,IAAI,CAAC;EACtE,eAAe,mBAAmB,cAAc,MAAM,GAAG,GAAG,eAAe,UAAU;CACvF,CAAC;AACH;;AAGA,eAAsB,8BAA8B,IAAiC;CACnF,MAAM,YAAA,GAAWC,gCAAAA,YAAAA,CAAY;CAC7B,MAAM,SAAS,MAAMC,gCAAAA,aAAa,OAAO;EACvC,UAAUC,UAAAA,QAAK,KAAK,UAAU,WAAW;EACzC,YAAYA,UAAAA,QAAK,KAAK,UAAU,aAAa;EAC7C,iBAAiB;CACnB,CAAC;CACD,MAAM,aAAa,OAAA,GAAMC,kCAAAA,sBAAAA,CAAsB,IAAI,cAAc;CACjE,MAAM,eAAeD,UAAAA,QAAK,KAAK,UAAU,UAAU;CACnD,MAAM,QAAQ,WAAW,KAAK,QAAQ,WAAW,2BAA2B,QAAQ,QAAQ,YAAY,CAAC;CACzG,IAAI;CACJ,GAAG,GACD,0BAEG,cAAc,YAAY;EACzB,IAAI;GACF,MAAM,MAAM,QAAQ;EACtB,UAAU;GACR,MAAM,WAAW,QAAQ;EAC3B;CACF,EAAA,CAAG,CACP;CACA,IAAI;EACF,MAAM;CACR,SAAS,OAAO;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAW,QAAQ;EACzB,MAAM;CACR;AACF"}
1
+ {"version":3,"file":"terminalChildSession.cjs","names":["DOOM_CORDIS_SESSION_SERVICE","createTerminalPiChildSessionServiceProvider","DOOM_CHILD_SESSION_MCP_TOOL_SERVICE","DOOM_CHILD_SESSION_SERVICE","getAgentDir","ModelRuntime","path","connectDoomCordisHost"],"sources":["../../src/extensions/terminalChildSession.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n DOOM_CHILD_SESSION_SERVICE,\n DOOM_CHILD_SESSION_MCP_TOOL_SERVICE,\n type DoomChildSessionTool,\n} from '@agimon-ai/doompi-core/childSession';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { createTerminalPiChildSessionServiceProvider } from '@agimon-ai/doompi-core/terminalPiChildSessionService';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport { getAgentDir, ModelRuntime, type ExtensionAPI, type ModelRegistry } from '@earendil-works/pi-coding-agent';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi/terminal-child-session';\n\n/**\n * Collect the providers registered in this process by Pi extensions.\n *\n * The child ModelRuntime is built from auth.json and models.json, so it only\n * knows providers that exist on disk. A custom provider contributed through\n * `pi.registerProvider()` lives solely in the host registry, and its stream\n * closures cannot be reconstructed from a file. Reading the live registry per\n * spawn keeps late registrations visible.\n */\nfunction registeredProviders(registry: ModelRegistry): readonly Provider[] {\n const providers: Provider[] = [];\n for (const id of registry.getRegisteredProviderIds()) {\n const provider = registry.getRegisteredNativeProvider(id) ?? registry.getProvider(id);\n if (provider !== undefined) providers.push(provider);\n }\n return providers;\n}\n\nfunction terminalChildSessionPlugin(cordis: Context, models: ModelRuntime, sessionsRoot: string): void {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const extensionContext = session.context;\n const childSessions = createTerminalPiChildSessionServiceProvider({\n cwd: extensionContext.cwd,\n sessionsRoot,\n models,\n providers: () => registeredProviders(extensionContext.modelRegistry),\n defaultModel: () => extensionContext.model,\n mcpTool: () => sessionContext.get(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE) as DoomChildSessionTool | undefined,\n });\n sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());\n sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);\n });\n}\n\n/** Bind terminal Pi child ownership inside the core Cordis composition, before feature packages consume it. */\nexport async function terminalChildSessionExtension(pi: ExtensionAPI): Promise<void> {\n const agentDir = getAgentDir();\n const models = await ModelRuntime.create({\n authPath: path.join(agentDir, 'auth.json'),\n modelsPath: path.join(agentDir, 'models.json'),\n refreshOnCreate: false,\n });\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const sessionsRoot = path.join(agentDir, 'sessions');\n const fiber = connection.root.plugin((cordis) => terminalChildSessionPlugin(cordis, models, sessionsRoot));\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n try {\n await fiber;\n } catch (error) {\n await fiber.dispose();\n await connection.dispose();\n throw error;\n }\n}\n\nexport default terminalChildSessionExtension;\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,iBAAiB;;;;;;;;;;AAWvB,SAAS,oBAAoB,UAA8C;CACzE,MAAM,YAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,SAAS,yBAAyB,GAAG;EACpD,MAAM,WAAW,SAAS,4BAA4B,EAAE,KAAK,SAAS,YAAY,EAAE;EACpF,IAAI,aAAa,KAAA,GAAW,UAAU,KAAK,QAAQ;CACrD;CACA,OAAO;AACT;AAEA,SAAS,2BAA2B,QAAiB,QAAsB,cAA4B;CACrG,OAAO,OAAO,CAACA,kCAAAA,2BAA2B,IAAI,mBAAmB;EAE/D,MAAM,mBADU,eAAe,IAAIA,kCAAAA,2BACJ,CAAC,CAAC;EACjC,MAAM,iBAAA,GAAgBC,qDAAAA,4CAAAA,CAA4C;GAChE,KAAK,iBAAiB;GACtB;GACA;GACA,iBAAiB,oBAAoB,iBAAiB,aAAa;GACnE,oBAAoB,iBAAiB;GACrC,eAAe,eAAe,IAAIC,oCAAAA,mCAAmC;EACvE,CAAC;EACD,eAAe,QAAQC,oCAAAA,4BAA4B,cAAc,IAAI,CAAC;EACtE,eAAe,mBAAmB,cAAc,MAAM,GAAG,GAAG,eAAe,UAAU;CACvF,CAAC;AACH;;AAGA,eAAsB,8BAA8B,IAAiC;CACnF,MAAM,YAAA,GAAWC,gCAAAA,YAAAA,CAAY;CAC7B,MAAM,SAAS,MAAMC,gCAAAA,aAAa,OAAO;EACvC,UAAUC,UAAAA,QAAK,KAAK,UAAU,WAAW;EACzC,YAAYA,UAAAA,QAAK,KAAK,UAAU,aAAa;EAC7C,iBAAiB;CACnB,CAAC;CACD,MAAM,aAAa,OAAA,GAAMC,kCAAAA,sBAAAA,CAAsB,IAAI,cAAc;CACjE,MAAM,eAAeD,UAAAA,QAAK,KAAK,UAAU,UAAU;CACnD,MAAM,QAAQ,WAAW,KAAK,QAAQ,WAAW,2BAA2B,QAAQ,QAAQ,YAAY,CAAC;CACzG,IAAI;CACJ,GAAG,GACD,0BAEG,cAAc,YAAY;EACzB,IAAI;GACF,MAAM,MAAM,QAAQ;EACtB,UAAU;GACR,MAAM,WAAW,QAAQ;EAC3B;CACF,EAAA,CAAG,CACP;CACA,IAAI;EACF,MAAM;CACR,SAAS,OAAO;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAW,QAAQ;EACzB,MAAM;CACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"terminalChildSession.d.mts","names":[],"sources":["../../src/extensions/terminalChildSession.ts"],"mappings":";;;wBAkDsB,8BAA8B,IAAI,eAAe"}
1
+ {"version":3,"file":"terminalChildSession.d.mts","names":[],"sources":["../../src/extensions/terminalChildSession.ts"],"mappings":";;;wBAuDsB,8BAA8B,IAAI,eAAe"}
@@ -1,7 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { ModelRuntime, getAgentDir } from "@earendil-works/pi-coding-agent";
3
3
  import { DOOM_CORDIS_SESSION_SERVICE, connectDoomCordisHost } from "@agimon-ai/doompi-core/cordisHost";
4
- import { DOOM_CHILD_SESSION_SERVICE } from "@agimon-ai/doompi-core/childSession";
4
+ import { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE, DOOM_CHILD_SESSION_SERVICE } from "@agimon-ai/doompi-core/childSession";
5
5
  import { createTerminalPiChildSessionServiceProvider } from "@agimon-ai/doompi-core/terminalPiChildSessionService";
6
6
  //#region src/extensions/terminalChildSession.ts
7
7
  const PACKAGE_SOURCE = "@agimon-ai/doompi/terminal-child-session";
@@ -30,7 +30,8 @@ function terminalChildSessionPlugin(cordis, models, sessionsRoot) {
30
30
  sessionsRoot,
31
31
  models,
32
32
  providers: () => registeredProviders(extensionContext.modelRegistry),
33
- defaultModel: () => extensionContext.model
33
+ defaultModel: () => extensionContext.model,
34
+ mcpTool: () => sessionContext.get(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE)
34
35
  });
35
36
  sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());
36
37
  sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);
@@ -1 +1 @@
1
- {"version":3,"file":"terminalChildSession.mjs","names":[],"sources":["../../src/extensions/terminalChildSession.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { createTerminalPiChildSessionServiceProvider } from '@agimon-ai/doompi-core/terminalPiChildSessionService';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport { getAgentDir, ModelRuntime, type ExtensionAPI, type ModelRegistry } from '@earendil-works/pi-coding-agent';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi/terminal-child-session';\n\n/**\n * Collect the providers registered in this process by Pi extensions.\n *\n * The child ModelRuntime is built from auth.json and models.json, so it only\n * knows providers that exist on disk. A custom provider contributed through\n * `pi.registerProvider()` lives solely in the host registry, and its stream\n * closures cannot be reconstructed from a file. Reading the live registry per\n * spawn keeps late registrations visible.\n */\nfunction registeredProviders(registry: ModelRegistry): readonly Provider[] {\n const providers: Provider[] = [];\n for (const id of registry.getRegisteredProviderIds()) {\n const provider = registry.getRegisteredNativeProvider(id) ?? registry.getProvider(id);\n if (provider !== undefined) providers.push(provider);\n }\n return providers;\n}\n\nfunction terminalChildSessionPlugin(cordis: Context, models: ModelRuntime, sessionsRoot: string): void {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const extensionContext = session.context;\n const childSessions = createTerminalPiChildSessionServiceProvider({\n cwd: extensionContext.cwd,\n sessionsRoot,\n models,\n providers: () => registeredProviders(extensionContext.modelRegistry),\n defaultModel: () => extensionContext.model,\n });\n sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());\n sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);\n });\n}\n\n/** Bind terminal Pi child ownership inside the core Cordis composition, before feature packages consume it. */\nexport async function terminalChildSessionExtension(pi: ExtensionAPI): Promise<void> {\n const agentDir = getAgentDir();\n const models = await ModelRuntime.create({\n authPath: path.join(agentDir, 'auth.json'),\n modelsPath: path.join(agentDir, 'models.json'),\n refreshOnCreate: false,\n });\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const sessionsRoot = path.join(agentDir, 'sessions');\n const fiber = connection.root.plugin((cordis) => terminalChildSessionPlugin(cordis, models, sessionsRoot));\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n try {\n await fiber;\n } catch (error) {\n await fiber.dispose();\n await connection.dispose();\n throw error;\n }\n}\n\nexport default terminalChildSessionExtension;\n"],"mappings":";;;;;;AAaA,MAAM,iBAAiB;;;;;;;;;;AAWvB,SAAS,oBAAoB,UAA8C;CACzE,MAAM,YAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,SAAS,yBAAyB,GAAG;EACpD,MAAM,WAAW,SAAS,4BAA4B,EAAE,KAAK,SAAS,YAAY,EAAE;EACpF,IAAI,aAAa,KAAA,GAAW,UAAU,KAAK,QAAQ;CACrD;CACA,OAAO;AACT;AAEA,SAAS,2BAA2B,QAAiB,QAAsB,cAA4B;CACrG,OAAO,OAAO,CAAC,2BAA2B,IAAI,mBAAmB;EAE/D,MAAM,mBADU,eAAe,IAAI,2BACJ,CAAC,CAAC;EACjC,MAAM,gBAAgB,4CAA4C;GAChE,KAAK,iBAAiB;GACtB;GACA;GACA,iBAAiB,oBAAoB,iBAAiB,aAAa;GACnE,oBAAoB,iBAAiB;EACvC,CAAC;EACD,eAAe,QAAQ,4BAA4B,cAAc,IAAI,CAAC;EACtE,eAAe,mBAAmB,cAAc,MAAM,GAAG,GAAG,eAAe,UAAU;CACvF,CAAC;AACH;;AAGA,eAAsB,8BAA8B,IAAiC;CACnF,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,MAAM,aAAa,OAAO;EACvC,UAAU,KAAK,KAAK,UAAU,WAAW;EACzC,YAAY,KAAK,KAAK,UAAU,aAAa;EAC7C,iBAAiB;CACnB,CAAC;CACD,MAAM,aAAa,MAAM,sBAAsB,IAAI,cAAc;CACjE,MAAM,eAAe,KAAK,KAAK,UAAU,UAAU;CACnD,MAAM,QAAQ,WAAW,KAAK,QAAQ,WAAW,2BAA2B,QAAQ,QAAQ,YAAY,CAAC;CACzG,IAAI;CACJ,GAAG,GACD,0BAEG,cAAc,YAAY;EACzB,IAAI;GACF,MAAM,MAAM,QAAQ;EACtB,UAAU;GACR,MAAM,WAAW,QAAQ;EAC3B;CACF,EAAA,CAAG,CACP;CACA,IAAI;EACF,MAAM;CACR,SAAS,OAAO;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAW,QAAQ;EACzB,MAAM;CACR;AACF"}
1
+ {"version":3,"file":"terminalChildSession.mjs","names":[],"sources":["../../src/extensions/terminalChildSession.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n DOOM_CHILD_SESSION_SERVICE,\n DOOM_CHILD_SESSION_MCP_TOOL_SERVICE,\n type DoomChildSessionTool,\n} from '@agimon-ai/doompi-core/childSession';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { createTerminalPiChildSessionServiceProvider } from '@agimon-ai/doompi-core/terminalPiChildSessionService';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport { getAgentDir, ModelRuntime, type ExtensionAPI, type ModelRegistry } from '@earendil-works/pi-coding-agent';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi/terminal-child-session';\n\n/**\n * Collect the providers registered in this process by Pi extensions.\n *\n * The child ModelRuntime is built from auth.json and models.json, so it only\n * knows providers that exist on disk. A custom provider contributed through\n * `pi.registerProvider()` lives solely in the host registry, and its stream\n * closures cannot be reconstructed from a file. Reading the live registry per\n * spawn keeps late registrations visible.\n */\nfunction registeredProviders(registry: ModelRegistry): readonly Provider[] {\n const providers: Provider[] = [];\n for (const id of registry.getRegisteredProviderIds()) {\n const provider = registry.getRegisteredNativeProvider(id) ?? registry.getProvider(id);\n if (provider !== undefined) providers.push(provider);\n }\n return providers;\n}\n\nfunction terminalChildSessionPlugin(cordis: Context, models: ModelRuntime, sessionsRoot: string): void {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const extensionContext = session.context;\n const childSessions = createTerminalPiChildSessionServiceProvider({\n cwd: extensionContext.cwd,\n sessionsRoot,\n models,\n providers: () => registeredProviders(extensionContext.modelRegistry),\n defaultModel: () => extensionContext.model,\n mcpTool: () => sessionContext.get(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE) as DoomChildSessionTool | undefined,\n });\n sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());\n sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);\n });\n}\n\n/** Bind terminal Pi child ownership inside the core Cordis composition, before feature packages consume it. */\nexport async function terminalChildSessionExtension(pi: ExtensionAPI): Promise<void> {\n const agentDir = getAgentDir();\n const models = await ModelRuntime.create({\n authPath: path.join(agentDir, 'auth.json'),\n modelsPath: path.join(agentDir, 'models.json'),\n refreshOnCreate: false,\n });\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const sessionsRoot = path.join(agentDir, 'sessions');\n const fiber = connection.root.plugin((cordis) => terminalChildSessionPlugin(cordis, models, sessionsRoot));\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n try {\n await fiber;\n } catch (error) {\n await fiber.dispose();\n await connection.dispose();\n throw error;\n }\n}\n\nexport default terminalChildSessionExtension;\n"],"mappings":";;;;;;AAiBA,MAAM,iBAAiB;;;;;;;;;;AAWvB,SAAS,oBAAoB,UAA8C;CACzE,MAAM,YAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,SAAS,yBAAyB,GAAG;EACpD,MAAM,WAAW,SAAS,4BAA4B,EAAE,KAAK,SAAS,YAAY,EAAE;EACpF,IAAI,aAAa,KAAA,GAAW,UAAU,KAAK,QAAQ;CACrD;CACA,OAAO;AACT;AAEA,SAAS,2BAA2B,QAAiB,QAAsB,cAA4B;CACrG,OAAO,OAAO,CAAC,2BAA2B,IAAI,mBAAmB;EAE/D,MAAM,mBADU,eAAe,IAAI,2BACJ,CAAC,CAAC;EACjC,MAAM,gBAAgB,4CAA4C;GAChE,KAAK,iBAAiB;GACtB;GACA;GACA,iBAAiB,oBAAoB,iBAAiB,aAAa;GACnE,oBAAoB,iBAAiB;GACrC,eAAe,eAAe,IAAI,mCAAmC;EACvE,CAAC;EACD,eAAe,QAAQ,4BAA4B,cAAc,IAAI,CAAC;EACtE,eAAe,mBAAmB,cAAc,MAAM,GAAG,GAAG,eAAe,UAAU;CACvF,CAAC;AACH;;AAGA,eAAsB,8BAA8B,IAAiC;CACnF,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,MAAM,aAAa,OAAO;EACvC,UAAU,KAAK,KAAK,UAAU,WAAW;EACzC,YAAY,KAAK,KAAK,UAAU,aAAa;EAC7C,iBAAiB;CACnB,CAAC;CACD,MAAM,aAAa,MAAM,sBAAsB,IAAI,cAAc;CACjE,MAAM,eAAe,KAAK,KAAK,UAAU,UAAU;CACnD,MAAM,QAAQ,WAAW,KAAK,QAAQ,WAAW,2BAA2B,QAAQ,QAAQ,YAAY,CAAC;CACzG,IAAI;CACJ,GAAG,GACD,0BAEG,cAAc,YAAY;EACzB,IAAI;GACF,MAAM,MAAM,QAAQ;EACtB,UAAU;GACR,MAAM,WAAW,QAAQ;EAC3B;CACF,EAAA,CAAG,CACP;CACA,IAAI;EACF,MAAM;CACR,SAAS,OAAO;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAW,QAAQ;EACzB,MAAM;CACR;AACF"}
@@ -12,9 +12,9 @@ let node_fs = require("node:fs");
12
12
  node_fs = require_runtime.__toESM(node_fs, 1);
13
13
  let _agimon_ai_doompi_config_majorModes = require("@agimon-ai/doompi-config/majorModes");
14
14
  let _agimon_ai_doompi_core_childProcess = require("@agimon-ai/doompi-core/childProcess");
15
- let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
16
15
  let _agimon_ai_doompi_config_piContext = require("@agimon-ai/doompi-config/piContext");
17
16
  let _agimon_ai_doompi_core_config = require("@agimon-ai/doompi-core/config");
17
+ let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
18
18
  let _agimon_ai_doompi_core_transition = require("@agimon-ai/doompi-core/transition");
19
19
  let _agimon_ai_doompi_core_transitionCoordinator = require("@agimon-ai/doompi-core/transitionCoordinator");
20
20
  //#region src/extensions/transitionCoordinator.ts
@@ -6,9 +6,9 @@ import { extensionLayers } from "../src/composition/transitionLayers.mjs";
6
6
  import fs from "node:fs";
7
7
  import { filterHookDisabledLayers, loadMajorModesConfig, resolveLayers } from "@agimon-ai/doompi-config/majorModes";
8
8
  import { alreadyComposed } from "@agimon-ai/doompi-core/childProcess";
9
- import { DOOM_CORDIS_SESSION_SERVICE, connectDoomCordisHost } from "@agimon-ai/doompi-core/cordisHost";
10
9
  import { readDoomConfigContextGeneration, requireDoomConfigContext } from "@agimon-ai/doompi-config/piContext";
11
10
  import { DOOM_CONFIG_SERVICE } from "@agimon-ai/doompi-core/config";
11
+ import { DOOM_CORDIS_SESSION_SERVICE, connectDoomCordisHost } from "@agimon-ai/doompi-core/cordisHost";
12
12
  import { DOOM_TRANSITION_SERVICE } from "@agimon-ai/doompi-core/transition";
13
13
  import { createDoomTransitionCoordinator } from "@agimon-ai/doompi-core/transitionCoordinator";
14
14
  //#region src/extensions/transitionCoordinator.ts