@tarquinen/opencode-dcp 1.0.4 → 1.1.0-beta.2

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 (82) hide show
  1. package/README.md +68 -43
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +47 -17
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/config.d.ts +20 -7
  6. package/dist/lib/config.d.ts.map +1 -1
  7. package/dist/lib/config.js +320 -158
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/hooks.d.ts.map +1 -1
  10. package/dist/lib/hooks.js +3 -0
  11. package/dist/lib/hooks.js.map +1 -1
  12. package/dist/lib/logger.d.ts +17 -0
  13. package/dist/lib/logger.d.ts.map +1 -1
  14. package/dist/lib/logger.js +90 -7
  15. package/dist/lib/logger.js.map +1 -1
  16. package/dist/lib/messages/prune.d.ts.map +1 -1
  17. package/dist/lib/messages/prune.js +90 -29
  18. package/dist/lib/messages/prune.js.map +1 -1
  19. package/dist/lib/messages/utils.js +7 -7
  20. package/dist/lib/model-selector.d.ts +3 -3
  21. package/dist/lib/model-selector.d.ts.map +1 -1
  22. package/dist/lib/model-selector.js +34 -34
  23. package/dist/lib/model-selector.js.map +1 -1
  24. package/dist/lib/prompt.d.ts.map +1 -1
  25. package/dist/lib/prompt.js +37 -25
  26. package/dist/lib/prompt.js.map +1 -1
  27. package/dist/lib/prompts/discard-tool-spec.txt +56 -0
  28. package/dist/lib/prompts/extract-tool-spec.txt +79 -0
  29. package/dist/lib/prompts/nudge/nudge-both.txt +10 -0
  30. package/dist/lib/prompts/nudge/nudge-discard.txt +9 -0
  31. package/dist/lib/prompts/nudge/nudge-extract.txt +9 -0
  32. package/dist/lib/prompts/{synthetic.txt → system/system-prompt-both.txt} +23 -13
  33. package/dist/lib/prompts/system/system-prompt-discard.txt +49 -0
  34. package/dist/lib/prompts/system/system-prompt-extract.txt +49 -0
  35. package/dist/lib/shared-utils.d.ts.map +1 -1
  36. package/dist/lib/shared-utils.js +1 -1
  37. package/dist/lib/shared-utils.js.map +1 -1
  38. package/dist/lib/state/persistence.d.ts.map +1 -1
  39. package/dist/lib/state/persistence.js +4 -7
  40. package/dist/lib/state/persistence.js.map +1 -1
  41. package/dist/lib/state/state.d.ts +1 -0
  42. package/dist/lib/state/state.d.ts.map +1 -1
  43. package/dist/lib/state/state.js +26 -6
  44. package/dist/lib/state/state.js.map +1 -1
  45. package/dist/lib/state/tool-cache.d.ts.map +1 -1
  46. package/dist/lib/state/tool-cache.js +24 -10
  47. package/dist/lib/state/tool-cache.js.map +1 -1
  48. package/dist/lib/state/types.d.ts +2 -0
  49. package/dist/lib/state/types.d.ts.map +1 -1
  50. package/dist/lib/strategies/deduplication.js +4 -4
  51. package/dist/lib/strategies/deduplication.js.map +1 -1
  52. package/dist/lib/strategies/index.d.ts +1 -1
  53. package/dist/lib/strategies/index.d.ts.map +1 -1
  54. package/dist/lib/strategies/index.js +1 -1
  55. package/dist/lib/strategies/index.js.map +1 -1
  56. package/dist/lib/strategies/on-idle.d.ts.map +1 -1
  57. package/dist/lib/strategies/on-idle.js +25 -24
  58. package/dist/lib/strategies/on-idle.js.map +1 -1
  59. package/dist/lib/strategies/supersede-writes.js +4 -4
  60. package/dist/lib/strategies/supersede-writes.js.map +1 -1
  61. package/dist/lib/strategies/{prune-tool.d.ts → tools.d.ts} +3 -6
  62. package/dist/lib/strategies/tools.d.ts.map +1 -0
  63. package/dist/lib/strategies/tools.js +127 -0
  64. package/dist/lib/strategies/tools.js.map +1 -0
  65. package/dist/lib/strategies/utils.d.ts +0 -1
  66. package/dist/lib/strategies/utils.d.ts.map +1 -1
  67. package/dist/lib/strategies/utils.js +20 -10
  68. package/dist/lib/strategies/utils.js.map +1 -1
  69. package/dist/lib/ui/notification.d.ts +1 -0
  70. package/dist/lib/ui/notification.d.ts.map +1 -1
  71. package/dist/lib/ui/notification.js +44 -20
  72. package/dist/lib/ui/notification.js.map +1 -1
  73. package/dist/lib/ui/utils.d.ts.map +1 -1
  74. package/dist/lib/ui/utils.js +9 -9
  75. package/dist/lib/ui/utils.js.map +1 -1
  76. package/package.json +61 -58
  77. package/dist/lib/prompts/nudge.txt +0 -10
  78. package/dist/lib/prompts/tool.txt +0 -72
  79. package/dist/lib/strategies/prune-tool.d.ts.map +0 -1
  80. package/dist/lib/strategies/prune-tool.js +0 -88
  81. package/dist/lib/strategies/prune-tool.js.map +0 -1
  82. /package/dist/lib/prompts/{pruning.txt → on-idle-analysis.txt} +0 -0
package/README.md CHANGED
@@ -13,7 +13,7 @@ Add to your OpenCode config:
13
13
  ```jsonc
14
14
  // opencode.jsonc
15
15
  {
16
- "plugin": ["@tarquinen/opencode-dcp@latest"]
16
+ "plugin": ["@tarquinen/opencode-dcp@latest"],
17
17
  }
18
18
  ```
19
19
 
@@ -29,7 +29,9 @@ DCP uses multiple strategies to reduce context size:
29
29
 
30
30
  **Supersede Writes** — Prunes write tool inputs for files that have subsequently been read. When a file is written and later read, the original write content becomes redundant since the current file state is captured in the read result. Runs automatically on every request with zero LLM cost.
31
31
 
32
- **Prune Tool** — Exposes a `prune` tool that the AI can call to manually trigger pruning when it determines context cleanup is needed.
32
+ **Discard Tool** — Exposes a `discard` tool that the AI can call to remove completed or noisy tool outputs from context. Use this for task completion cleanup and removing irrelevant outputs.
33
+
34
+ **Extract Tool** — Exposes an `extract` tool that the AI can call to distill valuable context into concise summaries before removing the raw outputs. Use this when you need to preserve key findings while reducing context size.
33
35
 
34
36
  **On Idle Analysis** — Uses a language model to semantically analyze conversation context during idle periods and identify tool outputs that are no longer relevant.
35
37
 
@@ -54,59 +56,82 @@ DCP uses its own config file:
54
56
 
55
57
  ```jsonc
56
58
  {
57
- // Enable or disable the plugin
58
- "enabled": true,
59
- // Enable debug logging to ~/.config/opencode/logs/dcp/
60
- "debug": false,
61
- // Summary display: "off", "minimal", or "detailed"
62
- "pruningSummary": "detailed",
63
- // Strategies for pruning tokens from chat history
64
- "strategies": {
65
- // Remove duplicate tool calls (same tool with same arguments)
66
- "deduplication": {
67
- "enabled": true,
68
- // Additional tools to protect from pruning
69
- "protectedTools": []
59
+ // Enable or disable the plugin
60
+ "enabled": true,
61
+ // Enable debug logging to ~/.config/opencode/logs/dcp/
62
+ "debug": false,
63
+ // Notification display: "off", "minimal", or "detailed"
64
+ "pruneNotification": "detailed",
65
+ // Protect from pruning for <turns> message turns
66
+ "turnProtection": {
67
+ "enabled": false,
68
+ "turns": 4,
70
69
  },
71
- // Prune write tool inputs when the file has been subsequently read
72
- "supersedeWrites": {
73
- "enabled": true
70
+ // LLM-driven context pruning tools
71
+ "tools": {
72
+ // Shared settings for all prune tools
73
+ "settings": {
74
+ // Nudge the LLM to use prune tools (every <nudgeFrequency> tool results)
75
+ "nudgeEnabled": true,
76
+ "nudgeFrequency": 10,
77
+ // Additional tools to protect from pruning
78
+ "protectedTools": [],
79
+ },
80
+ // Removes tool content from context without preservation (for completed tasks or noise)
81
+ "discard": {
82
+ "enabled": true,
83
+ },
84
+ // Distills key findings into preserved knowledge before removing raw content
85
+ "extract": {
86
+ "enabled": true,
87
+ // Show distillation content as an ignored message notification
88
+ "showDistillation": false,
89
+ },
74
90
  },
75
- // Exposes a prune tool to your LLM to call when it determines pruning is necessary
76
- "pruneTool": {
77
- "enabled": true,
78
- // Additional tools to protect from pruning
79
- "protectedTools": [],
80
- // Nudge the LLM to use the prune tool (every <frequency> tool results)
81
- "nudge": {
82
- "enabled": true,
83
- "frequency": 10
84
- }
91
+ // Automatic pruning strategies
92
+ "strategies": {
93
+ // Remove duplicate tool calls (same tool with same arguments)
94
+ "deduplication": {
95
+ "enabled": true,
96
+ // Additional tools to protect from pruning
97
+ "protectedTools": [],
98
+ },
99
+ // Prune write tool inputs when the file has been subsequently read
100
+ "supersedeWrites": {
101
+ "enabled": true,
102
+ },
103
+ // (Legacy) Run an LLM to analyze what tool calls are no longer relevant on idle
104
+ "onIdle": {
105
+ "enabled": false,
106
+ // Additional tools to protect from pruning
107
+ "protectedTools": [],
108
+ // Override model for analysis (format: "provider/model")
109
+ // "model": "anthropic/claude-haiku-4-5",
110
+ // Show toast notifications when model selection fails
111
+ "showModelErrorToasts": true,
112
+ // When true, fallback models are not permitted
113
+ "strictModelSelection": false,
114
+ },
85
115
  },
86
- // (Legacy) Run an LLM to analyze what tool calls are no longer relevant on idle
87
- "onIdle": {
88
- "enabled": false,
89
- // Additional tools to protect from pruning
90
- "protectedTools": [],
91
- // Override model for analysis (format: "provider/model")
92
- // "model": "anthropic/claude-haiku-4-5",
93
- // Show toast notifications when model selection fails
94
- "showModelErrorToasts": true,
95
- // When true, fallback models are not permitted
96
- "strictModelSelection": false
97
- }
98
- }
99
116
  }
100
117
  ```
101
118
 
102
119
  </details>
103
120
 
121
+ ### Turn Protection
122
+
123
+ When enabled, turn protection prevents tool outputs from being pruned for a configurable number of message turns. This gives the AI time to reference recent tool outputs before they become prunable. Applies to both `discard` and `extract` tools, as well as automatic strategies.
124
+
104
125
  ### Protected Tools
105
126
 
106
127
  By default, these tools are always protected from pruning across all strategies:
107
- `task`, `todowrite`, `todoread`, `prune`, `batch`
128
+ `task`, `todowrite`, `todoread`, `discard`, `extract`, `batch`
129
+
130
+ The `protectedTools` arrays in each section add to this default list:
108
131
 
109
- The `protectedTools` arrays in each strategy add to this default list.
132
+ - `tools.settings.protectedTools` Protects tools from the `discard` and `extract` tools
133
+ - `strategies.deduplication.protectedTools` — Protects tools from deduplication
134
+ - `strategies.onIdle.protectedTools` — Protects tools from on-idle analysis
110
135
 
111
136
  ### Config Precedence
112
137
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQjD,QAAA,MAAM,MAAM,EAAE,MAuDK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQjD,QAAA,MAAM,MAAM,EAAE,MAuFK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { getConfig } from "./lib/config";
2
2
  import { Logger } from "./lib/logger";
3
3
  import { loadPrompt } from "./lib/prompt";
4
4
  import { createSessionState } from "./lib/state";
5
- import { createPruneTool } from "./lib/strategies";
5
+ import { createDiscardTool, createExtractTool } from "./lib/strategies";
6
6
  import { createChatMessageTransformHandler, createEventHandler } from "./lib/hooks";
7
7
  const plugin = (async (ctx) => {
8
8
  const config = getConfig(ctx);
@@ -10,41 +10,71 @@ const plugin = (async (ctx) => {
10
10
  return {};
11
11
  }
12
12
  // Suppress AI SDK warnings
13
- if (typeof globalThis !== 'undefined') {
13
+ if (typeof globalThis !== "undefined") {
14
+ ;
14
15
  globalThis.AI_SDK_LOG_WARNINGS = false;
15
16
  }
16
- // Initialize core components
17
17
  const logger = new Logger(config.debug);
18
18
  const state = createSessionState();
19
- // Log initialization
20
19
  logger.info("DCP initialized", {
21
20
  strategies: config.strategies,
22
21
  });
23
22
  return {
24
23
  "experimental.chat.system.transform": async (_input, output) => {
25
- const syntheticPrompt = loadPrompt("synthetic");
24
+ const discardEnabled = config.tools.discard.enabled;
25
+ const extractEnabled = config.tools.extract.enabled;
26
+ let promptName;
27
+ if (discardEnabled && extractEnabled) {
28
+ promptName = "system/system-prompt-both";
29
+ }
30
+ else if (discardEnabled) {
31
+ promptName = "system/system-prompt-discard";
32
+ }
33
+ else if (extractEnabled) {
34
+ promptName = "system/system-prompt-extract";
35
+ }
36
+ else {
37
+ return;
38
+ }
39
+ const syntheticPrompt = loadPrompt(promptName);
26
40
  output.system.push(syntheticPrompt);
27
41
  },
28
42
  "experimental.chat.messages.transform": createChatMessageTransformHandler(ctx.client, state, logger, config),
29
- tool: config.strategies.pruneTool.enabled ? {
30
- prune: createPruneTool({
31
- client: ctx.client,
32
- state,
33
- logger,
34
- config,
35
- workingDirectory: ctx.directory
43
+ tool: {
44
+ ...(config.tools.discard.enabled && {
45
+ discard: createDiscardTool({
46
+ client: ctx.client,
47
+ state,
48
+ logger,
49
+ config,
50
+ workingDirectory: ctx.directory,
51
+ }),
52
+ }),
53
+ ...(config.tools.extract.enabled && {
54
+ extract: createExtractTool({
55
+ client: ctx.client,
56
+ state,
57
+ logger,
58
+ config,
59
+ workingDirectory: ctx.directory,
60
+ }),
36
61
  }),
37
- } : undefined,
62
+ },
38
63
  config: async (opencodeConfig) => {
39
- // Add prune to primary_tools by mutating the opencode config
64
+ // Add enabled tools to primary_tools by mutating the opencode config
40
65
  // This works because config is cached and passed by reference
41
- if (config.strategies.pruneTool.enabled) {
66
+ const toolsToAdd = [];
67
+ if (config.tools.discard.enabled)
68
+ toolsToAdd.push("discard");
69
+ if (config.tools.extract.enabled)
70
+ toolsToAdd.push("extract");
71
+ if (toolsToAdd.length > 0) {
42
72
  const existingPrimaryTools = opencodeConfig.experimental?.primary_tools ?? [];
43
73
  opencodeConfig.experimental = {
44
74
  ...opencodeConfig.experimental,
45
- primary_tools: [...existingPrimaryTools, "prune"],
75
+ primary_tools: [...existingPrimaryTools, ...toolsToAdd],
46
76
  };
47
- logger.info("Added 'prune' to experimental.primary_tools via config mutation");
77
+ logger.info(`Added ${toolsToAdd.map((t) => `'${t}'`).join(" and ")} to experimental.primary_tools via config mutation`);
48
78
  }
49
79
  },
50
80
  event: createEventHandler(ctx.client, config, state, logger, ctx.directory),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,iCAAiC,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,MAAM,GAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAE7B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,CAAA;IACb,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACnC,UAAkB,CAAC,mBAAmB,GAAG,KAAK,CAAA;IACnD,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAA;IAElC,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAA;IAEF,OAAO;QACH,oCAAoC,EAAE,KAAK,EAAE,MAAe,EAAE,MAA4B,EAAE,EAAE;YAC1F,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvC,CAAC;QACD,sCAAsC,EAAE,iCAAiC,CACrE,GAAG,CAAC,MAAM,EACV,KAAK,EACL,MAAM,EACN,MAAM,CACT;QACD,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,KAAK,EAAE,eAAe,CAAC;gBACnB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK;gBACL,MAAM;gBACN,MAAM;gBACN,gBAAgB,EAAE,GAAG,CAAC,SAAS;aAClC,CAAC;SACL,CAAC,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YAC7B,6DAA6D;YAC7D,8DAA8D;YAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtC,MAAM,oBAAoB,GAAG,cAAc,CAAC,YAAY,EAAE,aAAa,IAAI,EAAE,CAAA;gBAC7E,cAAc,CAAC,YAAY,GAAG;oBAC1B,GAAG,cAAc,CAAC,YAAY;oBAC9B,aAAa,EAAE,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC;iBACpD,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;YAClF,CAAC;QACL,CAAC;QACD,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC;KAC9E,CAAA;AACL,CAAC,CAAkB,CAAA;AAEnB,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { PluginInput } from '@opencode-ai/plugin';
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
2
  export interface Deduplication {
3
3
  enabled: boolean;
4
4
  protectedTools: string[];
@@ -10,26 +10,39 @@ export interface OnIdle {
10
10
  strictModelSelection?: boolean;
11
11
  protectedTools: string[];
12
12
  }
13
- export interface PruneToolNudge {
13
+ export interface DiscardTool {
14
14
  enabled: boolean;
15
- frequency: number;
16
15
  }
17
- export interface PruneTool {
16
+ export interface ExtractTool {
18
17
  enabled: boolean;
18
+ showDistillation: boolean;
19
+ }
20
+ export interface ToolSettings {
21
+ nudgeEnabled: boolean;
22
+ nudgeFrequency: number;
19
23
  protectedTools: string[];
20
- nudge: PruneToolNudge;
24
+ }
25
+ export interface Tools {
26
+ settings: ToolSettings;
27
+ discard: DiscardTool;
28
+ extract: ExtractTool;
21
29
  }
22
30
  export interface SupersedeWrites {
23
31
  enabled: boolean;
24
32
  }
33
+ export interface TurnProtection {
34
+ enabled: boolean;
35
+ turns: number;
36
+ }
25
37
  export interface PluginConfig {
26
38
  enabled: boolean;
27
39
  debug: boolean;
28
- pruningSummary: "off" | "minimal" | "detailed";
40
+ pruneNotification: "off" | "minimal" | "detailed";
41
+ turnProtection: TurnProtection;
42
+ tools: Tools;
29
43
  strategies: {
30
44
  deduplication: Deduplication;
31
45
  onIdle: OnIdle;
32
- pruneTool: PruneTool;
33
46
  supersedeWrites: SupersedeWrites;
34
47
  };
35
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,KAAK,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IAC9C,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,SAAS,CAAA;QACpB,eAAe,EAAE,eAAe,CAAA;KACnC,CAAA;CACJ;AAKD,eAAO,MAAM,iBAAiB,aA4B5B,CAAA;AAgBF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAG9E;AAgXD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CA4FxD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,KAAK;IAClB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IACjD,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,eAAe,CAAA;KACnC,CAAA;CACJ;AAKD,eAAO,MAAM,iBAAiB,aAkC5B,CAAA;AAgBF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAG9E;AAmiBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CA2GxD"}