opencode-english-prompt-polisher 0.1.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 (115) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +155 -0
  3. package/dist/chat-input.d.ts +6 -0
  4. package/dist/chat-input.d.ts.map +1 -0
  5. package/dist/chat-input.js +25 -0
  6. package/dist/chat-input.js.map +1 -0
  7. package/dist/chat-message-handler.d.ts +8 -0
  8. package/dist/chat-message-handler.d.ts.map +1 -0
  9. package/dist/chat-message-handler.js +17 -0
  10. package/dist/chat-message-handler.js.map +1 -0
  11. package/dist/chat-output.d.ts +6 -0
  12. package/dist/chat-output.d.ts.map +1 -0
  13. package/dist/chat-output.js +16 -0
  14. package/dist/chat-output.js.map +1 -0
  15. package/dist/checker/check-prompt.d.ts +10 -0
  16. package/dist/checker/check-prompt.d.ts.map +1 -0
  17. package/dist/checker/check-prompt.js +9 -0
  18. package/dist/checker/check-prompt.js.map +1 -0
  19. package/dist/checker/index.d.ts +2 -0
  20. package/dist/checker/index.d.ts.map +1 -0
  21. package/dist/checker/index.js +2 -0
  22. package/dist/checker/index.js.map +1 -0
  23. package/dist/checker/policy.d.ts +10 -0
  24. package/dist/checker/policy.d.ts.map +1 -0
  25. package/dist/checker/policy.js +12 -0
  26. package/dist/checker/policy.js.map +1 -0
  27. package/dist/checker/prompt.d.ts +21 -0
  28. package/dist/checker/prompt.d.ts.map +1 -0
  29. package/dist/checker/prompt.js +20 -0
  30. package/dist/checker/prompt.js.map +1 -0
  31. package/dist/checker/query.d.ts +5 -0
  32. package/dist/checker/query.d.ts.map +1 -0
  33. package/dist/checker/query.js +4 -0
  34. package/dist/checker/query.js.map +1 -0
  35. package/dist/checker/request.d.ts +13 -0
  36. package/dist/checker/request.d.ts.map +1 -0
  37. package/dist/checker/request.js +13 -0
  38. package/dist/checker/request.js.map +1 -0
  39. package/dist/checker/session.d.ts +34 -0
  40. package/dist/checker/session.d.ts.map +1 -0
  41. package/dist/checker/session.js +47 -0
  42. package/dist/checker/session.js.map +1 -0
  43. package/dist/checker/tools.d.ts +19 -0
  44. package/dist/checker/tools.d.ts.map +1 -0
  45. package/dist/checker/tools.js +18 -0
  46. package/dist/checker/tools.js.map +1 -0
  47. package/dist/checker/workflow-plan.d.ts +8 -0
  48. package/dist/checker/workflow-plan.d.ts.map +1 -0
  49. package/dist/checker/workflow-plan.js +9 -0
  50. package/dist/checker/workflow-plan.js.map +1 -0
  51. package/dist/checker/workflow.d.ts +8 -0
  52. package/dist/checker/workflow.d.ts.map +1 -0
  53. package/dist/checker/workflow.js +7 -0
  54. package/dist/checker/workflow.js.map +1 -0
  55. package/dist/index.d.ts +6 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +6 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/log.d.ts +17 -0
  60. package/dist/log.d.ts.map +1 -0
  61. package/dist/log.js +19 -0
  62. package/dist/log.js.map +1 -0
  63. package/dist/message-dedupe.d.ts +10 -0
  64. package/dist/message-dedupe.d.ts.map +1 -0
  65. package/dist/message-dedupe.js +31 -0
  66. package/dist/message-dedupe.js.map +1 -0
  67. package/dist/options/checker.d.ts +4 -0
  68. package/dist/options/checker.d.ts.map +1 -0
  69. package/dist/options/checker.js +28 -0
  70. package/dist/options/checker.js.map +1 -0
  71. package/dist/options.d.ts +9 -0
  72. package/dist/options.d.ts.map +1 -0
  73. package/dist/options.js +36 -0
  74. package/dist/options.js.map +1 -0
  75. package/dist/prompt-mode-message-handler.d.ts +13 -0
  76. package/dist/prompt-mode-message-handler.d.ts.map +1 -0
  77. package/dist/prompt-mode-message-handler.js +17 -0
  78. package/dist/prompt-mode-message-handler.js.map +1 -0
  79. package/dist/prompt-rewrite.d.ts +23 -0
  80. package/dist/prompt-rewrite.d.ts.map +1 -0
  81. package/dist/prompt-rewrite.js +59 -0
  82. package/dist/prompt-rewrite.js.map +1 -0
  83. package/dist/prompt-runners/logging.d.ts +6 -0
  84. package/dist/prompt-runners/logging.d.ts.map +1 -0
  85. package/dist/prompt-runners/logging.js +22 -0
  86. package/dist/prompt-runners/logging.js.map +1 -0
  87. package/dist/prompt-runners/proposal-background.d.ts +4 -0
  88. package/dist/prompt-runners/proposal-background.d.ts.map +1 -0
  89. package/dist/prompt-runners/proposal-background.js +7 -0
  90. package/dist/prompt-runners/proposal-background.js.map +1 -0
  91. package/dist/prompt-runners/proposal.d.ts +6 -0
  92. package/dist/prompt-runners/proposal.d.ts.map +1 -0
  93. package/dist/prompt-runners/proposal.js +17 -0
  94. package/dist/prompt-runners/proposal.js.map +1 -0
  95. package/dist/prompt-runners/rewrite.d.ts +5 -0
  96. package/dist/prompt-runners/rewrite.d.ts.map +1 -0
  97. package/dist/prompt-runners/rewrite.js +15 -0
  98. package/dist/prompt-runners/rewrite.js.map +1 -0
  99. package/dist/prompt-runners.d.ts +11 -0
  100. package/dist/prompt-runners.d.ts.map +1 -0
  101. package/dist/prompt-runners.js +16 -0
  102. package/dist/prompt-runners.js.map +1 -0
  103. package/dist/server.d.ts +6 -0
  104. package/dist/server.d.ts.map +1 -0
  105. package/dist/server.js +19 -0
  106. package/dist/server.js.map +1 -0
  107. package/dist/session-filter.d.ts +22 -0
  108. package/dist/session-filter.d.ts.map +1 -0
  109. package/dist/session-filter.js +25 -0
  110. package/dist/session-filter.js.map +1 -0
  111. package/dist/types.d.ts +22 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/package.json +72 -0
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # OpenCode English Prompt Polisher
2
+
3
+ OpenCode plugin that checks each user prompt and writes a polished English proposal when the prompt is not English or needs English cleanup.
4
+
5
+ The checker uses OpenCode's configured model/auth by creating a temporary OpenCode session. Proposal mode runs the check asynchronously; rewrite mode waits for it before OpenCode continues.
6
+
7
+ ## Features
8
+
9
+ - Uses only OpenCode for prompt checking.
10
+ - Proposes English versions for non-English prompts.
11
+ - Polishes grammatically incorrect or unclear English prompts.
12
+ - Writes proposals to `~/opencode-english-prompt-polisher.md` by default.
13
+ - Optionally creates one Notion database entry per proposal.
14
+ - Skips its own internal checker prompts to avoid recursion.
15
+ - Deletes temporary checker sessions by default.
16
+
17
+ ## Reusable Core
18
+
19
+ Reusable prompt-polishing logic lives in the `english-prompt-polisher` package. This package keeps only the OpenCode adapter: hook wiring, message dedupe, mode dispatch, rewrite mutation, background scheduling, temporary checker sessions, OpenCode logging, and OpenCode-specific checker options.
20
+
21
+ OpenCode-specific hook, session, and logging code lives directly under `src/`.
22
+
23
+ ## Install From npm
24
+
25
+ This repository depends on the npm package `english-prompt-polisher` for reusable prompt-polishing logic.
26
+
27
+ Add the plugin to your OpenCode config:
28
+
29
+ ```jsonc
30
+ {
31
+ "$schema": "https://opencode.ai/config.json",
32
+ "plugin": [
33
+ [
34
+ "opencode-english-prompt-polisher",
35
+ {
36
+ "mode": "proposal",
37
+ "outputFile": "~/opencode-english-prompt-polisher.md",
38
+ "checker": {
39
+ "agent": "general",
40
+ "model": "current",
41
+ "deleteSession": true,
42
+ },
43
+ "notion": {
44
+ "enabled": true,
45
+ "token": "{env:ENGLISH_PROMPT_POLISHER_NOTION_TOKEN}",
46
+ "databaseId": "{env:ENGLISH_PROMPT_POLISHER_NOTION_DATABASE_ID}",
47
+ },
48
+ },
49
+ ],
50
+ ],
51
+ }
52
+ ```
53
+
54
+ Restart OpenCode after changing config. OpenCode loads plugins only at startup.
55
+
56
+ ## Options
57
+
58
+ | Option | Default | Description |
59
+ | ----------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
60
+ | `mode` | `proposal` | Use `proposal` to write suggestions in the background, or `rewrite` to replace the user prompt before OpenCode sends it to the model. |
61
+ | `outputFile` | `~/opencode-english-prompt-polisher.md` | Markdown file that receives proposals. |
62
+ | `maxChars` | `4000` | Maximum prompt characters sent to the checker. In `rewrite` mode, longer prompts are left unchanged. |
63
+ | `includeOriginal` | `true` | Include the original prompt in the Markdown output. |
64
+ | `checker.agent` | `general` | OpenCode agent used for the temporary checker session. |
65
+ | `checker.model` | `current` | Use the current message model, or set `provider/model`. |
66
+ | `checker.deleteSession` | `true` | Delete temporary checker sessions after each check. |
67
+ | `notion.enabled` | `false` | Create Notion database entries. |
68
+ | `notion.token` | unset | Notion integration token. |
69
+ | `notion.databaseId` | unset | Direct Notion database ID. |
70
+ | `notion.titleProperty` | auto-detect | Notion title property name. |
71
+
72
+ ## Rewrite Mode
73
+
74
+ Set `mode` to `rewrite` when OpenCode should receive the polished prompt instead of the original user text:
75
+
76
+ ```jsonc
77
+ {
78
+ "$schema": "https://opencode.ai/config.json",
79
+ "plugin": [
80
+ [
81
+ "opencode-english-prompt-polisher",
82
+ {
83
+ "mode": "rewrite",
84
+ "checker": {
85
+ "agent": "general",
86
+ "model": "current",
87
+ },
88
+ },
89
+ ],
90
+ ],
91
+ }
92
+ ```
93
+
94
+ Rewrite mode waits for the checker before OpenCode continues. If the checker fails or decides no rewrite is needed, the original prompt is left unchanged.
95
+
96
+ ## Notion Setup
97
+
98
+ 1. Create a Notion integration and copy its token.
99
+ 2. Share the target database with the integration.
100
+ 3. Export the values before starting OpenCode:
101
+
102
+ ```sh
103
+ export ENGLISH_PROMPT_POLISHER_NOTION_TOKEN="secret_..."
104
+ export ENGLISH_PROMPT_POLISHER_NOTION_DATABASE_ID="..."
105
+ ```
106
+
107
+ 4. Reference the values from the plugin config with OpenCode env expansion:
108
+
109
+ ```jsonc
110
+ "notion": {
111
+ "enabled": true,
112
+ "token": "{env:ENGLISH_PROMPT_POLISHER_NOTION_TOKEN}",
113
+ "databaseId": "{env:ENGLISH_PROMPT_POLISHER_NOTION_DATABASE_ID}"
114
+ }
115
+ ```
116
+
117
+ The database must have a title property. These optional properties are filled only when they exist with matching Notion types:
118
+
119
+ - `Detected Language`: rich text
120
+ - `Conversation ID`: rich text
121
+ - `Created At`: date
122
+
123
+ The full reason, original prompt, and proposed English prompt are stored in the Notion page body.
124
+
125
+ ## Output Example
126
+
127
+ ````md
128
+ ## 2026-06-13T12:00:00.000Z
129
+
130
+ - Conversation ID: ses_123
131
+ - Message ID: msg_456
132
+ - Detected Language: Russian
133
+ - Reason: Prompt is written in Russian and should be translated to English.
134
+
135
+ ### Original Prompt
136
+
137
+ ```text
138
+ Создай плагин для OpenCode
139
+ ```
140
+
141
+ ### Proposed English Prompt
142
+
143
+ ```text
144
+ Create a plugin for OpenCode.
145
+ ```
146
+ ````
147
+
148
+ ## Notes
149
+
150
+ - In `proposal` mode, the original user prompt is not modified or blocked.
151
+ - In `rewrite` mode, the user prompt is modified in place before OpenCode sends it to the model.
152
+ - Proposal output is written as supporting output for the user to review only in `proposal` mode.
153
+ - If the checker or Notion write fails, the plugin logs a warning and lets the original prompt continue.
154
+ - Prompt checking runs in the background only in `proposal` mode, so proposals can appear after OpenCode has already started responding.
155
+ - Because every prompt requires an extra OpenCode model call, this plugin can increase token usage.
@@ -0,0 +1,6 @@
1
+ import type { ChatMessageInput } from 'english-prompt-polisher';
2
+ import type { OpenCodeMessageDedupeInput } from './message-dedupe.ts';
3
+ import type { OpenCodeChatMessageInput } from './types.ts';
4
+ export declare function toCoreChatMessageInput(input: OpenCodeChatMessageInput): ChatMessageInput;
5
+ export declare function toMessageDedupeInput(input: OpenCodeChatMessageInput, dedupeKey?: string): OpenCodeMessageDedupeInput;
6
+ //# sourceMappingURL=chat-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../src/chat-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,GAAG,gBAAgB,CAaxF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,0BAA0B,CAapH"}
@@ -0,0 +1,25 @@
1
+ export function toCoreChatMessageInput(input) {
2
+ const result = {
3
+ conversationId: input.sessionID,
4
+ };
5
+ if (input.messageID !== undefined) {
6
+ result.messageId = input.messageID;
7
+ }
8
+ if (input.model !== undefined) {
9
+ result.model = input.model;
10
+ }
11
+ return result;
12
+ }
13
+ export function toMessageDedupeInput(input, dedupeKey) {
14
+ const result = {
15
+ conversationId: input.sessionID,
16
+ };
17
+ if (input.messageID !== undefined) {
18
+ result.messageId = input.messageID;
19
+ }
20
+ if (dedupeKey !== undefined) {
21
+ result.dedupeKey = dedupeKey;
22
+ }
23
+ return result;
24
+ }
25
+ //# sourceMappingURL=chat-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../src/chat-input.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,sBAAsB,CAAC,KAA+B;IACrE,MAAM,MAAM,GAAqB;QAChC,cAAc,EAAE,KAAK,CAAC,SAAS;KAC/B,CAAC;IAEF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA+B,EAAE,SAAkB;IACvF,MAAM,MAAM,GAA+B;QAC1C,cAAc,EAAE,KAAK,CAAC,SAAS;KAC/B,CAAC;IAEF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACpC,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Hooks } from '@opencode-ai/plugin';
2
+ import type { NextDedupeKey, ShouldHandleMessage } from './message-dedupe.ts';
3
+ import type { OpenCodePromptRunners } from './prompt-runners.ts';
4
+ import type { ShouldHandleSession } from './session-filter.ts';
5
+ import type { OpenCodeOptions } from './types.ts';
6
+ export type OpenCodeChatMessageHandler = NonNullable<Hooks['chat.message']>;
7
+ export declare function createOpenCodeChatMessageHandler(options: OpenCodeOptions, shouldHandleSession: ShouldHandleSession, shouldHandleMessage: ShouldHandleMessage, promptRunners: OpenCodePromptRunners, nextFallbackDedupeKey: NextDedupeKey): OpenCodeChatMessageHandler;
8
+ //# sourceMappingURL=chat-message-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-message-handler.d.ts","sourceRoot":"","sources":["../src/chat-message-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjD,OAAO,KAAK,EAAE,aAAa,EAA8B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,0BAA0B,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAE5E,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,eAAe,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,qBAAqB,EACpC,qBAAqB,EAAE,aAAa,GAClC,0BAA0B,CAiB5B"}
@@ -0,0 +1,17 @@
1
+ import { toCoreChatMessageInput, toMessageDedupeInput } from "./chat-input.js";
2
+ import { modeOption } from "./options.js";
3
+ import { dispatchPromptMode } from "./prompt-mode-message-handler.js";
4
+ export function createOpenCodeChatMessageHandler(options, shouldHandleSession, shouldHandleMessage, promptRunners, nextFallbackDedupeKey) {
5
+ return async (input, output) => {
6
+ if (!(await shouldHandleSession(input.sessionID))) {
7
+ return;
8
+ }
9
+ const dedupeInput = toMessageDedupeInput(input, input.messageID === undefined ? nextFallbackDedupeKey() : undefined);
10
+ if (!shouldHandleMessage(dedupeInput)) {
11
+ return;
12
+ }
13
+ const coreInput = toCoreChatMessageInput(input);
14
+ await dispatchPromptMode(modeOption(options), input, coreInput, output, promptRunners);
15
+ };
16
+ }
17
+ //# sourceMappingURL=chat-message-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-message-handler.js","sourceRoot":"","sources":["../src/chat-message-handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAOtE,MAAM,UAAU,gCAAgC,CAC/C,OAAwB,EACxB,mBAAwC,EACxC,mBAAwC,EACxC,aAAoC,EACpC,qBAAoC;IAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAiB,EAAE;QAC7C,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO;QACR,CAAC;QAED,MAAM,WAAW,GAA+B,oBAAoB,CACnE,KAAK,EACL,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,SAAS,CACnE,CAAC;QACF,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,OAAO;QACR,CAAC;QAED,MAAM,SAAS,GAAqB,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACxF,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ChatMessageOutput } from 'english-prompt-polisher';
2
+ export declare function snapshotChatMessageOutput(output: ChatMessageOutput): ChatMessageOutput;
3
+ type BackgroundOutputRunner = (output: ChatMessageOutput) => Promise<void>;
4
+ export declare function runWithOutputSnapshotInBackground(output: ChatMessageOutput, run: BackgroundOutputRunner): void;
5
+ export {};
6
+ //# sourceMappingURL=chat-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-output.d.ts","sourceRoot":"","sources":["../src/chat-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,yBAAyB,CAAC;AAE3E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAKtF;AAED,KAAK,sBAAsB,GAAG,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAQ3E,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAG9G"}
@@ -0,0 +1,16 @@
1
+ export function snapshotChatMessageOutput(output) {
2
+ return {
3
+ message: output.message,
4
+ parts: output.parts.map((part) => ({ ...part })),
5
+ };
6
+ }
7
+ function scheduleBackgroundTask(run) {
8
+ setTimeout(() => {
9
+ void run();
10
+ }, 0);
11
+ }
12
+ export function runWithOutputSnapshotInBackground(output, run) {
13
+ const outputSnapshot = snapshotChatMessageOutput(output);
14
+ scheduleBackgroundTask(() => run(outputSnapshot));
15
+ }
16
+ //# sourceMappingURL=chat-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-output.js","sourceRoot":"","sources":["../src/chat-output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,MAAyB;IAClE,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAY,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KAC1D,CAAC;AACH,CAAC;AAID,SAAS,sBAAsB,CAAC,GAAwB;IACvD,UAAU,CAAC,GAAS,EAAE;QACrB,KAAK,GAAG,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAAyB,EAAE,GAA2B;IACvG,MAAM,cAAc,GAAsB,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC5E,sBAAsB,CAAC,GAAkB,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ChatMessageInput, PolisherResult } from 'english-prompt-polisher';
2
+ import type { OpenCodeOptions } from '../types.ts';
3
+ import { type CheckerPromptClient } from './prompt.ts';
4
+ import type { CheckerSessionClient } from './session.ts';
5
+ import type { CheckerToolClient } from './tools.ts';
6
+ export type CheckerClient = CheckerSessionClient & CheckerToolClient & CheckerPromptClient;
7
+ type Client = CheckerClient;
8
+ export declare function checkPrompt(client: Client, input: ChatMessageInput, options: OpenCodeOptions, prompt: string, directory?: string): Promise<PolisherResult>;
9
+ export {};
10
+ //# sourceMappingURL=check-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-prompt.d.ts","sourceRoot":"","sources":["../../src/checker/check-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,MAAM,aAAa,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;AAE3F,KAAK,MAAM,GAAG,aAAa,CAAC;AAE5B,wBAAsB,WAAW,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CASzB"}
@@ -0,0 +1,9 @@
1
+ import { runCheckerPrompt } from "./prompt.js";
2
+ import { checkerWorkflowPlan } from "./workflow-plan.js";
3
+ import { runCheckerWorkflow } from "./workflow.js";
4
+ export async function checkPrompt(client, input, options, prompt, directory) {
5
+ return await runCheckerWorkflow(client, checkerWorkflowPlan(input, options), async (sessionID, tools) => {
6
+ return await runCheckerPrompt(client, sessionID, input, options, prompt, tools, directory);
7
+ }, directory);
8
+ }
9
+ //# sourceMappingURL=check-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-prompt.js","sourceRoot":"","sources":["../../src/checker/check-prompt.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAA4B,MAAM,aAAa,CAAC;AAIzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAAc,EACd,KAAuB,EACvB,OAAwB,EACxB,MAAc,EACd,SAAkB;IAElB,OAAO,MAAM,kBAAkB,CAC9B,MAAM,EACN,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,EACnC,KAAK,EAAE,SAAS,EAAE,KAAkC,EAAE,EAAE;QACvD,OAAO,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5F,CAAC,EACD,SAAS,CACT,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { checkPrompt, type CheckerClient } from './check-prompt.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { checkPrompt } from "./check-prompt.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ChatMessageInput, type ChatModel } from 'english-prompt-polisher';
2
+ import type { OpenCodeOptions } from '../types.ts';
3
+ export declare const DEFAULT_CHECKER_AGENT: string;
4
+ export type CheckerRequestPolicy = {
5
+ agent: string;
6
+ model?: ChatModel;
7
+ system: string;
8
+ };
9
+ export declare function checkerRequestPolicy(input: ChatMessageInput, options: OpenCodeOptions): CheckerRequestPolicy;
10
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,eAAO,MAAM,qBAAqB,EAAE,MAAkB,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,oBAAoB,CAO5G"}
@@ -0,0 +1,12 @@
1
+ import { CHECKER_SYSTEM_PROMPT, resolveCheckerModel, } from 'english-prompt-polisher';
2
+ import { checkerOptions } from "../options.js";
3
+ export const DEFAULT_CHECKER_AGENT = 'general';
4
+ export function checkerRequestPolicy(input, options) {
5
+ const checker = checkerOptions(options);
6
+ return {
7
+ agent: checker.agent ?? DEFAULT_CHECKER_AGENT,
8
+ model: resolveCheckerModel(input.model, checker.model),
9
+ system: CHECKER_SYSTEM_PROMPT,
10
+ };
11
+ }
12
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,qBAAqB,EACrB,mBAAmB,GAGnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,MAAM,qBAAqB,GAAW,SAAS,CAAC;AAQvD,MAAM,UAAU,oBAAoB,CAAC,KAAuB,EAAE,OAAwB;IACrF,MAAM,OAAO,GAA2B,cAAc,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO;QACN,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,qBAAqB;QAC7C,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QACtD,MAAM,EAAE,qBAAqB;KAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { SessionPromptData } from '@opencode-ai/sdk';
2
+ import { type ChatMessageInput, type ChatParts, type PolisherResult } from 'english-prompt-polisher';
3
+ import type { OpenCodeOptions } from '../types.ts';
4
+ import { type CheckerRequestBody } from './request.ts';
5
+ type ClientResult<T> = Promise<{
6
+ data: T | undefined;
7
+ }>;
8
+ type SessionPromptResultData = {
9
+ parts?: ChatParts;
10
+ };
11
+ type SessionPromptOptions = Omit<SessionPromptData, 'body' | 'url'> & {
12
+ body: CheckerRequestBody;
13
+ };
14
+ export type CheckerPromptClient = {
15
+ session: {
16
+ prompt: (options: SessionPromptOptions) => ClientResult<SessionPromptResultData>;
17
+ };
18
+ };
19
+ export declare function runCheckerPrompt(client: CheckerPromptClient, sessionID: string, input: ChatMessageInput, options: OpenCodeOptions, prompt: string, tools: CheckerRequestBody['tools'], directory?: string): Promise<PolisherResult>;
20
+ export {};
21
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/checker/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAEN,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEhF,KAAK,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AACxD,KAAK,uBAAuB,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AACrD,KAAK,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE;QACR,MAAM,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,YAAY,CAAC,uBAAuB,CAAC,CAAC;KACjF,CAAC;CACF,CAAC;AA2BF,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAClC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAGzB"}
@@ -0,0 +1,20 @@
1
+ import { parseCheckerResult, } from 'english-prompt-polisher';
2
+ import { queryForDirectory } from "./query.js";
3
+ import { buildCheckerRequestBody } from "./request.js";
4
+ function checkerResultParts(result) {
5
+ return result.data?.parts ?? [];
6
+ }
7
+ async function promptCheckerSession(client, sessionID, input, options, prompt, tools, directory) {
8
+ const query = queryForDirectory(directory);
9
+ const result = await client.session.prompt({
10
+ path: { id: sessionID },
11
+ body: buildCheckerRequestBody(input, options, prompt, tools),
12
+ ...(query === undefined ? {} : { query }),
13
+ });
14
+ return checkerResultParts(result);
15
+ }
16
+ export async function runCheckerPrompt(client, sessionID, input, options, prompt, tools, directory) {
17
+ const parts = await promptCheckerSession(client, sessionID, input, options, prompt, tools, directory);
18
+ return parseCheckerResult(parts);
19
+ }
20
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/checker/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EACN,kBAAkB,GAIlB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAA2B,MAAM,cAAc,CAAC;AAchF,SAAS,kBAAkB,CAAC,MAAkC;IAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAClC,MAA2B,EAC3B,SAAiB,EACjB,KAAuB,EACvB,OAAwB,EACxB,MAAc,EACd,KAAkC,EAClC,SAAkB;IAElB,MAAM,KAAK,GAAyC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjF,MAAM,MAAM,GAA+B,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACtE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;QACvB,IAAI,EAAE,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC5D,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KACzC,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,MAA2B,EAC3B,SAAiB,EACjB,KAAuB,EACvB,OAAwB,EACxB,MAAc,EACd,KAAkC,EAClC,SAAkB;IAElB,MAAM,KAAK,GAAc,MAAM,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type DirectoryQuery = {
2
+ directory: string;
3
+ };
4
+ export declare function queryForDirectory(directory?: string): DirectoryQuery | undefined;
5
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/checker/query.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhF"}
@@ -0,0 +1,4 @@
1
+ export function queryForDirectory(directory) {
2
+ return directory === undefined ? undefined : { directory };
3
+ }
4
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/checker/query.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,SAAkB;IACnD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SessionPromptData, TextPartInput } from '@opencode-ai/sdk';
2
+ import { type ChatMessageInput } from 'english-prompt-polisher';
3
+ import type { OpenCodeOptions } from '../types.ts';
4
+ type SessionPromptBody = NonNullable<SessionPromptData['body']>;
5
+ export type CheckerRequestBody = Omit<SessionPromptBody, 'agent' | 'parts' | 'system' | 'tools'> & {
6
+ agent: string;
7
+ system: string;
8
+ tools: Record<string, boolean>;
9
+ parts: [TextPartInput];
10
+ };
11
+ export declare function buildCheckerRequestBody(input: ChatMessageInput, options: OpenCodeOptions, prompt: string, tools: CheckerRequestBody['tools']): CheckerRequestBody;
12
+ export {};
13
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/checker/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,KAAK,iBAAiB,GAAG,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IAClG,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC;CACvB,CAAC;AAEF,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAChC,kBAAkB,CASpB"}
@@ -0,0 +1,13 @@
1
+ import { buildCheckerPrompt } from 'english-prompt-polisher';
2
+ import { checkerRequestPolicy } from "./policy.js";
3
+ export function buildCheckerRequestBody(input, options, prompt, tools) {
4
+ const policy = checkerRequestPolicy(input, options);
5
+ return {
6
+ agent: policy.agent,
7
+ model: policy.model,
8
+ tools,
9
+ system: policy.system,
10
+ parts: [{ type: 'text', text: buildCheckerPrompt(prompt) }],
11
+ };
12
+ }
13
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/checker/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AAIpF,OAAO,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAW9E,MAAM,UAAU,uBAAuB,CACtC,KAAuB,EACvB,OAAwB,EACxB,MAAc,EACd,KAAkC;IAElC,MAAM,MAAM,GAAyB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;KAC3D,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ type ClientResult<T> = Promise<{
2
+ data: T | undefined;
3
+ }>;
4
+ type SessionCreateResultData = {
5
+ id?: string;
6
+ };
7
+ type SessionCreateOptions = {
8
+ body?: {
9
+ parentID?: string;
10
+ title?: string;
11
+ };
12
+ query?: {
13
+ directory?: string;
14
+ };
15
+ };
16
+ type SessionDeleteOptions = {
17
+ path: {
18
+ id: string;
19
+ };
20
+ query?: {
21
+ directory?: string;
22
+ };
23
+ };
24
+ export declare const CHECKER_SESSION_DELETE_DELAY_MS: number;
25
+ export type CheckerSessionClient = {
26
+ session: {
27
+ create: (options: SessionCreateOptions) => ClientResult<SessionCreateResultData>;
28
+ delete: (options: SessionDeleteOptions) => Promise<unknown>;
29
+ };
30
+ };
31
+ type Client = CheckerSessionClient;
32
+ export declare function withCheckerSession<T>(client: Client, deleteSession: boolean, run: (sessionID: string) => Promise<T>, directory?: string, parentSessionID?: string, deleteDelayMs?: number): Promise<T>;
33
+ export {};
34
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/checker/session.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AACxD,KAAK,uBAAuB,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/C,KAAK,oBAAoB,GAAG;IAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAC7G,KAAK,oBAAoB,GAAG;IAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAErF,eAAO,MAAM,+BAA+B,EAAE,MAAa,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE;QACR,MAAM,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,YAAY,CAAC,uBAAuB,CAAC,CAAC;QACjF,MAAM,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5D,CAAC;CACF,CAAC;AAEF,KAAK,MAAM,GAAG,oBAAoB,CAAC;AA2CnC,wBAAsB,kBAAkB,CAAC,CAAC,EACzC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,OAAO,EACtB,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,EACxB,aAAa,GAAE,MAAwC,GACrD,OAAO,CAAC,CAAC,CAAC,CAUZ"}
@@ -0,0 +1,47 @@
1
+ import { queryForDirectory } from "./query.js";
2
+ export const CHECKER_SESSION_DELETE_DELAY_MS = 1000;
3
+ async function createCheckerSession(client, directory, parentSessionID) {
4
+ const query = queryForDirectory(directory);
5
+ const body = { title: 'English prompt polish check' };
6
+ if (parentSessionID !== undefined && parentSessionID.length > 0) {
7
+ body.parentID = parentSessionID;
8
+ }
9
+ const session = await client.session.create({
10
+ body,
11
+ ...(query === undefined ? {} : { query }),
12
+ });
13
+ const sessionID = session.data?.id;
14
+ if (!sessionID) {
15
+ throw new Error('OpenCode did not return a checker session id');
16
+ }
17
+ return sessionID;
18
+ }
19
+ async function deleteCheckerSession(client, sessionID, directory) {
20
+ const query = queryForDirectory(directory);
21
+ try {
22
+ await client.session.delete({ path: { id: sessionID }, ...(query === undefined ? {} : { query }) });
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ }
28
+ function scheduleCheckerSessionDelete(client, sessionID, directory, delayMs = CHECKER_SESSION_DELETE_DELAY_MS) {
29
+ const timer = setTimeout(() => {
30
+ void deleteCheckerSession(client, sessionID, directory);
31
+ }, delayMs);
32
+ if (delayMs > 0) {
33
+ timer.unref();
34
+ }
35
+ }
36
+ export async function withCheckerSession(client, deleteSession, run, directory, parentSessionID, deleteDelayMs = CHECKER_SESSION_DELETE_DELAY_MS) {
37
+ const sessionID = await createCheckerSession(client, directory, parentSessionID);
38
+ try {
39
+ return await run(sessionID);
40
+ }
41
+ finally {
42
+ if (deleteSession) {
43
+ scheduleCheckerSessionDelete(client, sessionID, directory, deleteDelayMs);
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/checker/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAOpE,MAAM,CAAC,MAAM,+BAA+B,GAAW,IAAI,CAAC;AAW5D,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAkB,EAAE,eAAwB;IAC/F,MAAM,KAAK,GAA+B,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,IAAI,GAA8C,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IACjG,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IACjC,CAAC;IACD,MAAM,OAAO,GAAqD,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7F,IAAI;QACJ,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,SAAS,GAAuB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAkB;IACxF,MAAM,KAAK,GAA+B,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B,CACpC,MAAc,EACd,SAAiB,EACjB,SAAkB,EAClB,UAAkB,+BAA+B;IAEjD,MAAM,KAAK,GAAkC,UAAU,CAAC,GAAS,EAAE;QAClE,KAAK,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC,EAAE,OAAO,CAAC,CAAC;IAEZ,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,MAAc,EACd,aAAsB,EACtB,GAAsC,EACtC,SAAkB,EAClB,eAAwB,EACxB,gBAAwB,+BAA+B;IAEvD,MAAM,SAAS,GAAW,MAAM,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEzF,IAAI,CAAC;QACJ,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;YAAS,CAAC;QACV,IAAI,aAAa,EAAE,CAAC;YACnB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAC3E,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CheckerRequestBody } from './request.ts';
2
+ type ClientResult<T> = Promise<{
3
+ data: T | undefined;
4
+ }>;
5
+ type ToolIdsOptions = {
6
+ query?: {
7
+ directory?: string;
8
+ };
9
+ };
10
+ type ToolIdsResultData = string[];
11
+ export type CheckerToolClient = {
12
+ tool: {
13
+ ids: (options?: ToolIdsOptions) => ClientResult<ToolIdsResultData>;
14
+ };
15
+ };
16
+ export declare function disabledToolMap(toolIds: string[]): CheckerRequestBody['tools'];
17
+ export declare function disabledCheckerTools(client: CheckerToolClient, directory?: string): Promise<CheckerRequestBody['tools']>;
18
+ export {};
19
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/checker/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,KAAK,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AACxD,KAAK,cAAc,GAAG;IAAE,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AACzD,KAAK,iBAAiB,GAAG,MAAM,EAAE,CAAC;AAElC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE;QACL,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,KAAK,YAAY,CAAC,iBAAiB,CAAC,CAAC;KACnE,CAAC;CACF,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAM9E;AAED,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,iBAAiB,EACzB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAWtC"}
@@ -0,0 +1,18 @@
1
+ import { queryForDirectory } from "./query.js";
2
+ export function disabledToolMap(toolIds) {
3
+ const tools = {};
4
+ for (const toolId of toolIds) {
5
+ tools[toolId] = false;
6
+ }
7
+ return tools;
8
+ }
9
+ export async function disabledCheckerTools(client, directory) {
10
+ const query = queryForDirectory(directory);
11
+ const result = await client.tool.ids(query === undefined ? undefined : { query });
12
+ const toolIds = result.data;
13
+ if (toolIds === undefined) {
14
+ throw new Error('OpenCode did not return tool ids for the checker session');
15
+ }
16
+ return disabledToolMap(toolIds);
17
+ }
18
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/checker/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAa/C,MAAM,UAAU,eAAe,CAAC,OAAiB;IAChD,MAAM,KAAK,GAAgC,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,MAAyB,EACzB,SAAkB;IAElB,MAAM,KAAK,GAAyC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjF,MAAM,MAAM,GAA0D,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAC1F,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAC3C,CAAC;IACF,MAAM,OAAO,GAAkC,MAAM,CAAC,IAAI,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ChatMessageInput } from 'english-prompt-polisher';
2
+ import type { OpenCodeOptions } from '../types.ts';
3
+ export type CheckerWorkflowPlan = {
4
+ deleteSession: boolean;
5
+ parentSessionID: string;
6
+ };
7
+ export declare function checkerWorkflowPlan(input: ChatMessageInput, options: OpenCodeOptions): CheckerWorkflowPlan;
8
+ //# sourceMappingURL=workflow-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-plan.d.ts","sourceRoot":"","sources":["../../src/checker/workflow-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,MAAM,MAAM,mBAAmB,GAAG;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,mBAAmB,CAM1G"}