@agimon-ai/doompi-plan 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/config.cjs +2 -0
  5. package/dist/config.cjs.map +1 -0
  6. package/dist/config.d.cts +14 -0
  7. package/dist/config.d.cts.map +1 -0
  8. package/dist/config.d.mts +14 -0
  9. package/dist/config.d.mts.map +1 -0
  10. package/dist/config.mjs +2 -0
  11. package/dist/config.mjs.map +1 -0
  12. package/dist/extension.cjs +2 -0
  13. package/dist/extension.cjs.map +1 -0
  14. package/dist/extension.d.cts +8 -0
  15. package/dist/extension.d.cts.map +1 -0
  16. package/dist/extension.d.mts +8 -0
  17. package/dist/extension.d.mts.map +1 -0
  18. package/dist/extension.mjs +2 -0
  19. package/dist/extension.mjs.map +1 -0
  20. package/dist/extensions/doom.cjs +2 -0
  21. package/dist/extensions/doom.cjs.map +1 -0
  22. package/dist/extensions/doom.d.cts +8 -0
  23. package/dist/extensions/doom.d.cts.map +1 -0
  24. package/dist/extensions/doom.d.mts +8 -0
  25. package/dist/extensions/doom.d.mts.map +1 -0
  26. package/dist/extensions/doom.mjs +2 -0
  27. package/dist/extensions/doom.mjs.map +1 -0
  28. package/dist/extensions/pi.cjs +2 -0
  29. package/dist/extensions/pi.cjs.map +1 -0
  30. package/dist/extensions/pi.d.cts +2 -0
  31. package/dist/extensions/pi.d.mts +2 -0
  32. package/dist/extensions/pi.mjs +2 -0
  33. package/dist/extensions/pi.mjs.map +1 -0
  34. package/dist/fableFlow.cjs +3 -0
  35. package/dist/fableFlow.cjs.map +1 -0
  36. package/dist/fableFlow.d.cts +66 -0
  37. package/dist/fableFlow.d.cts.map +1 -0
  38. package/dist/fableFlow.d.mts +66 -0
  39. package/dist/fableFlow.d.mts.map +1 -0
  40. package/dist/fableFlow.mjs +3 -0
  41. package/dist/fableFlow.mjs.map +1 -0
  42. package/dist/index.cjs +1 -0
  43. package/dist/index.d.cts +5 -0
  44. package/dist/index.d.mts +5 -0
  45. package/dist/index.mjs +1 -0
  46. package/dist/logSinkTelemetry.cjs +2 -0
  47. package/dist/logSinkTelemetry.cjs.map +1 -0
  48. package/dist/logSinkTelemetry.d.cts +24 -0
  49. package/dist/logSinkTelemetry.d.cts.map +1 -0
  50. package/dist/logSinkTelemetry.d.mts +24 -0
  51. package/dist/logSinkTelemetry.d.mts.map +1 -0
  52. package/dist/logSinkTelemetry.mjs +2 -0
  53. package/dist/logSinkTelemetry.mjs.map +1 -0
  54. package/dist/planConfig.cjs +2 -0
  55. package/dist/planConfig.cjs.map +1 -0
  56. package/dist/planConfig.mjs +2 -0
  57. package/dist/planConfig.mjs.map +1 -0
  58. package/dist/planMode.cjs +6 -0
  59. package/dist/planMode.cjs.map +1 -0
  60. package/dist/planMode.d.cts +75 -0
  61. package/dist/planMode.d.cts.map +1 -0
  62. package/dist/planMode.d.mts +75 -0
  63. package/dist/planMode.d.mts.map +1 -0
  64. package/dist/planMode.mjs +6 -0
  65. package/dist/planMode.mjs.map +1 -0
  66. package/dist/prompts.cjs +3 -0
  67. package/dist/prompts.cjs.map +1 -0
  68. package/dist/prompts.d.cts +24 -0
  69. package/dist/prompts.d.cts.map +1 -0
  70. package/dist/prompts.d.mts +24 -0
  71. package/dist/prompts.d.mts.map +1 -0
  72. package/dist/prompts.mjs +3 -0
  73. package/dist/prompts.mjs.map +1 -0
  74. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vuong Ngo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @agimon-ai/doompi-plan
2
+
3
+ Reusable Pi read-only planning mode extension.
4
+
5
+ Repository read-only planning, plan persistence, and approval handoff. Plan is a minor mode:
6
+ it toggles mid-session and reports itself on the shared `MODES` line.
7
+
8
+ Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
9
+ only the skills and tools you name. This package is composed by Doompi and is not usually
10
+ installed on its own.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install @agimon-ai/doompi-plan
16
+ ```
17
+
18
+ ## How it loads
19
+
20
+ Name it in a layer in `.doom/modes.yaml`, then add that layer to a major mode:
21
+
22
+ ```yaml
23
+ layers:
24
+ plan-mode:
25
+ packages: ['@agimon-ai/doompi-plan/extensions/doom']
26
+
27
+ majorMode:
28
+ dev: [plan-mode]
29
+ ```
30
+
31
+ ## Leader
32
+
33
+ `SPC p p` plans, `SPC p c` cancels, `SPC p d` debugs, `SPC p f` runs the fable flow, once
34
+ the extension is loaded.
35
+
36
+ ## Entry points
37
+
38
+ 9 subpaths are declared in the `exports` field of `package.json`.
39
+
40
+ ## License
41
+
42
+ MIT
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
@@ -0,0 +1,2 @@
1
+ require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`@agimon-ai/doompi-config`);function t(t,n){let r=(0,e.parseDoomConfig)(t,n);return r.modes?{modes:r.modes}:{}}function n(t,n){let r=(0,e.mergeDoomConfigs)({...t,projectTrust:`ask`},{...n,projectTrust:`ask`});return r.modes?{modes:r.modes}:{}}function r(t,n){let r=(0,e.loadDoomConfig)(t,n);return r.modes?{modes:r.modes}:{}}exports.loadDoomConfig=r,exports.mergeDoomConfigs=n,exports.parseDoomConfig=t;
2
+ //# sourceMappingURL=config.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.cjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import {\n getHarnessState,\n globalDoomConfigPath,\n loadDoomConfig as loadSharedDoomConfig,\n loadHarnessState,\n mergeDoomConfigs as mergeSharedDoomConfigs,\n parseDoomConfig as parseSharedDoomConfig,\n parsePlanningModeConfig,\n repositoryDoomConfigPath,\n resolvePlanningPlansDirectory,\n type PlanningAgentConfig,\n type PlanningModeConfig,\n type PlanningThinkingLevel,\n} from '@agimon-ai/doompi-config';\n\nexport type { PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel };\n\nexport interface DoomConfig {\n modes?: {\n planning?: PlanningModeConfig;\n };\n}\n\nconst DEFAULT_PROJECT_TRUST = 'ask' as const;\n\nexport {\n getHarnessState,\n globalDoomConfigPath,\n loadHarnessState,\n parsePlanningModeConfig,\n repositoryDoomConfigPath,\n resolvePlanningPlansDirectory,\n};\n\nexport function parseDoomConfig(content: string, filePath: string): DoomConfig {\n const config = parseSharedDoomConfig(content, filePath);\n return config.modes ? { modes: config.modes } : {};\n}\n\nexport function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig {\n const merged = mergeSharedDoomConfigs(\n { ...globalConfig, projectTrust: DEFAULT_PROJECT_TRUST },\n { ...repositoryConfig, projectTrust: DEFAULT_PROJECT_TRUST },\n );\n return merged.modes ? { modes: merged.modes } : {};\n}\n\nexport function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig {\n const config = loadSharedDoomConfig(repoRoot, homeDirectory);\n return config.modes ? { modes: config.modes } : {};\n}\n"],"mappings":"sFAkCA,SAAgB,EAAgB,EAAiB,EAA8B,CAC7E,IAAM,GAAA,EAAA,EAAA,iBAA+B,EAAS,EAAS,CACvD,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE,CAGpD,SAAgB,EAAiB,EAA0B,EAA0C,CACnG,IAAM,GAAA,EAAA,EAAA,kBACJ,CAAE,GAAG,EAAc,aAAc,MAAuB,CACxD,CAAE,GAAG,EAAkB,aAAc,MAAuB,CAC7D,CACD,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE,CAGpD,SAAgB,EAAe,EAAkB,EAAoC,CACnF,IAAM,GAAA,EAAA,EAAA,gBAA8B,EAAU,EAAc,CAC5D,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE"}
@@ -0,0 +1,14 @@
1
+ import { PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, getHarnessState, globalDoomConfigPath, loadHarnessState, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "@agimon-ai/doompi-config";
2
+
3
+ //#region src/config.d.ts
4
+ interface DoomConfig {
5
+ modes?: {
6
+ planning?: PlanningModeConfig;
7
+ };
8
+ }
9
+ declare function parseDoomConfig(content: string, filePath: string): DoomConfig;
10
+ declare function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
11
+ declare function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig;
12
+ //#endregion
13
+ export { DoomConfig, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, getHarnessState, globalDoomConfigPath, loadDoomConfig, loadHarnessState, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory };
14
+ //# sourceMappingURL=config.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;UAiBiB,UAAA;EACf,KAAA;IACE,QAAA,GAAW,kBAAA;EAAA;AAAA;AAAA,iBAeC,eAAA,CAAgB,OAAA,UAAiB,QAAA,WAAmB,UAAA;AAAA,iBAKpD,gBAAA,CAAiB,YAAA,EAAc,UAAA,EAAY,gBAAA,EAAkB,UAAA,GAAa,UAAA;AAAA,iBAQ1E,cAAA,CAAe,QAAA,UAAkB,aAAA,YAAyB,UAAA"}
@@ -0,0 +1,14 @@
1
+ import { PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, getHarnessState, globalDoomConfigPath as globalDoomConfigPath$1, loadHarnessState, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "@agimon-ai/doompi-config";
2
+
3
+ //#region src/config.d.ts
4
+ interface DoomConfig {
5
+ modes?: {
6
+ planning?: PlanningModeConfig;
7
+ };
8
+ }
9
+ declare function parseDoomConfig$1(content: string, filePath: string): DoomConfig;
10
+ declare function mergeDoomConfigs$1(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
11
+ declare function loadDoomConfig$1(repoRoot: string, homeDirectory?: string): DoomConfig;
12
+ //#endregion
13
+ export { DoomConfig, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, getHarnessState, globalDoomConfigPath$1 as globalDoomConfigPath, loadDoomConfig$1 as loadDoomConfig, loadHarnessState, mergeDoomConfigs$1 as mergeDoomConfigs, parseDoomConfig$1 as parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory };
14
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;UAiBiB,UAAA;EACf,KAAA;IACE,QAAA,GAAW,kBAAA;EAAA;AAAA;AAAA,iBAeC,iBAAA,CAAgB,OAAA,UAAiB,QAAA,WAAmB,UAAA;AAAA,iBAKpD,kBAAA,CAAiB,YAAA,EAAc,UAAA,EAAY,gBAAA,EAAkB,UAAA,GAAa,UAAA;AAAA,iBAQ1E,gBAAA,CAAe,QAAA,UAAkB,aAAA,YAAyB,UAAA"}
@@ -0,0 +1,2 @@
1
+ import{getHarnessState as e,globalDoomConfigPath as t,loadDoomConfig as n,loadHarnessState as r,mergeDoomConfigs as i,parseDoomConfig as a,parsePlanningModeConfig as o,repositoryDoomConfigPath as s,resolvePlanningPlansDirectory as c}from"@agimon-ai/doompi-config";function l(e,t){let n=a(e,t);return n.modes?{modes:n.modes}:{}}function u(e,t){let n=i({...e,projectTrust:`ask`},{...t,projectTrust:`ask`});return n.modes?{modes:n.modes}:{}}function d(e,t){let r=n(e,t);return r.modes?{modes:r.modes}:{}}export{e as getHarnessState,t as globalDoomConfigPath,d as loadDoomConfig,r as loadHarnessState,u as mergeDoomConfigs,l as parseDoomConfig,o as parsePlanningModeConfig,s as repositoryDoomConfigPath,c as resolvePlanningPlansDirectory};
2
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","names":["parseDoomConfig","parseSharedDoomConfig","mergeDoomConfigs","mergeSharedDoomConfigs","loadDoomConfig","loadSharedDoomConfig"],"sources":["../src/config.ts"],"sourcesContent":["import {\n getHarnessState,\n globalDoomConfigPath,\n loadDoomConfig as loadSharedDoomConfig,\n loadHarnessState,\n mergeDoomConfigs as mergeSharedDoomConfigs,\n parseDoomConfig as parseSharedDoomConfig,\n parsePlanningModeConfig,\n repositoryDoomConfigPath,\n resolvePlanningPlansDirectory,\n type PlanningAgentConfig,\n type PlanningModeConfig,\n type PlanningThinkingLevel,\n} from '@agimon-ai/doompi-config';\n\nexport type { PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel };\n\nexport interface DoomConfig {\n modes?: {\n planning?: PlanningModeConfig;\n };\n}\n\nconst DEFAULT_PROJECT_TRUST = 'ask' as const;\n\nexport {\n getHarnessState,\n globalDoomConfigPath,\n loadHarnessState,\n parsePlanningModeConfig,\n repositoryDoomConfigPath,\n resolvePlanningPlansDirectory,\n};\n\nexport function parseDoomConfig(content: string, filePath: string): DoomConfig {\n const config = parseSharedDoomConfig(content, filePath);\n return config.modes ? { modes: config.modes } : {};\n}\n\nexport function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig {\n const merged = mergeSharedDoomConfigs(\n { ...globalConfig, projectTrust: DEFAULT_PROJECT_TRUST },\n { ...repositoryConfig, projectTrust: DEFAULT_PROJECT_TRUST },\n );\n return merged.modes ? { modes: merged.modes } : {};\n}\n\nexport function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig {\n const config = loadSharedDoomConfig(repoRoot, homeDirectory);\n return config.modes ? { modes: config.modes } : {};\n}\n"],"mappings":"wQAkCA,SAAgBA,EAAgB,EAAiB,EAA8B,CAC7E,IAAM,EAASC,EAAsB,EAAS,EAAS,CACvD,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE,CAGpD,SAAgBC,EAAiB,EAA0B,EAA0C,CACnG,IAAM,EAASC,EACb,CAAE,GAAG,EAAc,aAAc,MAAuB,CACxD,CAAE,GAAG,EAAkB,aAAc,MAAuB,CAC7D,CACD,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE,CAGpD,SAAgBC,EAAe,EAAkB,EAAoC,CACnF,IAAM,EAASC,EAAqB,EAAU,EAAc,CAC5D,OAAO,EAAO,MAAQ,CAAE,MAAO,EAAO,MAAO,CAAG,EAAE"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./planMode.cjs`),t={recordError:async()=>void 0,recordWarning:async()=>void 0,recordEvent:async()=>void 0,flush:async()=>void 0,shutdown:async()=>void 0};function n(n){e.planModeExtension(n,()=>void 0,t,{doomIntegrations:!1})}exports.activateStandardPlanExtension=n;
2
+ //# sourceMappingURL=extension.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.cjs","names":[],"sources":["../src/extension.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport type { PlanTelemetry } from './logSinkTelemetry.ts';\nimport { planModeExtension } from './planMode.ts';\n\nconst standardTelemetry: PlanTelemetry = {\n recordError: async () => undefined,\n recordWarning: async () => undefined,\n recordEvent: async () => undefined,\n flush: async () => undefined,\n shutdown: async () => undefined,\n};\n\n/** Standard Pi composition using session APIs without Doom config or UI providers. */\nexport function activateStandardPlanExtension(pi: ExtensionAPI): void {\n planModeExtension(pi, () => undefined, standardTelemetry, { doomIntegrations: false });\n}\n"],"mappings":"kCAKM,EAAmC,CACvC,YAAa,SAAY,IAAA,GACzB,cAAe,SAAY,IAAA,GAC3B,YAAa,SAAY,IAAA,GACzB,MAAO,SAAY,IAAA,GACnB,SAAU,SAAY,IAAA,GACvB,CAGD,SAAgB,EAA8B,EAAwB,CACpE,EAAA,kBAAkB,MAAU,IAAA,GAAW,EAAmB,CAAE,iBAAkB,GAAO,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extension.d.ts
4
+ /** Standard Pi composition using session APIs without Doom config or UI providers. */
5
+ declare function activateStandardPlanExtension(pi: ExtensionAPI): void;
6
+ //#endregion
7
+ export { activateStandardPlanExtension };
8
+ //# sourceMappingURL=extension.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../src/extension.ts"],"mappings":";;;;iBAcgB,6BAAA,CAA8B,EAAA,EAAI,YAAA"}
@@ -0,0 +1,8 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extension.d.ts
4
+ /** Standard Pi composition using session APIs without Doom config or UI providers. */
5
+ declare function activateStandardPlanExtension(pi: ExtensionAPI): void;
6
+ //#endregion
7
+ export { activateStandardPlanExtension };
8
+ //# sourceMappingURL=extension.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.mts","names":[],"sources":["../src/extension.ts"],"mappings":";;;;iBAcgB,6BAAA,CAA8B,EAAA,EAAI,YAAA"}
@@ -0,0 +1,2 @@
1
+ import{planModeExtension as e}from"./planMode.mjs";const t={recordError:async()=>void 0,recordWarning:async()=>void 0,recordEvent:async()=>void 0,flush:async()=>void 0,shutdown:async()=>void 0};function n(n){e(n,()=>void 0,t,{doomIntegrations:!1})}export{n as activateStandardPlanExtension};
2
+ //# sourceMappingURL=extension.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.mjs","names":[],"sources":["../src/extension.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport type { PlanTelemetry } from './logSinkTelemetry.ts';\nimport { planModeExtension } from './planMode.ts';\n\nconst standardTelemetry: PlanTelemetry = {\n recordError: async () => undefined,\n recordWarning: async () => undefined,\n recordEvent: async () => undefined,\n flush: async () => undefined,\n shutdown: async () => undefined,\n};\n\n/** Standard Pi composition using session APIs without Doom config or UI providers. */\nexport function activateStandardPlanExtension(pi: ExtensionAPI): void {\n planModeExtension(pi, () => undefined, standardTelemetry, { doomIntegrations: false });\n}\n"],"mappings":"mDAKA,MAAM,EAAmC,CACvC,YAAa,SAAY,IAAA,GACzB,cAAe,SAAY,IAAA,GAC3B,YAAa,SAAY,IAAA,GACzB,MAAO,SAAY,IAAA,GACnB,SAAU,SAAY,IAAA,GACvB,CAGD,SAAgB,EAA8B,EAAwB,CACpE,EAAkB,MAAU,IAAA,GAAW,EAAmB,CAAE,iBAAkB,GAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require(`../planMode.cjs`);function t(t){e.planModeExtension(t)}exports.default=t,exports.doomPlanExtension=t;
2
+ //# sourceMappingURL=doom.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doom.cjs","names":[],"sources":["../../src/extensions/doom.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { planModeExtension } from '../planMode.ts';\n\n/** Doom composition: Doom config, telemetry, and the SPC p leader contribution. */\nexport function doomPlanExtension(pi: ExtensionAPI): void {\n planModeExtension(pi);\n}\n\nexport { doomPlanExtension as default };\n"],"mappings":"kIAKA,SAAgB,EAAkB,EAAwB,CACxD,EAAA,kBAAkB,EAAG"}
@@ -0,0 +1,8 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extensions/doom.d.ts
4
+ /** Doom composition: Doom config, telemetry, and the SPC p leader contribution. */
5
+ declare function doomPlanExtension(pi: ExtensionAPI): void;
6
+ //#endregion
7
+ export { doomPlanExtension as default, doomPlanExtension };
8
+ //# sourceMappingURL=doom.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doom.d.cts","names":[],"sources":["../../src/extensions/doom.ts"],"mappings":";;;;iBAKgB,iBAAA,CAAkB,EAAA,EAAI,YAAA"}
@@ -0,0 +1,8 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extensions/doom.d.ts
4
+ /** Doom composition: Doom config, telemetry, and the SPC p leader contribution. */
5
+ declare function doomPlanExtension(pi: ExtensionAPI): void;
6
+ //#endregion
7
+ export { doomPlanExtension as default, doomPlanExtension };
8
+ //# sourceMappingURL=doom.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doom.d.mts","names":[],"sources":["../../src/extensions/doom.ts"],"mappings":";;;;iBAKgB,iBAAA,CAAkB,EAAA,EAAI,YAAA"}
@@ -0,0 +1,2 @@
1
+ import{planModeExtension as e}from"../planMode.mjs";function t(t){e(t)}export{t as default,t as doomPlanExtension};
2
+ //# sourceMappingURL=doom.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doom.mjs","names":[],"sources":["../../src/extensions/doom.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { planModeExtension } from '../planMode.ts';\n\n/** Doom composition: Doom config, telemetry, and the SPC p leader contribution. */\nexport function doomPlanExtension(pi: ExtensionAPI): void {\n planModeExtension(pi);\n}\n\nexport { doomPlanExtension as default };\n"],"mappings":"oDAKA,SAAgB,EAAkB,EAAwB,CACxD,EAAkB,EAAG"}
@@ -0,0 +1,2 @@
1
+ var e=require(`../extension.cjs`).activateStandardPlanExtension;module.exports=e;
2
+ //# sourceMappingURL=pi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.cjs","names":["activateStandardPlanExtension"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { activateStandardPlanExtension } from '../extension.ts';\n\nexport default activateStandardPlanExtension;\n"],"mappings":"AAEA,IAAA,6BAAeA,CAAAA"}
@@ -0,0 +1,2 @@
1
+ import { activateStandardPlanExtension } from "../extension.cjs";
2
+ export = activateStandardPlanExtension;
@@ -0,0 +1,2 @@
1
+ import { activateStandardPlanExtension } from "../extension.mjs";
2
+ export { activateStandardPlanExtension as default };
@@ -0,0 +1,2 @@
1
+ import{activateStandardPlanExtension as e}from"../extension.mjs";var t=e;export{t as default};
2
+ //# sourceMappingURL=pi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { activateStandardPlanExtension } from '../extension.ts';\n\nexport default activateStandardPlanExtension;\n"],"mappings":"iEAEA,IAAA,EAAe"}
@@ -0,0 +1,3 @@
1
+ require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`node:buffer`),t=require(`node:crypto`);const n=`@agimon-ai/doompi-plan`,r=`claude`,i=`fable`,a=`claude/fable-plan-v1`,o=[/(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|private[_-]?key|authorization|bearer)\s*[:=]/iu,/-----BEGIN [A-Z ]*PRIVATE KEY-----/u,/\bsk-[A-Za-z0-9_-]{16,}\b/u,/\bgh[pousr]_[A-Za-z0-9_]{16,}\b/u];function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=31||e===127))return!0}return!1}function l(e){return o.some(t=>t.test(e))}function u(t,n,r=!0){if(typeof t!=`string`)throw Error(`${n} must be a string.`);let i=t.trim();if(!i&&r)throw Error(`${n} must not be empty.`);if(e.Buffer.byteLength(i,`utf8`)>4096||c(i))throw Error(`${n} exceeds the bounded Fable text limit or contains control characters.`);if(l(i))throw Error(`${n} appears to contain a credential.`);return i}function d(e,t,n=!0){if(!Array.isArray(e))throw Error(`${t} must be an array.`);if(e.length>24)throw Error(`${t} exceeds the bounded item limit.`);let r=e.map((e,n)=>u(e,`${t}[${n}]`));if(n&&r.length===0)throw Error(`${t} must contain at least one item.`);return r}function f(e,t){if(typeof e!=`string`)throw Error(`${t} must be a string.`);let n=e.trim();if(!n||n.length>512||c(n))throw Error(`${t} is not a safe source path.`);if(l(n))throw Error(`${t} appears to contain a credential.`);return n}function p(e){if(!Array.isArray(e))throw Error(`verifiedFindings must be an array.`);if(e.length>24)throw Error(`verifiedFindings exceeds the bounded item limit.`);return e.map((e,t)=>{if(!s(e))throw Error(`verifiedFindings[${t}] must be an object.`);if(Object.keys(e).some(e=>e!==`path`&&e!==`finding`))throw Error(`verifiedFindings[${t}] contains an unsupported field.`);return{path:f(e.path,`verifiedFindings[${t}].path`),finding:u(e.finding,`verifiedFindings[${t}].finding`)}})}function m(e,t,n){let r=new Set(t),i=Object.keys(e).find(e=>!r.has(e));if(i)throw Error(`${n} contains unsupported field '${i}'.`)}function h(t){if(!s(t))throw Error(`Fable packet must be an object.`);m(t,[`goal`,`constraints`,`decisions`,`verifiedFindings`,`inferredFindings`,`unresolvedQuestions`,`currentPlan`],`Fable packet`);let n={goal:d(t.goal,`goal`),constraints:d(t.constraints,`constraints`,!1),decisions:d(t.decisions,`decisions`,!1),verifiedFindings:p(t.verifiedFindings),inferredFindings:d(t.inferredFindings,`inferredFindings`,!1),unresolvedQuestions:d(t.unresolvedQuestions,`unresolvedQuestions`,!1),...t.currentPlan===void 0?{}:{currentPlan:u(t.currentPlan,`currentPlan`,!1)}};if(e.Buffer.byteLength(JSON.stringify(n),`utf8`)>32768)throw Error(`Fable packet exceeds the bounded packet size.`);return n}function g(e){return l([e.draft,e.review].filter(e=>e!==void 0).join(`
2
+ `))?{operationId:e.operationId,status:`failed`,stage:`failed`,durationMs:e.durationMs,errorCode:`unsafe_output`}:e}function _(e,t){return{operationId:e,status:`timed_out`,stage:`interrupted`,durationMs:Math.max(0,Date.now()-t),errorCode:`timeout`}}function v(e){let o,s=(t=`Fable operation cancelled.`)=>{let n=o;if(n){if(!n.cancelSent){n.cancelSent=!0;try{e.broker?.cancel(n.operationId,t)}catch(t){e.onError?.(t)}}n.controller.abort(Error(t))}};return{run:async(c,l)=>{if(o)throw Error(`A Fable operation is already active for this session.`);if(!e.isAuthorized())throw Error(`The Fable capability profile is not authorized.`);let u=h(c),d=`fable-${(0,t.randomUUID)()}`,f=Date.now(),p=new AbortController;o={operationId:d,controller:p,cancelSent:!1},e.onStage?.(`draft`);let m=()=>p.abort(l?.reason);l&&(l.addEventListener(`abort`,m,{once:!0}),l.aborted&&m());let v={requester:n,operationId:d,runtime:r,model:i,profile:a,packet:u},y,b=!1;try{if(!e.broker)return _(d,f);let t=e.broker.start(v,p.signal),n=new Promise(e=>{p.signal.addEventListener(`abort`,()=>{b||e({operationId:d,status:`cancelled`,stage:`cancelled`,durationMs:Math.max(0,Date.now()-f),errorCode:`cancelled`})},{once:!0})}),r=e.timeoutMs===void 0?void 0:new Promise(t=>{y=setTimeout(()=>{b=!0,s(`Fable operation timed out.`),t(_(d,f))},e.timeoutMs)}),i=g(r===void 0?await Promise.race([t,n]):await Promise.race([t,r,n]));return e.onStage?.(i.status===`completed`?`completed`:i.status===`cancelled`?`cancelled`:i.stage),i}catch(t){e.onError?.(t);let n={operationId:d,status:`failed`,stage:`failed`,durationMs:Math.max(0,Date.now()-f),errorCode:`unavailable`};return e.onStage?.(`failed`),n}finally{y&&clearTimeout(y),l&&l.removeEventListener(`abort`,m),o=void 0}},cancel:s,isActive:()=>o!==void 0}}exports.FABLE_PLAN_MODEL=i,exports.FABLE_PLAN_PROFILE=a,exports.FABLE_PLAN_REQUESTER=n,exports.FABLE_PLAN_RUNTIME=r,exports.FABLE_PROVIDER_SOURCE=`@agimon-ai/doompi-team`,exports.MAX_FABLE_ARRAY_ITEMS=24,exports.MAX_FABLE_PACKET_BYTES=32768,exports.MAX_FABLE_TEXT_BYTES=4096,exports.containsSuspectedCredential=l,exports.createFablePlanFlow=v,exports.sanitizeFablePacket=h;
3
+ //# sourceMappingURL=fableFlow.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fableFlow.cjs","names":["Buffer"],"sources":["../src/fableFlow.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\n\nexport const FABLE_PROVIDER_SOURCE = '@agimon-ai/doompi-team';\nexport const FABLE_PLAN_REQUESTER = '@agimon-ai/doompi-plan';\nexport const FABLE_PLAN_RUNTIME = 'claude';\nexport const FABLE_PLAN_MODEL = 'fable';\nexport const FABLE_PLAN_PROFILE = 'claude/fable-plan-v1';\nexport const MAX_FABLE_PACKET_BYTES = 32 * 1024;\nexport const MAX_FABLE_TEXT_BYTES = 4 * 1024;\nexport const MAX_FABLE_ARRAY_ITEMS = 24;\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|private[_-]?key|authorization|bearer)\\s*[:=]/iu,\n /-----BEGIN [A-Z ]*PRIVATE KEY-----/u,\n /\\bsk-[A-Za-z0-9_-]{16,}\\b/u,\n /\\bgh[pousr]_[A-Za-z0-9_]{16,}\\b/u,\n];\nconst CONTROL_CHARACTER_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MAX_SOURCE_PATH_LENGTH = 512;\n\nexport interface FablePlanFinding {\n path: string;\n finding: string;\n}\n\nexport interface FablePlanPacket {\n goal: string[];\n constraints: string[];\n decisions: string[];\n verifiedFindings: FablePlanFinding[];\n inferredFindings: string[];\n unresolvedQuestions: string[];\n currentPlan?: string;\n}\n\nexport type FablePlanStatus = 'completed' | 'failed' | 'timed_out' | 'cancelled' | 'interrupted';\nexport type FablePlanStage = 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';\n\nexport interface FablePlanResult {\n operationId: string;\n status: FablePlanStatus;\n stage: FablePlanStage;\n draft?: string;\n review?: string;\n draftRunId?: string;\n reviewRunId?: string;\n durationMs: number;\n errorCode?: string;\n}\n\nexport interface FablePlanRequest {\n requester: typeof FABLE_PLAN_REQUESTER;\n operationId: string;\n runtime: typeof FABLE_PLAN_RUNTIME;\n model: typeof FABLE_PLAN_MODEL;\n profile: typeof FABLE_PLAN_PROFILE;\n packet: FablePlanPacket;\n}\n\nexport interface FablePlanBroker {\n start(request: FablePlanRequest, signal: AbortSignal): Promise<FablePlanResult>;\n cancel(operationId: string, reason: string): void;\n}\n\nexport interface FableFlowOptions {\n broker?: FablePlanBroker;\n isAuthorized: () => boolean;\n timeoutMs?: number;\n onStage?: (stage: FableStage) => void;\n onError?: (error: unknown) => void;\n}\n\nexport type FableStage = 'idle' | 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';\n\nexport interface FablePlanFlow {\n run(value: unknown, signal?: AbortSignal): Promise<FablePlanResult>;\n cancel(reason?: string): void;\n isActive(): boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= CONTROL_CHARACTER_MAX || code === DELETE_CHARACTER)) return true;\n }\n return false;\n}\n\nexport function containsSuspectedCredential(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction boundedText(value: unknown, field: string, required = true): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string.`);\n const text = value.trim();\n if (!text && required) throw new Error(`${field} must not be empty.`);\n if (Buffer.byteLength(text, 'utf8') > MAX_FABLE_TEXT_BYTES || hasControlCharacter(text)) {\n throw new Error(`${field} exceeds the bounded Fable text limit or contains control characters.`);\n }\n if (containsSuspectedCredential(text)) throw new Error(`${field} appears to contain a credential.`);\n return text;\n}\n\nfunction boundedList(value: unknown, field: string, required = true): string[] {\n if (!Array.isArray(value)) throw new Error(`${field} must be an array.`);\n if (value.length > MAX_FABLE_ARRAY_ITEMS) throw new Error(`${field} exceeds the bounded item limit.`);\n const items = value.map((item, index) => boundedText(item, `${field}[${index}]`));\n if (required && items.length === 0) throw new Error(`${field} must contain at least one item.`);\n return items;\n}\n\nfunction boundedPath(value: unknown, field: string): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string.`);\n const sourcePath = value.trim();\n if (!sourcePath || sourcePath.length > MAX_SOURCE_PATH_LENGTH || hasControlCharacter(sourcePath)) {\n throw new Error(`${field} is not a safe source path.`);\n }\n if (containsSuspectedCredential(sourcePath)) throw new Error(`${field} appears to contain a credential.`);\n return sourcePath;\n}\n\nfunction boundedFindings(value: unknown): FablePlanFinding[] {\n if (!Array.isArray(value)) throw new Error('verifiedFindings must be an array.');\n if (value.length > MAX_FABLE_ARRAY_ITEMS) throw new Error('verifiedFindings exceeds the bounded item limit.');\n return value.map((item, index) => {\n if (!isRecord(item)) throw new Error(`verifiedFindings[${index}] must be an object.`);\n const keys = Object.keys(item);\n if (keys.some((key) => key !== 'path' && key !== 'finding')) {\n throw new Error(`verifiedFindings[${index}] contains an unsupported field.`);\n }\n return {\n path: boundedPath(item.path, `verifiedFindings[${index}].path`),\n finding: boundedText(item.finding, `verifiedFindings[${index}].finding`),\n };\n });\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, keys: readonly string[], field: string): void {\n const allowed = new Set(keys);\n const unexpected = Object.keys(value).find((key) => !allowed.has(key));\n if (unexpected) throw new Error(`${field} contains unsupported field '${unexpected}'.`);\n}\n\nexport function sanitizeFablePacket(value: unknown): FablePlanPacket {\n if (!isRecord(value)) throw new Error('Fable packet must be an object.');\n assertAllowedKeys(\n value,\n ['goal', 'constraints', 'decisions', 'verifiedFindings', 'inferredFindings', 'unresolvedQuestions', 'currentPlan'],\n 'Fable packet',\n );\n const packet: FablePlanPacket = {\n goal: boundedList(value.goal, 'goal'),\n constraints: boundedList(value.constraints, 'constraints', false),\n decisions: boundedList(value.decisions, 'decisions', false),\n verifiedFindings: boundedFindings(value.verifiedFindings),\n inferredFindings: boundedList(value.inferredFindings, 'inferredFindings', false),\n unresolvedQuestions: boundedList(value.unresolvedQuestions, 'unresolvedQuestions', false),\n ...(value.currentPlan === undefined ? {} : { currentPlan: boundedText(value.currentPlan, 'currentPlan', false) }),\n };\n if (Buffer.byteLength(JSON.stringify(packet), 'utf8') > MAX_FABLE_PACKET_BYTES) {\n throw new Error('Fable packet exceeds the bounded packet size.');\n }\n return packet;\n}\n\nfunction safeResult(result: FablePlanResult): FablePlanResult {\n const output = [result.draft, result.review].filter((value): value is string => value !== undefined).join('\\n');\n if (containsSuspectedCredential(output)) {\n return {\n operationId: result.operationId,\n status: 'failed',\n stage: 'failed',\n durationMs: result.durationMs,\n errorCode: 'unsafe_output',\n };\n }\n return result;\n}\n\nfunction timedOutResult(operationId: string, startedAt: number): FablePlanResult {\n return {\n operationId,\n status: 'timed_out',\n stage: 'interrupted',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'timeout',\n };\n}\n\nexport function createFablePlanFlow(options: FableFlowOptions): FablePlanFlow {\n let active:\n | {\n operationId: string;\n controller: AbortController;\n cancelSent: boolean;\n }\n | undefined;\n\n const cancel = (reason = 'Fable operation cancelled.'): void => {\n const current = active;\n if (!current) return;\n if (!current.cancelSent) {\n current.cancelSent = true;\n try {\n options.broker?.cancel(current.operationId, reason);\n } catch (error) {\n options.onError?.(error);\n }\n }\n current.controller.abort(new Error(reason));\n };\n\n const run = async (value: unknown, signal?: AbortSignal): Promise<FablePlanResult> => {\n if (active) throw new Error('A Fable operation is already active for this session.');\n if (!options.isAuthorized()) throw new Error('The Fable capability profile is not authorized.');\n const packet = sanitizeFablePacket(value);\n const operationId = `fable-${randomUUID()}`;\n const startedAt = Date.now();\n const controller = new AbortController();\n active = { operationId, controller, cancelSent: false };\n options.onStage?.('draft');\n\n const parentAbort = (): void => controller.abort(signal?.reason);\n if (signal) {\n signal.addEventListener('abort', parentAbort, { once: true });\n if (signal.aborted) parentAbort();\n }\n\n const brokerRequest: FablePlanRequest = {\n requester: FABLE_PLAN_REQUESTER,\n operationId,\n runtime: FABLE_PLAN_RUNTIME,\n model: FABLE_PLAN_MODEL,\n profile: FABLE_PLAN_PROFILE,\n packet,\n };\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutTriggered = false;\n try {\n if (!options.broker) return timedOutResult(operationId, startedAt);\n const brokerResult = options.broker.start(brokerRequest, controller.signal);\n const cancelledResult = new Promise<FablePlanResult>((resolve) => {\n const onAbort = (): void => {\n if (timeoutTriggered) return;\n resolve({\n operationId,\n status: 'cancelled',\n stage: 'cancelled',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'cancelled',\n });\n };\n controller.signal.addEventListener('abort', onAbort, { once: true });\n });\n const timeoutResult =\n options.timeoutMs === undefined\n ? undefined\n : new Promise<FablePlanResult>((resolve) => {\n timeout = setTimeout(() => {\n timeoutTriggered = true;\n cancel('Fable operation timed out.');\n resolve(timedOutResult(operationId, startedAt));\n }, options.timeoutMs);\n });\n const result =\n timeoutResult === undefined\n ? await Promise.race([brokerResult, cancelledResult])\n : await Promise.race([brokerResult, timeoutResult, cancelledResult]);\n const safe = safeResult(result);\n options.onStage?.(\n safe.status === 'completed' ? 'completed' : safe.status === 'cancelled' ? 'cancelled' : safe.stage,\n );\n return safe;\n } catch (error) {\n options.onError?.(error);\n const failure: FablePlanResult = {\n operationId,\n status: 'failed',\n stage: 'failed',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'unavailable',\n };\n options.onStage?.('failed');\n return failure;\n } finally {\n if (timeout) clearTimeout(timeout);\n if (signal) signal.removeEventListener('abort', parentAbort);\n active = undefined;\n }\n };\n\n return {\n run,\n cancel,\n isActive: () => active !== undefined,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ //#region src/fableFlow.d.ts
2
+ declare const FABLE_PROVIDER_SOURCE = "@agimon-ai/doompi-team";
3
+ declare const FABLE_PLAN_REQUESTER = "@agimon-ai/doompi-plan";
4
+ declare const FABLE_PLAN_RUNTIME = "claude";
5
+ declare const FABLE_PLAN_MODEL = "fable";
6
+ declare const FABLE_PLAN_PROFILE = "claude/fable-plan-v1";
7
+ declare const MAX_FABLE_PACKET_BYTES: number;
8
+ declare const MAX_FABLE_TEXT_BYTES: number;
9
+ declare const MAX_FABLE_ARRAY_ITEMS = 24;
10
+ interface FablePlanFinding {
11
+ path: string;
12
+ finding: string;
13
+ }
14
+ interface FablePlanPacket {
15
+ goal: string[];
16
+ constraints: string[];
17
+ decisions: string[];
18
+ verifiedFindings: FablePlanFinding[];
19
+ inferredFindings: string[];
20
+ unresolvedQuestions: string[];
21
+ currentPlan?: string;
22
+ }
23
+ type FablePlanStatus = 'completed' | 'failed' | 'timed_out' | 'cancelled' | 'interrupted';
24
+ type FablePlanStage = 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
25
+ interface FablePlanResult {
26
+ operationId: string;
27
+ status: FablePlanStatus;
28
+ stage: FablePlanStage;
29
+ draft?: string;
30
+ review?: string;
31
+ draftRunId?: string;
32
+ reviewRunId?: string;
33
+ durationMs: number;
34
+ errorCode?: string;
35
+ }
36
+ interface FablePlanRequest {
37
+ requester: typeof FABLE_PLAN_REQUESTER;
38
+ operationId: string;
39
+ runtime: typeof FABLE_PLAN_RUNTIME;
40
+ model: typeof FABLE_PLAN_MODEL;
41
+ profile: typeof FABLE_PLAN_PROFILE;
42
+ packet: FablePlanPacket;
43
+ }
44
+ interface FablePlanBroker {
45
+ start(request: FablePlanRequest, signal: AbortSignal): Promise<FablePlanResult>;
46
+ cancel(operationId: string, reason: string): void;
47
+ }
48
+ interface FableFlowOptions {
49
+ broker?: FablePlanBroker;
50
+ isAuthorized: () => boolean;
51
+ timeoutMs?: number;
52
+ onStage?: (stage: FableStage) => void;
53
+ onError?: (error: unknown) => void;
54
+ }
55
+ type FableStage = 'idle' | 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
56
+ interface FablePlanFlow {
57
+ run(value: unknown, signal?: AbortSignal): Promise<FablePlanResult>;
58
+ cancel(reason?: string): void;
59
+ isActive(): boolean;
60
+ }
61
+ declare function containsSuspectedCredential(value: string): boolean;
62
+ declare function sanitizeFablePacket(value: unknown): FablePlanPacket;
63
+ declare function createFablePlanFlow(options: FableFlowOptions): FablePlanFlow;
64
+ //#endregion
65
+ export { FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, containsSuspectedCredential, createFablePlanFlow, sanitizeFablePacket };
66
+ //# sourceMappingURL=fableFlow.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fableFlow.d.cts","names":[],"sources":["../src/fableFlow.ts"],"mappings":";cAGa,qBAAA;AAAA,cACA,oBAAA;AAAA,cACA,kBAAA;AAAA,cACA,gBAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,oBAAA;AAAA,cACA,qBAAA;AAAA,UAYI,gBAAA;EACf,IAAA;EACA,OAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,EAAkB,gBAAA;EAClB,gBAAA;EACA,mBAAA;EACA,WAAA;AAAA;AAAA,KAGU,eAAA;AAAA,KACA,cAAA;AAAA,UAEK,eAAA;EACf,WAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA,EAAO,cAAA;EACP,KAAA;EACA,MAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA;EACf,SAAA,SAAkB,oBAAA;EAClB,WAAA;EACA,OAAA,SAAgB,kBAAA;EAChB,KAAA,SAAc,gBAAA;EACd,OAAA,SAAgB,kBAAA;EAChB,MAAA,EAAQ,eAAA;AAAA;AAAA,UAGO,eAAA;EACf,KAAA,CAAM,OAAA,EAAS,gBAAA,EAAkB,MAAA,EAAQ,WAAA,GAAc,OAAA,CAAQ,eAAA;EAC/D,MAAA,CAAO,WAAA,UAAqB,MAAA;AAAA;AAAA,UAGb,gBAAA;EACf,MAAA,GAAS,eAAA;EACT,YAAA;EACA,SAAA;EACA,OAAA,IAAW,KAAA,EAAO,UAAA;EAClB,OAAA,IAAW,KAAA;AAAA;AAAA,KAGD,UAAA;AAAA,UAEK,aAAA;EACf,GAAA,CAAI,KAAA,WAAgB,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,eAAA;EACnD,MAAA,CAAO,MAAA;EACP,QAAA;AAAA;AAAA,iBAec,2BAAA,CAA4B,KAAA;AAAA,iBAuD5B,mBAAA,CAAoB,KAAA,YAAiB,eAAA;AAAA,iBA8CrC,mBAAA,CAAoB,OAAA,EAAS,gBAAA,GAAmB,aAAA"}
@@ -0,0 +1,66 @@
1
+ //#region src/fableFlow.d.ts
2
+ declare const FABLE_PROVIDER_SOURCE = "@agimon-ai/doompi-team";
3
+ declare const FABLE_PLAN_REQUESTER = "@agimon-ai/doompi-plan";
4
+ declare const FABLE_PLAN_RUNTIME = "claude";
5
+ declare const FABLE_PLAN_MODEL = "fable";
6
+ declare const FABLE_PLAN_PROFILE = "claude/fable-plan-v1";
7
+ declare const MAX_FABLE_PACKET_BYTES: number;
8
+ declare const MAX_FABLE_TEXT_BYTES: number;
9
+ declare const MAX_FABLE_ARRAY_ITEMS = 24;
10
+ interface FablePlanFinding {
11
+ path: string;
12
+ finding: string;
13
+ }
14
+ interface FablePlanPacket {
15
+ goal: string[];
16
+ constraints: string[];
17
+ decisions: string[];
18
+ verifiedFindings: FablePlanFinding[];
19
+ inferredFindings: string[];
20
+ unresolvedQuestions: string[];
21
+ currentPlan?: string;
22
+ }
23
+ type FablePlanStatus = 'completed' | 'failed' | 'timed_out' | 'cancelled' | 'interrupted';
24
+ type FablePlanStage = 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
25
+ interface FablePlanResult {
26
+ operationId: string;
27
+ status: FablePlanStatus;
28
+ stage: FablePlanStage;
29
+ draft?: string;
30
+ review?: string;
31
+ draftRunId?: string;
32
+ reviewRunId?: string;
33
+ durationMs: number;
34
+ errorCode?: string;
35
+ }
36
+ interface FablePlanRequest {
37
+ requester: typeof FABLE_PLAN_REQUESTER;
38
+ operationId: string;
39
+ runtime: typeof FABLE_PLAN_RUNTIME;
40
+ model: typeof FABLE_PLAN_MODEL;
41
+ profile: typeof FABLE_PLAN_PROFILE;
42
+ packet: FablePlanPacket;
43
+ }
44
+ interface FablePlanBroker {
45
+ start(request: FablePlanRequest, signal: AbortSignal): Promise<FablePlanResult>;
46
+ cancel(operationId: string, reason: string): void;
47
+ }
48
+ interface FableFlowOptions {
49
+ broker?: FablePlanBroker;
50
+ isAuthorized: () => boolean;
51
+ timeoutMs?: number;
52
+ onStage?: (stage: FableStage) => void;
53
+ onError?: (error: unknown) => void;
54
+ }
55
+ type FableStage = 'idle' | 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
56
+ interface FablePlanFlow {
57
+ run(value: unknown, signal?: AbortSignal): Promise<FablePlanResult>;
58
+ cancel(reason?: string): void;
59
+ isActive(): boolean;
60
+ }
61
+ declare function containsSuspectedCredential(value: string): boolean;
62
+ declare function sanitizeFablePacket(value: unknown): FablePlanPacket;
63
+ declare function createFablePlanFlow(options: FableFlowOptions): FablePlanFlow;
64
+ //#endregion
65
+ export { FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, containsSuspectedCredential, createFablePlanFlow, sanitizeFablePacket };
66
+ //# sourceMappingURL=fableFlow.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fableFlow.d.mts","names":[],"sources":["../src/fableFlow.ts"],"mappings":";cAGa,qBAAA;AAAA,cACA,oBAAA;AAAA,cACA,kBAAA;AAAA,cACA,gBAAA;AAAA,cACA,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,oBAAA;AAAA,cACA,qBAAA;AAAA,UAYI,gBAAA;EACf,IAAA;EACA,OAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;EACA,WAAA;EACA,SAAA;EACA,gBAAA,EAAkB,gBAAA;EAClB,gBAAA;EACA,mBAAA;EACA,WAAA;AAAA;AAAA,KAGU,eAAA;AAAA,KACA,cAAA;AAAA,UAEK,eAAA;EACf,WAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA,EAAO,cAAA;EACP,KAAA;EACA,MAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA;EACf,SAAA,SAAkB,oBAAA;EAClB,WAAA;EACA,OAAA,SAAgB,kBAAA;EAChB,KAAA,SAAc,gBAAA;EACd,OAAA,SAAgB,kBAAA;EAChB,MAAA,EAAQ,eAAA;AAAA;AAAA,UAGO,eAAA;EACf,KAAA,CAAM,OAAA,EAAS,gBAAA,EAAkB,MAAA,EAAQ,WAAA,GAAc,OAAA,CAAQ,eAAA;EAC/D,MAAA,CAAO,WAAA,UAAqB,MAAA;AAAA;AAAA,UAGb,gBAAA;EACf,MAAA,GAAS,eAAA;EACT,YAAA;EACA,SAAA;EACA,OAAA,IAAW,KAAA,EAAO,UAAA;EAClB,OAAA,IAAW,KAAA;AAAA;AAAA,KAGD,UAAA;AAAA,UAEK,aAAA;EACf,GAAA,CAAI,KAAA,WAAgB,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,eAAA;EACnD,MAAA,CAAO,MAAA;EACP,QAAA;AAAA;AAAA,iBAec,2BAAA,CAA4B,KAAA;AAAA,iBAuD5B,mBAAA,CAAoB,KAAA,YAAiB,eAAA;AAAA,iBA8CrC,mBAAA,CAAoB,OAAA,EAAS,gBAAA,GAAmB,aAAA"}
@@ -0,0 +1,3 @@
1
+ import{Buffer as e}from"node:buffer";import{randomUUID as t}from"node:crypto";const n=`@agimon-ai/doompi-team`,r=`@agimon-ai/doompi-plan`,i=`claude`,a=`fable`,o=`claude/fable-plan-v1`,s=32*1024,c=4*1024,l=24,u=[/(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|private[_-]?key|authorization|bearer)\s*[:=]/iu,/-----BEGIN [A-Z ]*PRIVATE KEY-----/u,/\bsk-[A-Za-z0-9_-]{16,}\b/u,/\bgh[pousr]_[A-Za-z0-9_]{16,}\b/u];function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=31||e===127))return!0}return!1}function p(e){return u.some(t=>t.test(e))}function m(t,n,r=!0){if(typeof t!=`string`)throw Error(`${n} must be a string.`);let i=t.trim();if(!i&&r)throw Error(`${n} must not be empty.`);if(e.byteLength(i,`utf8`)>4096||f(i))throw Error(`${n} exceeds the bounded Fable text limit or contains control characters.`);if(p(i))throw Error(`${n} appears to contain a credential.`);return i}function h(e,t,n=!0){if(!Array.isArray(e))throw Error(`${t} must be an array.`);if(e.length>24)throw Error(`${t} exceeds the bounded item limit.`);let r=e.map((e,n)=>m(e,`${t}[${n}]`));if(n&&r.length===0)throw Error(`${t} must contain at least one item.`);return r}function g(e,t){if(typeof e!=`string`)throw Error(`${t} must be a string.`);let n=e.trim();if(!n||n.length>512||f(n))throw Error(`${t} is not a safe source path.`);if(p(n))throw Error(`${t} appears to contain a credential.`);return n}function _(e){if(!Array.isArray(e))throw Error(`verifiedFindings must be an array.`);if(e.length>24)throw Error(`verifiedFindings exceeds the bounded item limit.`);return e.map((e,t)=>{if(!d(e))throw Error(`verifiedFindings[${t}] must be an object.`);if(Object.keys(e).some(e=>e!==`path`&&e!==`finding`))throw Error(`verifiedFindings[${t}] contains an unsupported field.`);return{path:g(e.path,`verifiedFindings[${t}].path`),finding:m(e.finding,`verifiedFindings[${t}].finding`)}})}function v(e,t,n){let r=new Set(t),i=Object.keys(e).find(e=>!r.has(e));if(i)throw Error(`${n} contains unsupported field '${i}'.`)}function y(t){if(!d(t))throw Error(`Fable packet must be an object.`);v(t,[`goal`,`constraints`,`decisions`,`verifiedFindings`,`inferredFindings`,`unresolvedQuestions`,`currentPlan`],`Fable packet`);let n={goal:h(t.goal,`goal`),constraints:h(t.constraints,`constraints`,!1),decisions:h(t.decisions,`decisions`,!1),verifiedFindings:_(t.verifiedFindings),inferredFindings:h(t.inferredFindings,`inferredFindings`,!1),unresolvedQuestions:h(t.unresolvedQuestions,`unresolvedQuestions`,!1),...t.currentPlan===void 0?{}:{currentPlan:m(t.currentPlan,`currentPlan`,!1)}};if(e.byteLength(JSON.stringify(n),`utf8`)>32768)throw Error(`Fable packet exceeds the bounded packet size.`);return n}function b(e){return p([e.draft,e.review].filter(e=>e!==void 0).join(`
2
+ `))?{operationId:e.operationId,status:`failed`,stage:`failed`,durationMs:e.durationMs,errorCode:`unsafe_output`}:e}function x(e,t){return{operationId:e,status:`timed_out`,stage:`interrupted`,durationMs:Math.max(0,Date.now()-t),errorCode:`timeout`}}function S(e){let n,s=(t=`Fable operation cancelled.`)=>{let r=n;if(r){if(!r.cancelSent){r.cancelSent=!0;try{e.broker?.cancel(r.operationId,t)}catch(t){e.onError?.(t)}}r.controller.abort(Error(t))}};return{run:async(c,l)=>{if(n)throw Error(`A Fable operation is already active for this session.`);if(!e.isAuthorized())throw Error(`The Fable capability profile is not authorized.`);let u=y(c),d=`fable-${t()}`,f=Date.now(),p=new AbortController;n={operationId:d,controller:p,cancelSent:!1},e.onStage?.(`draft`);let m=()=>p.abort(l?.reason);l&&(l.addEventListener(`abort`,m,{once:!0}),l.aborted&&m());let h={requester:r,operationId:d,runtime:i,model:a,profile:o,packet:u},g,_=!1;try{if(!e.broker)return x(d,f);let t=e.broker.start(h,p.signal),n=new Promise(e=>{p.signal.addEventListener(`abort`,()=>{_||e({operationId:d,status:`cancelled`,stage:`cancelled`,durationMs:Math.max(0,Date.now()-f),errorCode:`cancelled`})},{once:!0})}),r=e.timeoutMs===void 0?void 0:new Promise(t=>{g=setTimeout(()=>{_=!0,s(`Fable operation timed out.`),t(x(d,f))},e.timeoutMs)}),i=b(r===void 0?await Promise.race([t,n]):await Promise.race([t,r,n]));return e.onStage?.(i.status===`completed`?`completed`:i.status===`cancelled`?`cancelled`:i.stage),i}catch(t){e.onError?.(t);let n={operationId:d,status:`failed`,stage:`failed`,durationMs:Math.max(0,Date.now()-f),errorCode:`unavailable`};return e.onStage?.(`failed`),n}finally{g&&clearTimeout(g),l&&l.removeEventListener(`abort`,m),n=void 0}},cancel:s,isActive:()=>n!==void 0}}export{a as FABLE_PLAN_MODEL,o as FABLE_PLAN_PROFILE,r as FABLE_PLAN_REQUESTER,i as FABLE_PLAN_RUNTIME,n as FABLE_PROVIDER_SOURCE,l as MAX_FABLE_ARRAY_ITEMS,s as MAX_FABLE_PACKET_BYTES,c as MAX_FABLE_TEXT_BYTES,p as containsSuspectedCredential,S as createFablePlanFlow,y as sanitizeFablePacket};
3
+ //# sourceMappingURL=fableFlow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fableFlow.mjs","names":[],"sources":["../src/fableFlow.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\n\nexport const FABLE_PROVIDER_SOURCE = '@agimon-ai/doompi-team';\nexport const FABLE_PLAN_REQUESTER = '@agimon-ai/doompi-plan';\nexport const FABLE_PLAN_RUNTIME = 'claude';\nexport const FABLE_PLAN_MODEL = 'fable';\nexport const FABLE_PLAN_PROFILE = 'claude/fable-plan-v1';\nexport const MAX_FABLE_PACKET_BYTES = 32 * 1024;\nexport const MAX_FABLE_TEXT_BYTES = 4 * 1024;\nexport const MAX_FABLE_ARRAY_ITEMS = 24;\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|private[_-]?key|authorization|bearer)\\s*[:=]/iu,\n /-----BEGIN [A-Z ]*PRIVATE KEY-----/u,\n /\\bsk-[A-Za-z0-9_-]{16,}\\b/u,\n /\\bgh[pousr]_[A-Za-z0-9_]{16,}\\b/u,\n];\nconst CONTROL_CHARACTER_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MAX_SOURCE_PATH_LENGTH = 512;\n\nexport interface FablePlanFinding {\n path: string;\n finding: string;\n}\n\nexport interface FablePlanPacket {\n goal: string[];\n constraints: string[];\n decisions: string[];\n verifiedFindings: FablePlanFinding[];\n inferredFindings: string[];\n unresolvedQuestions: string[];\n currentPlan?: string;\n}\n\nexport type FablePlanStatus = 'completed' | 'failed' | 'timed_out' | 'cancelled' | 'interrupted';\nexport type FablePlanStage = 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';\n\nexport interface FablePlanResult {\n operationId: string;\n status: FablePlanStatus;\n stage: FablePlanStage;\n draft?: string;\n review?: string;\n draftRunId?: string;\n reviewRunId?: string;\n durationMs: number;\n errorCode?: string;\n}\n\nexport interface FablePlanRequest {\n requester: typeof FABLE_PLAN_REQUESTER;\n operationId: string;\n runtime: typeof FABLE_PLAN_RUNTIME;\n model: typeof FABLE_PLAN_MODEL;\n profile: typeof FABLE_PLAN_PROFILE;\n packet: FablePlanPacket;\n}\n\nexport interface FablePlanBroker {\n start(request: FablePlanRequest, signal: AbortSignal): Promise<FablePlanResult>;\n cancel(operationId: string, reason: string): void;\n}\n\nexport interface FableFlowOptions {\n broker?: FablePlanBroker;\n isAuthorized: () => boolean;\n timeoutMs?: number;\n onStage?: (stage: FableStage) => void;\n onError?: (error: unknown) => void;\n}\n\nexport type FableStage = 'idle' | 'draft' | 'review' | 'completed' | 'failed' | 'cancelled' | 'interrupted';\n\nexport interface FablePlanFlow {\n run(value: unknown, signal?: AbortSignal): Promise<FablePlanResult>;\n cancel(reason?: string): void;\n isActive(): boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= CONTROL_CHARACTER_MAX || code === DELETE_CHARACTER)) return true;\n }\n return false;\n}\n\nexport function containsSuspectedCredential(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction boundedText(value: unknown, field: string, required = true): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string.`);\n const text = value.trim();\n if (!text && required) throw new Error(`${field} must not be empty.`);\n if (Buffer.byteLength(text, 'utf8') > MAX_FABLE_TEXT_BYTES || hasControlCharacter(text)) {\n throw new Error(`${field} exceeds the bounded Fable text limit or contains control characters.`);\n }\n if (containsSuspectedCredential(text)) throw new Error(`${field} appears to contain a credential.`);\n return text;\n}\n\nfunction boundedList(value: unknown, field: string, required = true): string[] {\n if (!Array.isArray(value)) throw new Error(`${field} must be an array.`);\n if (value.length > MAX_FABLE_ARRAY_ITEMS) throw new Error(`${field} exceeds the bounded item limit.`);\n const items = value.map((item, index) => boundedText(item, `${field}[${index}]`));\n if (required && items.length === 0) throw new Error(`${field} must contain at least one item.`);\n return items;\n}\n\nfunction boundedPath(value: unknown, field: string): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string.`);\n const sourcePath = value.trim();\n if (!sourcePath || sourcePath.length > MAX_SOURCE_PATH_LENGTH || hasControlCharacter(sourcePath)) {\n throw new Error(`${field} is not a safe source path.`);\n }\n if (containsSuspectedCredential(sourcePath)) throw new Error(`${field} appears to contain a credential.`);\n return sourcePath;\n}\n\nfunction boundedFindings(value: unknown): FablePlanFinding[] {\n if (!Array.isArray(value)) throw new Error('verifiedFindings must be an array.');\n if (value.length > MAX_FABLE_ARRAY_ITEMS) throw new Error('verifiedFindings exceeds the bounded item limit.');\n return value.map((item, index) => {\n if (!isRecord(item)) throw new Error(`verifiedFindings[${index}] must be an object.`);\n const keys = Object.keys(item);\n if (keys.some((key) => key !== 'path' && key !== 'finding')) {\n throw new Error(`verifiedFindings[${index}] contains an unsupported field.`);\n }\n return {\n path: boundedPath(item.path, `verifiedFindings[${index}].path`),\n finding: boundedText(item.finding, `verifiedFindings[${index}].finding`),\n };\n });\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, keys: readonly string[], field: string): void {\n const allowed = new Set(keys);\n const unexpected = Object.keys(value).find((key) => !allowed.has(key));\n if (unexpected) throw new Error(`${field} contains unsupported field '${unexpected}'.`);\n}\n\nexport function sanitizeFablePacket(value: unknown): FablePlanPacket {\n if (!isRecord(value)) throw new Error('Fable packet must be an object.');\n assertAllowedKeys(\n value,\n ['goal', 'constraints', 'decisions', 'verifiedFindings', 'inferredFindings', 'unresolvedQuestions', 'currentPlan'],\n 'Fable packet',\n );\n const packet: FablePlanPacket = {\n goal: boundedList(value.goal, 'goal'),\n constraints: boundedList(value.constraints, 'constraints', false),\n decisions: boundedList(value.decisions, 'decisions', false),\n verifiedFindings: boundedFindings(value.verifiedFindings),\n inferredFindings: boundedList(value.inferredFindings, 'inferredFindings', false),\n unresolvedQuestions: boundedList(value.unresolvedQuestions, 'unresolvedQuestions', false),\n ...(value.currentPlan === undefined ? {} : { currentPlan: boundedText(value.currentPlan, 'currentPlan', false) }),\n };\n if (Buffer.byteLength(JSON.stringify(packet), 'utf8') > MAX_FABLE_PACKET_BYTES) {\n throw new Error('Fable packet exceeds the bounded packet size.');\n }\n return packet;\n}\n\nfunction safeResult(result: FablePlanResult): FablePlanResult {\n const output = [result.draft, result.review].filter((value): value is string => value !== undefined).join('\\n');\n if (containsSuspectedCredential(output)) {\n return {\n operationId: result.operationId,\n status: 'failed',\n stage: 'failed',\n durationMs: result.durationMs,\n errorCode: 'unsafe_output',\n };\n }\n return result;\n}\n\nfunction timedOutResult(operationId: string, startedAt: number): FablePlanResult {\n return {\n operationId,\n status: 'timed_out',\n stage: 'interrupted',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'timeout',\n };\n}\n\nexport function createFablePlanFlow(options: FableFlowOptions): FablePlanFlow {\n let active:\n | {\n operationId: string;\n controller: AbortController;\n cancelSent: boolean;\n }\n | undefined;\n\n const cancel = (reason = 'Fable operation cancelled.'): void => {\n const current = active;\n if (!current) return;\n if (!current.cancelSent) {\n current.cancelSent = true;\n try {\n options.broker?.cancel(current.operationId, reason);\n } catch (error) {\n options.onError?.(error);\n }\n }\n current.controller.abort(new Error(reason));\n };\n\n const run = async (value: unknown, signal?: AbortSignal): Promise<FablePlanResult> => {\n if (active) throw new Error('A Fable operation is already active for this session.');\n if (!options.isAuthorized()) throw new Error('The Fable capability profile is not authorized.');\n const packet = sanitizeFablePacket(value);\n const operationId = `fable-${randomUUID()}`;\n const startedAt = Date.now();\n const controller = new AbortController();\n active = { operationId, controller, cancelSent: false };\n options.onStage?.('draft');\n\n const parentAbort = (): void => controller.abort(signal?.reason);\n if (signal) {\n signal.addEventListener('abort', parentAbort, { once: true });\n if (signal.aborted) parentAbort();\n }\n\n const brokerRequest: FablePlanRequest = {\n requester: FABLE_PLAN_REQUESTER,\n operationId,\n runtime: FABLE_PLAN_RUNTIME,\n model: FABLE_PLAN_MODEL,\n profile: FABLE_PLAN_PROFILE,\n packet,\n };\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutTriggered = false;\n try {\n if (!options.broker) return timedOutResult(operationId, startedAt);\n const brokerResult = options.broker.start(brokerRequest, controller.signal);\n const cancelledResult = new Promise<FablePlanResult>((resolve) => {\n const onAbort = (): void => {\n if (timeoutTriggered) return;\n resolve({\n operationId,\n status: 'cancelled',\n stage: 'cancelled',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'cancelled',\n });\n };\n controller.signal.addEventListener('abort', onAbort, { once: true });\n });\n const timeoutResult =\n options.timeoutMs === undefined\n ? undefined\n : new Promise<FablePlanResult>((resolve) => {\n timeout = setTimeout(() => {\n timeoutTriggered = true;\n cancel('Fable operation timed out.');\n resolve(timedOutResult(operationId, startedAt));\n }, options.timeoutMs);\n });\n const result =\n timeoutResult === undefined\n ? await Promise.race([brokerResult, cancelledResult])\n : await Promise.race([brokerResult, timeoutResult, cancelledResult]);\n const safe = safeResult(result);\n options.onStage?.(\n safe.status === 'completed' ? 'completed' : safe.status === 'cancelled' ? 'cancelled' : safe.stage,\n );\n return safe;\n } catch (error) {\n options.onError?.(error);\n const failure: FablePlanResult = {\n operationId,\n status: 'failed',\n stage: 'failed',\n durationMs: Math.max(0, Date.now() - startedAt),\n errorCode: 'unavailable',\n };\n options.onStage?.('failed');\n return failure;\n } finally {\n if (timeout) clearTimeout(timeout);\n if (signal) signal.removeEventListener('abort', parentAbort);\n active = undefined;\n }\n };\n\n return {\n run,\n cancel,\n isActive: () => active !== undefined,\n };\n}\n"],"mappings":"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"}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./_virtual/_rolldown/runtime.cjs`);const e=require(`./config.cjs`),t=require(`./fableFlow.cjs`),n=require(`./prompts.cjs`),r=require(`./planMode.cjs`);let i=require(`@agimon-ai/doompi-config`);exports.FABLE_PLAN_MODEL=t.FABLE_PLAN_MODEL,exports.FABLE_PLAN_PROFILE=t.FABLE_PLAN_PROFILE,exports.FABLE_PLAN_REQUESTER=t.FABLE_PLAN_REQUESTER,exports.FABLE_PLAN_RUNTIME=t.FABLE_PLAN_RUNTIME,exports.FABLE_PROVIDER_SOURCE=t.FABLE_PROVIDER_SOURCE,exports.MAX_FABLE_ARRAY_ITEMS=t.MAX_FABLE_ARRAY_ITEMS,exports.MAX_FABLE_PACKET_BYTES=t.MAX_FABLE_PACKET_BYTES,exports.MAX_FABLE_TEXT_BYTES=t.MAX_FABLE_TEXT_BYTES,exports.WRITE_PLAN_TIMEOUT_MS=r.WRITE_PLAN_TIMEOUT_MS,exports.buildDebugPlanningPrompt=n.buildDebugPlanningPrompt,exports.buildFablePlanningPrompt=n.buildFablePlanningPrompt,exports.buildFlavorPlanningPrompt=n.buildFlavorPlanningPrompt,exports.buildNormalPlanningPrompt=n.buildNormalPlanningPrompt,exports.configurePlanningSubagentInput=r.configurePlanningSubagentInput,exports.configurePlanningTaskInput=r.configurePlanningTaskInput,exports.constrainSubagentInput=r.constrainSubagentInput,exports.containsSuspectedCredential=t.containsSuspectedCredential,exports.createFablePlanFlow=t.createFablePlanFlow,exports.createPlanIdentifier=r.createPlanIdentifier,exports.getHarnessState=i.getHarnessState,exports.globalDoomConfigPath=i.globalDoomConfigPath,exports.isBlockedSubagentManagementAction=r.isBlockedSubagentManagementAction,exports.loadDoomConfig=e.loadDoomConfig,exports.loadHarnessState=i.loadHarnessState,exports.loadPlanningModeConfig=r.loadPlanningModeConfig,exports.mergeDoomConfigs=e.mergeDoomConfigs,exports.parseDebugEvidencePacket=r.parseDebugEvidencePacket,exports.parseDoomConfig=e.parseDoomConfig,exports.parsePersistedPlanState=r.parsePersistedPlanState,exports.parsePlanningModeConfig=i.parsePlanningModeConfig,exports.planModeExtension=r.planModeExtension,exports.planModeTools=r.planModeTools,exports.planSessionIdentifier=r.planSessionIdentifier,exports.planTitleSlug=r.planTitleSlug,exports.planningSubagentModel=r.planningSubagentModel,exports.repositoryDoomConfigPath=i.repositoryDoomConfigPath,exports.resolvePlanningPlansDirectory=i.resolvePlanningPlansDirectory,exports.sanitizeFablePacket=t.sanitizeFablePacket,exports.visiblePlanForToolCall=r.visiblePlanForToolCall;
@@ -0,0 +1,5 @@
1
+ import { DoomConfig, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, getHarnessState, globalDoomConfigPath, loadDoomConfig, loadHarnessState, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./config.cjs";
2
+ import { FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, containsSuspectedCredential, createFablePlanFlow, sanitizeFablePacket } from "./fableFlow.cjs";
3
+ import { DebugEvidencePacket, PlanningFlavor, buildDebugPlanningPrompt, buildFablePlanningPrompt, buildFlavorPlanningPrompt, buildNormalPlanningPrompt } from "./prompts.cjs";
4
+ import { ModelIdentity, PlanModeExtensionOptions, PlanSnapshot, PlanningConfigProvider, WRITE_PLAN_TIMEOUT_MS, configurePlanningSubagentInput, configurePlanningTaskInput, constrainSubagentInput, createPlanIdentifier, isBlockedSubagentManagementAction, loadPlanningModeConfig, parseDebugEvidencePacket, parsePersistedPlanState, planModeExtension, planModeTools, planSessionIdentifier, planTitleSlug, planningSubagentModel, visiblePlanForToolCall } from "./planMode.cjs";
5
+ export { DebugEvidencePacket, DoomConfig, FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, ModelIdentity, PlanModeExtensionOptions, PlanSnapshot, PlanningAgentConfig, PlanningConfigProvider, PlanningFlavor, PlanningModeConfig, PlanningThinkingLevel, WRITE_PLAN_TIMEOUT_MS, buildDebugPlanningPrompt, buildFablePlanningPrompt, buildFlavorPlanningPrompt, buildNormalPlanningPrompt, configurePlanningSubagentInput, configurePlanningTaskInput, constrainSubagentInput, containsSuspectedCredential, createFablePlanFlow, createPlanIdentifier, getHarnessState, globalDoomConfigPath, isBlockedSubagentManagementAction, loadDoomConfig, loadHarnessState, loadPlanningModeConfig, mergeDoomConfigs, parseDebugEvidencePacket, parseDoomConfig, parsePersistedPlanState, parsePlanningModeConfig, planModeExtension, planModeTools, planSessionIdentifier, planTitleSlug, planningSubagentModel, repositoryDoomConfigPath, resolvePlanningPlansDirectory, sanitizeFablePacket, visiblePlanForToolCall };
@@ -0,0 +1,5 @@
1
+ import { DoomConfig, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, getHarnessState, globalDoomConfigPath, loadDoomConfig, loadHarnessState, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./config.mjs";
2
+ import { FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, containsSuspectedCredential, createFablePlanFlow, sanitizeFablePacket } from "./fableFlow.mjs";
3
+ import { DebugEvidencePacket, PlanningFlavor, buildDebugPlanningPrompt, buildFablePlanningPrompt, buildFlavorPlanningPrompt, buildNormalPlanningPrompt } from "./prompts.mjs";
4
+ import { ModelIdentity, PlanModeExtensionOptions, PlanSnapshot, PlanningConfigProvider, WRITE_PLAN_TIMEOUT_MS, configurePlanningSubagentInput, configurePlanningTaskInput, constrainSubagentInput, createPlanIdentifier, isBlockedSubagentManagementAction, loadPlanningModeConfig, parseDebugEvidencePacket, parsePersistedPlanState, planModeExtension, planModeTools, planSessionIdentifier, planTitleSlug, planningSubagentModel, visiblePlanForToolCall } from "./planMode.mjs";
5
+ export { DebugEvidencePacket, DoomConfig, FABLE_PLAN_MODEL, FABLE_PLAN_PROFILE, FABLE_PLAN_REQUESTER, FABLE_PLAN_RUNTIME, FABLE_PROVIDER_SOURCE, FableFlowOptions, FablePlanBroker, FablePlanFinding, FablePlanFlow, FablePlanPacket, FablePlanRequest, FablePlanResult, FablePlanStage, FablePlanStatus, FableStage, MAX_FABLE_ARRAY_ITEMS, MAX_FABLE_PACKET_BYTES, MAX_FABLE_TEXT_BYTES, ModelIdentity, PlanModeExtensionOptions, PlanSnapshot, PlanningAgentConfig, PlanningConfigProvider, PlanningFlavor, PlanningModeConfig, PlanningThinkingLevel, WRITE_PLAN_TIMEOUT_MS, buildDebugPlanningPrompt, buildFablePlanningPrompt, buildFlavorPlanningPrompt, buildNormalPlanningPrompt, configurePlanningSubagentInput, configurePlanningTaskInput, constrainSubagentInput, containsSuspectedCredential, createFablePlanFlow, createPlanIdentifier, getHarnessState, globalDoomConfigPath, isBlockedSubagentManagementAction, loadDoomConfig, loadHarnessState, loadPlanningModeConfig, mergeDoomConfigs, parseDebugEvidencePacket, parseDoomConfig, parsePersistedPlanState, parsePlanningModeConfig, planModeExtension, planModeTools, planSessionIdentifier, planTitleSlug, planningSubagentModel, repositoryDoomConfigPath, resolvePlanningPlansDirectory, sanitizeFablePacket, visiblePlanForToolCall };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{getHarnessState as e,globalDoomConfigPath as t,loadDoomConfig as n,loadHarnessState as r,mergeDoomConfigs as i,parseDoomConfig as a,parsePlanningModeConfig as o,repositoryDoomConfigPath as s,resolvePlanningPlansDirectory as c}from"./config.mjs";import{FABLE_PLAN_MODEL as l,FABLE_PLAN_PROFILE as u,FABLE_PLAN_REQUESTER as d,FABLE_PLAN_RUNTIME as f,FABLE_PROVIDER_SOURCE as p,MAX_FABLE_ARRAY_ITEMS as m,MAX_FABLE_PACKET_BYTES as h,MAX_FABLE_TEXT_BYTES as g,containsSuspectedCredential as _,createFablePlanFlow as v,sanitizeFablePacket as y}from"./fableFlow.mjs";import{buildDebugPlanningPrompt as b,buildFablePlanningPrompt as x,buildFlavorPlanningPrompt as S,buildNormalPlanningPrompt as C}from"./prompts.mjs";import{WRITE_PLAN_TIMEOUT_MS as w,configurePlanningSubagentInput as T,configurePlanningTaskInput as E,constrainSubagentInput as D,createPlanIdentifier as O,isBlockedSubagentManagementAction as k,loadPlanningModeConfig as A,parseDebugEvidencePacket as j,parsePersistedPlanState as M,planModeExtension as N,planModeTools as P,planSessionIdentifier as F,planTitleSlug as I,planningSubagentModel as L,visiblePlanForToolCall as R}from"./planMode.mjs";export{l as FABLE_PLAN_MODEL,u as FABLE_PLAN_PROFILE,d as FABLE_PLAN_REQUESTER,f as FABLE_PLAN_RUNTIME,p as FABLE_PROVIDER_SOURCE,m as MAX_FABLE_ARRAY_ITEMS,h as MAX_FABLE_PACKET_BYTES,g as MAX_FABLE_TEXT_BYTES,w as WRITE_PLAN_TIMEOUT_MS,b as buildDebugPlanningPrompt,x as buildFablePlanningPrompt,S as buildFlavorPlanningPrompt,C as buildNormalPlanningPrompt,T as configurePlanningSubagentInput,E as configurePlanningTaskInput,D as constrainSubagentInput,_ as containsSuspectedCredential,v as createFablePlanFlow,O as createPlanIdentifier,e as getHarnessState,t as globalDoomConfigPath,k as isBlockedSubagentManagementAction,n as loadDoomConfig,r as loadHarnessState,A as loadPlanningModeConfig,i as mergeDoomConfigs,j as parseDebugEvidencePacket,a as parseDoomConfig,M as parsePersistedPlanState,o as parsePlanningModeConfig,N as planModeExtension,P as planModeTools,F as planSessionIdentifier,I as planTitleSlug,L as planningSubagentModel,s as repositoryDoomConfigPath,c as resolvePlanningPlansDirectory,y as sanitizeFablePacket,R as visiblePlanForToolCall};
@@ -0,0 +1,2 @@
1
+ require(`./_virtual/_rolldown/runtime.cjs`);let e=require(`@agimon-ai/doompi-telemetry`);const t={configLoadFailed:`doom_plan.config_load_failed`,writePlanFailed:`doom_plan.write_plan_failed`,writePlanTimedOut:`doom_plan.write_plan_timed_out`,writePlanUnsafePath:`doom_plan.write_plan_unsafe_path`,modelResolveFailed:`doom_plan.model_resolve_failed`,modeEnabled:`doom_plan.mode_enabled`,modeDisabled:`doom_plan.mode_disabled`,planWritten:`doom_plan.plan_written`,planReviewCompleted:`doom_plan.plan_review_completed`};function n(t={}){let n=(0,e.createDoomTelemetry)({serviceName:`doom-plan`,packageName:`@agimon-ai/doompi-plan`,cwd:t.cwd,workspaceRoot:t.workspaceRoot,env:t.env,telemetryFactory:t.telemetryFactory,warn:t.warn,enableLogs:!0,enableTraces:!0});return{recordError:(e,t,r)=>n.recordError(e,t,r),recordWarning:(e,t,r)=>n.recordWarning(e,t,r),recordEvent:(e,t)=>n.recordEvent(e,t),flush:()=>n.flush(),shutdown:()=>n.shutdown()}}exports.PLAN_EVENT=t,exports.createPlanTelemetry=n;
2
+ //# sourceMappingURL=logSinkTelemetry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.cjs","names":[],"sources":["../src/logSinkTelemetry.ts"],"sourcesContent":["import { createDoomTelemetry, type DoomTelemetry, type DoomTelemetryOptions } from '@agimon-ai/doompi-telemetry';\n\nconst SERVICE_NAME = 'doom-plan';\nconst PACKAGE_NAME = '@agimon-ai/doompi-plan';\n\nexport const PLAN_EVENT = {\n configLoadFailed: 'doom_plan.config_load_failed',\n writePlanFailed: 'doom_plan.write_plan_failed',\n writePlanTimedOut: 'doom_plan.write_plan_timed_out',\n writePlanUnsafePath: 'doom_plan.write_plan_unsafe_path',\n modelResolveFailed: 'doom_plan.model_resolve_failed',\n modeEnabled: 'doom_plan.mode_enabled',\n modeDisabled: 'doom_plan.mode_disabled',\n planWritten: 'doom_plan.plan_written',\n planReviewCompleted: 'doom_plan.plan_review_completed',\n} as const;\n\nexport type PlanEventName = (typeof PLAN_EVENT)[keyof typeof PLAN_EVENT];\nexport type PlanEventAttributes = Record<string, string | number | boolean>;\n\nexport interface PlanTelemetryOptions {\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;\n warn?: (message: string) => void;\n}\n\nexport interface PlanTelemetry {\n recordError(event: PlanEventName, error: unknown, attributes?: PlanEventAttributes): Promise<void>;\n recordWarning(event: PlanEventName, error: unknown, attributes?: PlanEventAttributes): Promise<void>;\n recordEvent(event: PlanEventName, attributes?: PlanEventAttributes): Promise<void>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createPlanTelemetry(options: PlanTelemetryOptions = {}): PlanTelemetry {\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: options.env,\n telemetryFactory: options.telemetryFactory,\n warn: options.warn,\n enableLogs: true,\n enableTraces: true,\n });\n return {\n recordError: (event, error, attributes) => telemetry.recordError(event, error, attributes),\n recordWarning: (event, error, attributes) => telemetry.recordWarning(event, error, attributes),\n recordEvent: (event, attributes) => telemetry.recordEvent(event, attributes),\n flush: () => telemetry.flush(),\n shutdown: () => telemetry.shutdown(),\n };\n}\n"],"mappings":"yFAEA,MAGa,EAAa,CACxB,iBAAkB,+BAClB,gBAAiB,8BACjB,kBAAmB,iCACnB,oBAAqB,mCACrB,mBAAoB,iCACpB,YAAa,yBACb,aAAc,0BACd,YAAa,yBACb,oBAAqB,kCACtB,CAqBD,SAAgB,EAAoB,EAAgC,EAAE,CAAiB,CACrF,IAAM,GAAA,EAAA,EAAA,qBAA+C,CACnD,YAAa,YACb,YAAa,yBACb,IAAK,EAAQ,IACb,cAAe,EAAQ,cACvB,IAAK,EAAQ,IACb,iBAAkB,EAAQ,iBAC1B,KAAM,EAAQ,KACd,WAAY,GACZ,aAAc,GACf,CAAC,CACF,MAAO,CACL,aAAc,EAAO,EAAO,IAAe,EAAU,YAAY,EAAO,EAAO,EAAW,CAC1F,eAAgB,EAAO,EAAO,IAAe,EAAU,cAAc,EAAO,EAAO,EAAW,CAC9F,aAAc,EAAO,IAAe,EAAU,YAAY,EAAO,EAAW,CAC5E,UAAa,EAAU,OAAO,CAC9B,aAAgB,EAAU,UAAU,CACrC"}
@@ -0,0 +1,24 @@
1
+ //#region src/logSinkTelemetry.d.ts
2
+ declare const PLAN_EVENT: {
3
+ readonly configLoadFailed: "doom_plan.config_load_failed";
4
+ readonly writePlanFailed: "doom_plan.write_plan_failed";
5
+ readonly writePlanTimedOut: "doom_plan.write_plan_timed_out";
6
+ readonly writePlanUnsafePath: "doom_plan.write_plan_unsafe_path";
7
+ readonly modelResolveFailed: "doom_plan.model_resolve_failed";
8
+ readonly modeEnabled: "doom_plan.mode_enabled";
9
+ readonly modeDisabled: "doom_plan.mode_disabled";
10
+ readonly planWritten: "doom_plan.plan_written";
11
+ readonly planReviewCompleted: "doom_plan.plan_review_completed";
12
+ };
13
+ type PlanEventName = (typeof PLAN_EVENT)[keyof typeof PLAN_EVENT];
14
+ type PlanEventAttributes = Record<string, string | number | boolean>;
15
+ interface PlanTelemetry {
16
+ recordError(event: PlanEventName, error: unknown, attributes?: PlanEventAttributes): Promise<void>;
17
+ recordWarning(event: PlanEventName, error: unknown, attributes?: PlanEventAttributes): Promise<void>;
18
+ recordEvent(event: PlanEventName, attributes?: PlanEventAttributes): Promise<void>;
19
+ flush(): Promise<void>;
20
+ shutdown(): Promise<void>;
21
+ }
22
+ //#endregion
23
+ export { PlanTelemetry };
24
+ //# sourceMappingURL=logSinkTelemetry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../src/logSinkTelemetry.ts"],"mappings":";cAKa,UAAA;EAAA;;;;;;;;;;KAYD,aAAA,WAAwB,UAAA,eAAyB,UAAA;AAAA,KACjD,mBAAA,GAAsB,MAAA;AAAA,UAUjB,aAAA;EACf,WAAA,CAAY,KAAA,EAAO,aAAA,EAAe,KAAA,WAAgB,UAAA,GAAa,mBAAA,GAAsB,OAAA;EACrF,aAAA,CAAc,KAAA,EAAO,aAAA,EAAe,KAAA,WAAgB,UAAA,GAAa,mBAAA,GAAsB,OAAA;EACvF,WAAA,CAAY,KAAA,EAAO,aAAA,EAAe,UAAA,GAAa,mBAAA,GAAsB,OAAA;EACrE,KAAA,IAAS,OAAA;EACT,QAAA,IAAY,OAAA;AAAA"}