opencode-english-prompt-polisher 0.1.0 → 1.0.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.
- package/README.md +17 -26
- package/dist/chat-input.d.ts +0 -2
- package/dist/chat-input.d.ts.map +1 -1
- package/dist/chat-input.js +0 -12
- package/dist/chat-input.js.map +1 -1
- package/dist/checker/index.d.ts +1 -1
- package/dist/checker/index.d.ts.map +1 -1
- package/dist/checker/index.js +1 -1
- package/dist/checker/index.js.map +1 -1
- package/dist/checker/model-resolver.d.ts +9 -0
- package/dist/checker/model-resolver.d.ts.map +1 -0
- package/dist/checker/model-resolver.js +23 -0
- package/dist/checker/model-resolver.js.map +1 -0
- package/dist/checker/policy.d.ts +3 -3
- package/dist/checker/policy.d.ts.map +1 -1
- package/dist/checker/policy.js +1 -1
- package/dist/checker/policy.js.map +1 -1
- package/dist/checker/service.d.ts +23 -0
- package/dist/checker/service.d.ts.map +1 -0
- package/dist/checker/service.js +47 -0
- package/dist/checker/service.js.map +1 -0
- package/dist/checker/session-lifecycle.d.ts +19 -0
- package/dist/checker/session-lifecycle.d.ts.map +1 -0
- package/dist/checker/session-lifecycle.js +23 -0
- package/dist/checker/session-lifecycle.js.map +1 -0
- package/dist/effect-context.d.ts +13 -0
- package/dist/effect-context.d.ts.map +1 -0
- package/dist/effect-context.js +52 -0
- package/dist/effect-context.js.map +1 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +1 -3
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +6 -11
- package/dist/options.js.map +1 -1
- package/dist/pending-work-tracker.d.ts +8 -0
- package/dist/pending-work-tracker.d.ts.map +1 -0
- package/dist/pending-work-tracker.js +44 -0
- package/dist/pending-work-tracker.js.map +1 -0
- package/dist/prompt-delivery-policy.d.ts +8 -0
- package/dist/prompt-delivery-policy.d.ts.map +1 -0
- package/dist/prompt-delivery-policy.js +23 -0
- package/dist/prompt-delivery-policy.js.map +1 -0
- package/dist/prompt-hook.d.ts +5 -0
- package/dist/prompt-hook.d.ts.map +1 -0
- package/dist/prompt-hook.js +25 -0
- package/dist/prompt-hook.js.map +1 -0
- package/dist/prompt-processor.d.ts +11 -0
- package/dist/prompt-processor.d.ts.map +1 -0
- package/dist/prompt-processor.js +43 -0
- package/dist/prompt-processor.js.map +1 -0
- package/dist/prompt-runners/logging.d.ts +2 -2
- package/dist/prompt-runners/logging.d.ts.map +1 -1
- package/dist/prompt-runners/logging.js +1 -1
- package/dist/prompt-runners/logging.js.map +1 -1
- package/dist/prompt-runners/proposal.d.ts +1 -1
- package/dist/prompt-runners/proposal.d.ts.map +1 -1
- package/dist/prompt-runners/proposal.js +6 -2
- package/dist/prompt-runners/proposal.js.map +1 -1
- package/dist/prompt-runners/rewrite.d.ts +5 -4
- package/dist/prompt-runners/rewrite.d.ts.map +1 -1
- package/dist/prompt-runners/rewrite.js +8 -9
- package/dist/prompt-runners/rewrite.js.map +1 -1
- package/dist/prompt-runners.d.ts +9 -9
- package/dist/prompt-runners.d.ts.map +1 -1
- package/dist/prompt-runners.js +2 -9
- package/dist/prompt-runners.js.map +1 -1
- package/dist/prompt-task-coordinator.d.ts +11 -0
- package/dist/prompt-task-coordinator.d.ts.map +1 -0
- package/dist/prompt-task-coordinator.js +108 -0
- package/dist/prompt-task-coordinator.js.map +1 -0
- package/dist/prompt-task.d.ts +11 -0
- package/dist/prompt-task.d.ts.map +1 -0
- package/dist/prompt-task.js +2 -0
- package/dist/prompt-task.js.map +1 -0
- package/dist/server-context.d.ts +22 -0
- package/dist/server-context.d.ts.map +1 -0
- package/dist/server-context.js +2 -0
- package/dist/server-context.js.map +1 -0
- package/dist/server.d.ts +4 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -16
- package/dist/server.js.map +1 -1
- package/dist/stderr-log.d.ts +3 -0
- package/dist/stderr-log.d.ts.map +1 -0
- package/dist/stderr-log.js +11 -0
- package/dist/stderr-log.js.map +1 -0
- package/dist/types.d.ts +6 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -9
- package/dist/chat-message-handler.d.ts +0 -8
- package/dist/chat-message-handler.d.ts.map +0 -1
- package/dist/chat-message-handler.js +0 -17
- package/dist/chat-message-handler.js.map +0 -1
- package/dist/chat-output.d.ts +0 -6
- package/dist/chat-output.d.ts.map +0 -1
- package/dist/chat-output.js +0 -16
- package/dist/chat-output.js.map +0 -1
- package/dist/checker/check-prompt.d.ts +0 -10
- package/dist/checker/check-prompt.d.ts.map +0 -1
- package/dist/checker/check-prompt.js +0 -9
- package/dist/checker/check-prompt.js.map +0 -1
- package/dist/checker/prompt.d.ts +0 -21
- package/dist/checker/prompt.d.ts.map +0 -1
- package/dist/checker/prompt.js +0 -20
- package/dist/checker/prompt.js.map +0 -1
- package/dist/checker/query.d.ts +0 -5
- package/dist/checker/query.d.ts.map +0 -1
- package/dist/checker/query.js +0 -4
- package/dist/checker/query.js.map +0 -1
- package/dist/checker/request.d.ts +0 -13
- package/dist/checker/request.d.ts.map +0 -1
- package/dist/checker/request.js +0 -13
- package/dist/checker/request.js.map +0 -1
- package/dist/checker/session.d.ts +0 -34
- package/dist/checker/session.d.ts.map +0 -1
- package/dist/checker/session.js +0 -47
- package/dist/checker/session.js.map +0 -1
- package/dist/checker/tools.d.ts +0 -19
- package/dist/checker/tools.d.ts.map +0 -1
- package/dist/checker/tools.js +0 -18
- package/dist/checker/tools.js.map +0 -1
- package/dist/checker/workflow.d.ts +0 -8
- package/dist/checker/workflow.d.ts.map +0 -1
- package/dist/checker/workflow.js +0 -7
- package/dist/checker/workflow.js.map +0 -1
- package/dist/log.d.ts +0 -17
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -19
- package/dist/log.js.map +0 -1
- package/dist/message-dedupe.d.ts +0 -10
- package/dist/message-dedupe.d.ts.map +0 -1
- package/dist/message-dedupe.js +0 -31
- package/dist/message-dedupe.js.map +0 -1
- package/dist/prompt-mode-message-handler.d.ts +0 -13
- package/dist/prompt-mode-message-handler.d.ts.map +0 -1
- package/dist/prompt-mode-message-handler.js +0 -17
- package/dist/prompt-mode-message-handler.js.map +0 -1
- package/dist/prompt-rewrite.d.ts +0 -23
- package/dist/prompt-rewrite.d.ts.map +0 -1
- package/dist/prompt-rewrite.js +0 -59
- package/dist/prompt-rewrite.js.map +0 -1
- package/dist/prompt-runners/proposal-background.d.ts +0 -4
- package/dist/prompt-runners/proposal-background.d.ts.map +0 -1
- package/dist/prompt-runners/proposal-background.js +0 -7
- package/dist/prompt-runners/proposal-background.js.map +0 -1
- package/dist/session-filter.d.ts +0 -22
- package/dist/session-filter.d.ts.map +0 -1
- package/dist/session-filter.js +0 -25
- package/dist/session-filter.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
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
4
|
|
|
5
|
-
The checker uses OpenCode's configured model/auth by creating a temporary OpenCode session.
|
|
5
|
+
The checker uses OpenCode's configured model/auth by creating a temporary OpenCode session.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -11,28 +11,21 @@ The checker uses OpenCode's configured model/auth by creating a temporary OpenCo
|
|
|
11
11
|
- Polishes grammatically incorrect or unclear English prompts.
|
|
12
12
|
- Writes proposals to `~/opencode-english-prompt-polisher.md` by default.
|
|
13
13
|
- Optionally creates one Notion database entry per proposal.
|
|
14
|
-
- Skips its own internal checker prompts to avoid recursion.
|
|
15
14
|
- Deletes temporary checker sessions by default.
|
|
16
15
|
|
|
17
|
-
|
|
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/`.
|
|
16
|
+
Powered by [english-prompt-polisher](https://www.npmjs.com/package/english-prompt-polisher), with OpenCode-specific integration provided by this plugin.
|
|
22
17
|
|
|
23
18
|
## Install From npm
|
|
24
19
|
|
|
25
|
-
This repository depends on the npm package `english-prompt-polisher` for reusable prompt-polishing logic.
|
|
26
|
-
|
|
27
20
|
Add the plugin to your OpenCode config:
|
|
28
21
|
|
|
29
22
|
```jsonc
|
|
30
23
|
{
|
|
31
24
|
"$schema": "https://opencode.ai/config.json",
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
"opencode-english-prompt-polisher",
|
|
35
|
-
{
|
|
25
|
+
"plugins": [
|
|
26
|
+
{
|
|
27
|
+
"package": "opencode-english-prompt-polisher",
|
|
28
|
+
"options": {
|
|
36
29
|
"mode": "proposal",
|
|
37
30
|
"outputFile": "~/opencode-english-prompt-polisher.md",
|
|
38
31
|
"checker": {
|
|
@@ -46,23 +39,21 @@ Add the plugin to your OpenCode config:
|
|
|
46
39
|
"databaseId": "{env:ENGLISH_PROMPT_POLISHER_NOTION_DATABASE_ID}",
|
|
47
40
|
},
|
|
48
41
|
},
|
|
49
|
-
|
|
42
|
+
},
|
|
50
43
|
],
|
|
51
44
|
}
|
|
52
45
|
```
|
|
53
46
|
|
|
54
|
-
Restart OpenCode after changing config. OpenCode loads plugins only at startup.
|
|
55
|
-
|
|
56
47
|
## Options
|
|
57
48
|
|
|
58
49
|
| Option | Default | Description |
|
|
59
50
|
| ----------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
60
51
|
| `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
52
|
| `outputFile` | `~/opencode-english-prompt-polisher.md` | Markdown file that receives proposals. |
|
|
62
|
-
| `maxChars` |
|
|
53
|
+
| `maxChars` | unset (no limit) | Maximum prompt length in Unicode code points. Longer prompts are skipped in both modes. |
|
|
63
54
|
| `includeOriginal` | `true` | Include the original prompt in the Markdown output. |
|
|
64
55
|
| `checker.agent` | `general` | OpenCode agent used for the temporary checker session. |
|
|
65
|
-
| `checker.model` | `current` | Use the current
|
|
56
|
+
| `checker.model` | `current` | Use the current session model, or set `provider/model`. |
|
|
66
57
|
| `checker.deleteSession` | `true` | Delete temporary checker sessions after each check. |
|
|
67
58
|
| `notion.enabled` | `false` | Create Notion database entries. |
|
|
68
59
|
| `notion.token` | unset | Notion integration token. |
|
|
@@ -76,22 +67,23 @@ Set `mode` to `rewrite` when OpenCode should receive the polished prompt instead
|
|
|
76
67
|
```jsonc
|
|
77
68
|
{
|
|
78
69
|
"$schema": "https://opencode.ai/config.json",
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
"opencode-english-prompt-polisher",
|
|
82
|
-
{
|
|
70
|
+
"plugins": [
|
|
71
|
+
{
|
|
72
|
+
"package": "opencode-english-prompt-polisher",
|
|
73
|
+
"options": {
|
|
83
74
|
"mode": "rewrite",
|
|
84
75
|
"checker": {
|
|
85
76
|
"agent": "general",
|
|
86
77
|
"model": "current",
|
|
87
78
|
},
|
|
88
79
|
},
|
|
89
|
-
|
|
80
|
+
},
|
|
90
81
|
],
|
|
91
82
|
}
|
|
92
83
|
```
|
|
93
84
|
|
|
94
85
|
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.
|
|
86
|
+
Rewrite mode does not write Markdown or Notion proposals.
|
|
95
87
|
|
|
96
88
|
## Notion Setup
|
|
97
89
|
|
|
@@ -148,8 +140,7 @@ Create a plugin for OpenCode.
|
|
|
148
140
|
## Notes
|
|
149
141
|
|
|
150
142
|
- In `proposal` mode, the original user prompt is not modified or blocked.
|
|
151
|
-
- In `rewrite` mode, the
|
|
152
|
-
- Proposal output is written as supporting output for the user to review only in `proposal` mode.
|
|
143
|
+
- In `rewrite` mode, the polished prompt replaces the original text in session history and is sent to the model. File, agent, and skill attachments are preserved.
|
|
153
144
|
- If the checker or Notion write fails, the plugin logs a warning and lets the original prompt continue.
|
|
154
|
-
-
|
|
145
|
+
- In `proposal` mode, proposals can appear after OpenCode has already started responding.
|
|
155
146
|
- Because every prompt requires an extra OpenCode model call, this plugin can increase token usage.
|
package/dist/chat-input.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { ChatMessageInput } from 'english-prompt-polisher';
|
|
2
|
-
import type { OpenCodeMessageDedupeInput } from './message-dedupe.ts';
|
|
3
2
|
import type { OpenCodeChatMessageInput } from './types.ts';
|
|
4
3
|
export declare function toCoreChatMessageInput(input: OpenCodeChatMessageInput): ChatMessageInput;
|
|
5
|
-
export declare function toMessageDedupeInput(input: OpenCodeChatMessageInput, dedupeKey?: string): OpenCodeMessageDedupeInput;
|
|
6
4
|
//# sourceMappingURL=chat-input.d.ts.map
|
package/dist/chat-input.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,GAAG,gBAAgB,CAaxF"}
|
package/dist/chat-input.js
CHANGED
|
@@ -10,16 +10,4 @@ export function toCoreChatMessageInput(input) {
|
|
|
10
10
|
}
|
|
11
11
|
return result;
|
|
12
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
13
|
//# sourceMappingURL=chat-input.js.map
|
package/dist/chat-input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../src/chat-input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../src/chat-input.ts"],"names":[],"mappings":"AAIA,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"}
|
package/dist/checker/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createCheckerService, type CheckerContext, type CheckerService } from './service.ts';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/checker/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createCheckerService } from "./service.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAA4C,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OpenCodeContext } from '../server-context.ts';
|
|
2
|
+
import type { OpenCodeChatMessageInput, OpenCodeOptions } from '../types.ts';
|
|
3
|
+
export type CheckerModelResolverContext = {
|
|
4
|
+
model: Pick<OpenCodeContext['model'], 'default'>;
|
|
5
|
+
};
|
|
6
|
+
export type CheckerModelSourceSession = Pick<Awaited<ReturnType<OpenCodeContext['session']['get']>>, 'model' | 'location'>;
|
|
7
|
+
export type CheckerModelResolver = (session: CheckerModelSourceSession, signal: AbortSignal) => Promise<OpenCodeChatMessageInput['model']>;
|
|
8
|
+
export declare function createCheckerModelResolver(ctx: CheckerModelResolverContext, options: OpenCodeOptions): CheckerModelResolver;
|
|
9
|
+
//# sourceMappingURL=model-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/checker/model-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,MAAM,2BAA2B,GAAG;IACzC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC3C,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACtD,OAAO,GAAG,UAAU,CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAClC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,WAAW,KACf,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;AAEhD,wBAAgB,0BAA0B,CACzC,GAAG,EAAE,2BAA2B,EAChC,OAAO,EAAE,eAAe,GACtB,oBAAoB,CAuBtB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { checkerOptions } from "../options.js";
|
|
2
|
+
export function createCheckerModelResolver(ctx, options) {
|
|
3
|
+
return async (session, signal) => {
|
|
4
|
+
signal.throwIfAborted();
|
|
5
|
+
const configuredModel = checkerOptions(options).model;
|
|
6
|
+
let model = session.model === undefined
|
|
7
|
+
? undefined
|
|
8
|
+
: {
|
|
9
|
+
providerID: session.model.providerID,
|
|
10
|
+
modelID: session.model.id,
|
|
11
|
+
...(session.model.variant === undefined ? {} : { variant: session.model.variant }),
|
|
12
|
+
};
|
|
13
|
+
// Resolve only the source model; checker request policy selects any explicit override.
|
|
14
|
+
if (model === undefined && (configuredModel === undefined || configuredModel === 'current')) {
|
|
15
|
+
const defaultModel = (await ctx.model.default({ location: { directory: session.location.directory } }, { signal })).data;
|
|
16
|
+
model =
|
|
17
|
+
defaultModel === null ? undefined : { providerID: defaultModel.providerID, modelID: defaultModel.id };
|
|
18
|
+
}
|
|
19
|
+
signal.throwIfAborted();
|
|
20
|
+
return model;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/checker/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAkB/C,MAAM,UAAU,0BAA0B,CACzC,GAAgC,EAChC,OAAwB;IAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAA8C,EAAE;QAC5E,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,eAAe,GAA+C,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;QAClG,IAAI,KAAK,GACR,OAAO,CAAC,KAAK,KAAK,SAAS;YAC1B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACA,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACpC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;gBACzB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aAClF,CAAC;QACL,uFAAuF;QACvF,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,CAAC,EAAE,CAAC;YAC7F,MAAM,YAAY,GAAiF,CAClG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAC5F,CAAC,IAAI,CAAC;YACP,KAAK;gBACJ,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;QACxG,CAAC;QACD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;AACH,CAAC"}
|
package/dist/checker/policy.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type ChatMessageInput
|
|
2
|
-
import type { OpenCodeOptions } from '../types.ts';
|
|
1
|
+
import { type ChatMessageInput } from 'english-prompt-polisher';
|
|
2
|
+
import type { OpenCodeChatModel, OpenCodeOptions } from '../types.ts';
|
|
3
3
|
export declare const DEFAULT_CHECKER_AGENT: string;
|
|
4
4
|
export type CheckerRequestPolicy = {
|
|
5
5
|
agent: string;
|
|
6
|
-
model?:
|
|
6
|
+
model?: OpenCodeChatModel;
|
|
7
7
|
system: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function checkerRequestPolicy(input: ChatMessageInput, options: OpenCodeOptions): CheckerRequestPolicy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG5G,OAAO,KAAK,EAAE,iBAAiB,EAA0B,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9F,eAAO,MAAM,qBAAqB,EAAE,MAAkB,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,oBAAoB,CAO5G"}
|
package/dist/checker/policy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CHECKER_SYSTEM_PROMPT, resolveCheckerModel
|
|
1
|
+
import { CHECKER_SYSTEM_PROMPT, resolveCheckerModel } from 'english-prompt-polisher';
|
|
2
2
|
import { checkerOptions } from "../options.js";
|
|
3
3
|
export const DEFAULT_CHECKER_AGENT = 'general';
|
|
4
4
|
export function checkerRequestPolicy(input, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/checker/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAyB,MAAM,yBAAyB,CAAC;AAE5G,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,23 @@
|
|
|
1
|
+
import type { Plugin } from '@opencode/plugin';
|
|
2
|
+
import type { SessionGenerate } from '@opencode/plugin/promise/session';
|
|
3
|
+
import { type ChatMessageInput, type PolisherResult } from 'english-prompt-polisher';
|
|
4
|
+
import type { PendingWorkRegistration } from '../pending-work-tracker.ts';
|
|
5
|
+
import type { OpenCodeOptions } from '../types.ts';
|
|
6
|
+
export type CheckerContext = {
|
|
7
|
+
session: Pick<Plugin.Context['session'], 'generate' | 'remove'> & {
|
|
8
|
+
create: (...args: Parameters<Plugin.Context['session']['create']>) => Promise<{
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
location: {
|
|
13
|
+
directory: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export type CheckerService = {
|
|
17
|
+
check: (sourceLocation: {
|
|
18
|
+
directory: string;
|
|
19
|
+
}, input: ChatMessageInput, prompt: string, signal?: AbortSignal) => Promise<PolisherResult>;
|
|
20
|
+
handleGenerate: (event: SessionGenerate) => void;
|
|
21
|
+
};
|
|
22
|
+
export declare function createCheckerService(ctx: CheckerContext, options: OpenCodeOptions, registerPendingWork: PendingWorkRegistration['track']): CheckerService;
|
|
23
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/checker/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;QACjE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9F,CAAC;IACF,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,CACN,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACrC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,cAAc,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,eAAe,EACxB,mBAAmB,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACnD,cAAc,CAqDhB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { buildCheckerPrompt, parseCheckerResult, } from 'english-prompt-polisher';
|
|
2
|
+
import { checkerRequestPolicy } from "./policy.js";
|
|
3
|
+
import { withCheckerSession } from "./session-lifecycle.js";
|
|
4
|
+
import { checkerWorkflowPlan } from "./workflow-plan.js";
|
|
5
|
+
export function createCheckerService(ctx, options, registerPendingWork) {
|
|
6
|
+
const activeSessions = new Map();
|
|
7
|
+
async function check(sourceLocation, input, prompt, signal) {
|
|
8
|
+
const policy = checkerRequestPolicy(input, options);
|
|
9
|
+
const plan = checkerWorkflowPlan(input, options);
|
|
10
|
+
const result = await withCheckerSession({ session: ctx.session, registerPendingWork }, {
|
|
11
|
+
create: {
|
|
12
|
+
title: 'English prompt polish check',
|
|
13
|
+
parentID: plan.parentSessionID,
|
|
14
|
+
agent: policy.agent,
|
|
15
|
+
model: policy.model === undefined
|
|
16
|
+
? undefined
|
|
17
|
+
: {
|
|
18
|
+
providerID: policy.model.providerID,
|
|
19
|
+
id: policy.model.modelID,
|
|
20
|
+
...(policy.model.variant === undefined ? {} : { variant: policy.model.variant }),
|
|
21
|
+
},
|
|
22
|
+
location: { directory: sourceLocation.directory },
|
|
23
|
+
},
|
|
24
|
+
deleteSession: plan.deleteSession,
|
|
25
|
+
signal,
|
|
26
|
+
}, async (sessionID) => {
|
|
27
|
+
activeSessions.set(sessionID, policy);
|
|
28
|
+
try {
|
|
29
|
+
return await ctx.session.generate({ sessionID, prompt: buildCheckerPrompt(prompt) }, { signal });
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
activeSessions.delete(sessionID);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return parseCheckerResult([{ type: 'text', text: result.text }]);
|
|
36
|
+
}
|
|
37
|
+
function handleGenerate(event) {
|
|
38
|
+
const policy = activeSessions.get(event.sessionID);
|
|
39
|
+
if (policy === undefined) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
event.system = [{ type: 'text', text: policy.system }];
|
|
43
|
+
event.tools = {};
|
|
44
|
+
}
|
|
45
|
+
return { check, handleGenerate };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/checker/service.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,kBAAkB,EAClB,kBAAkB,GAGlB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oBAAoB,CAAC;AAmBnF,MAAM,UAAU,oBAAoB,CACnC,GAAmB,EACnB,OAAwB,EACxB,mBAAqD;IAErD,MAAM,cAAc,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEpE,KAAK,UAAU,KAAK,CACnB,cAAqC,EACrC,KAAuB,EACvB,MAAc,EACd,MAAoB;QAEpB,MAAM,MAAM,GAAyB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAwB,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,MAAM,GAA+D,MAAM,kBAAkB,CAClG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAC7C;YACC,MAAM,EAAE;gBACP,KAAK,EAAE,6BAA6B;gBACpC,QAAQ,EAAE,IAAI,CAAC,eAAe;gBAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EACJ,MAAM,CAAC,KAAK,KAAK,SAAS;oBACzB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC;wBACA,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;wBACnC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;wBACxB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;qBAChF;gBACJ,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE;aACjD;YACD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM;SACN,EACD,KAAK,EAAE,SAAS,EAAuE,EAAE;YACxF,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC;gBACJ,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAClG,CAAC;oBAAS,CAAC;gBACV,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACF,CAAC,CACD,CAAC;QACF,OAAO,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,cAAc,CAAC,KAAsB;QAC7C,MAAM,MAAM,GAAqC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO;QACR,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Plugin } from '@opencode/plugin';
|
|
2
|
+
import type { PendingWorkRegistration } from '../pending-work-tracker.ts';
|
|
3
|
+
type SessionClient = Pick<Plugin.Context['session'], 'remove'> & {
|
|
4
|
+
create: (...args: Parameters<Plugin.Context['session']['create']>) => Promise<{
|
|
5
|
+
id: string;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
type SessionLifecycleContext = {
|
|
9
|
+
session: SessionClient;
|
|
10
|
+
registerPendingWork: PendingWorkRegistration['track'];
|
|
11
|
+
};
|
|
12
|
+
type SessionRequest = {
|
|
13
|
+
create: Parameters<SessionClient['create']>[0];
|
|
14
|
+
deleteSession: boolean;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
};
|
|
17
|
+
export declare function withCheckerSession<T>(ctx: SessionLifecycleContext, request: SessionRequest, run: (sessionID: string) => Promise<T>): Promise<T>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=session-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/checker/session-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,KAAK,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,GAAG;IAChE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9F,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;CACtD,CAAC;AAEF,KAAK,cAAc,GAAG;IACrB,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,CAAC,EACzC,GAAG,EAAE,uBAAuB,EAC5B,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export async function withCheckerSession(ctx, request, run) {
|
|
2
|
+
request.signal?.throwIfAborted();
|
|
3
|
+
// Do not let cancellation hide an acquired ID: always receive it and enter cleanup.
|
|
4
|
+
const session = await ctx.session.create(request.create);
|
|
5
|
+
try {
|
|
6
|
+
request.signal?.throwIfAborted();
|
|
7
|
+
const result = await run(session.id);
|
|
8
|
+
request.signal?.throwIfAborted();
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
if (request.deleteSession) {
|
|
13
|
+
// Detach removal from the result, but include it in the bounded unload drain.
|
|
14
|
+
const removal = Promise.resolve()
|
|
15
|
+
.then(() => ctx.session.remove({ sessionID: session.id }))
|
|
16
|
+
.catch(() => {
|
|
17
|
+
// Neither synchronous throws nor async failures may mask the check outcome.
|
|
18
|
+
});
|
|
19
|
+
ctx.registerPendingWork(removal);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=session-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/checker/session-lifecycle.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,GAA4B,EAC5B,OAAuB,EACvB,GAAsC;IAEtC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,oFAAoF;IACpF,MAAM,OAAO,GAAmB,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,IAAI,CAAC;QACJ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAM,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IACf,CAAC;YAAS,CAAC;QACV,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,8EAA8E;YAC9E,MAAM,OAAO,GAAkB,OAAO,CAAC,OAAO,EAAE;iBAC9C,IAAI,CAAC,GAAkB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;iBACxE,KAAK,CAAC,GAAS,EAAE;gBACjB,4EAA4E;YAC7E,CAAC,CAAC,CAAC;YACJ,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Plugin } from '@opencode/plugin/effect';
|
|
2
|
+
import { Effect, type Scope } from 'effect';
|
|
3
|
+
import type { OpenCodeContext } from './server-context.ts';
|
|
4
|
+
export type EffectContext = {
|
|
5
|
+
options: Plugin.Context['options'];
|
|
6
|
+
location: {
|
|
7
|
+
directory: string;
|
|
8
|
+
};
|
|
9
|
+
model: Pick<Plugin.Context['model'], 'default'>;
|
|
10
|
+
session: Pick<Plugin.Context['session'], 'get' | 'create' | 'generate' | 'remove' | 'hook'>;
|
|
11
|
+
};
|
|
12
|
+
export declare const createEffectContext: (ctx: EffectContext) => Effect.Effect<OpenCodeContext, never, Scope.Scope>;
|
|
13
|
+
//# sourceMappingURL=effect-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-context.d.ts","sourceRoot":"","sources":["../src/effect-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAwB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;CAC5F,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CA0ExG,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Agent, Location, Model } from '@opencode/plugin/effect';
|
|
2
|
+
import { Session } from '@opencode/schema/session';
|
|
3
|
+
import { Effect, Schema } from 'effect';
|
|
4
|
+
// Only expose the operations used by the Promise-based prompt orchestration.
|
|
5
|
+
// Unlike the V2 Promise adapter, this bridge passes signals to the Effect runner.
|
|
6
|
+
export const createEffectContext = Effect.fn('createEffectContext')(function* (ctx) {
|
|
7
|
+
const runtime = yield* Effect.context();
|
|
8
|
+
const run = (effect, options) => {
|
|
9
|
+
// The runner can execute synchronous work before noticing a pre-aborted signal.
|
|
10
|
+
if (options?.signal?.aborted === true) {
|
|
11
|
+
const reason = options.signal.reason;
|
|
12
|
+
return Promise.reject(reason instanceof Error ? reason : new Error('OpenCode operation was cancelled', { cause: reason }));
|
|
13
|
+
}
|
|
14
|
+
return Effect.runPromiseWith(runtime)(effect, options);
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
options: ctx.options,
|
|
18
|
+
location: ctx.location,
|
|
19
|
+
model: {
|
|
20
|
+
default: (input, requestOptions) => run(ctx.model.default(input).pipe(Effect.map((result) => ({
|
|
21
|
+
data: result.data === undefined
|
|
22
|
+
? null
|
|
23
|
+
: { id: result.data.id, providerID: result.data.providerID },
|
|
24
|
+
}))), { signal: requestOptions?.signal }),
|
|
25
|
+
},
|
|
26
|
+
session: {
|
|
27
|
+
hook: async (name, callback, options) => {
|
|
28
|
+
const registration = await run(ctx.session.hook(name, (event) => Effect.promise((signal) => Promise.resolve(callback(event, signal))), options));
|
|
29
|
+
return { dispose: () => run(registration.dispose) };
|
|
30
|
+
},
|
|
31
|
+
get: (input, requestOptions) => run(ctx.session.get({ sessionID: Session.ID.make(input.sessionID) }), {
|
|
32
|
+
signal: requestOptions?.signal,
|
|
33
|
+
}),
|
|
34
|
+
create: (input, requestOptions) => run(ctx.session.create({
|
|
35
|
+
title: input?.title ?? undefined,
|
|
36
|
+
parentID: input?.parentID == null ? undefined : Session.ID.make(input.parentID),
|
|
37
|
+
agent: input?.agent == null ? undefined : Agent.ID.make(input.agent),
|
|
38
|
+
model: input?.model == null ? undefined : Schema.decodeUnknownSync(Model.Ref)(input.model),
|
|
39
|
+
location: input?.location == null
|
|
40
|
+
? undefined
|
|
41
|
+
: Schema.decodeUnknownSync(Location.PublicRef)(input.location),
|
|
42
|
+
}), { signal: requestOptions?.signal }),
|
|
43
|
+
generate: (input, requestOptions) => run(ctx.session.generate({ ...input, sessionID: Session.ID.make(input.sessionID) }), {
|
|
44
|
+
signal: requestOptions?.signal,
|
|
45
|
+
}),
|
|
46
|
+
remove: (input, requestOptions) => run(ctx.session.remove({ sessionID: Session.ID.make(input.sessionID) }), {
|
|
47
|
+
signal: requestOptions?.signal,
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=effect-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-context.js","sourceRoot":"","sources":["../src/effect-context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
server: ({ client, directory }: import("@opencode-ai/plugin").PluginInput, rawOptions?: import("@opencode-ai/plugin").PluginOptions) => Promise<import("@opencode-ai/plugin").Hooks>;
|
|
4
|
-
};
|
|
1
|
+
import { Plugin } from '@opencode/plugin/effect';
|
|
2
|
+
declare const _default: Plugin.Plugin<import("effect/Scope").Scope>;
|
|
5
3
|
export default _default;
|
|
6
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;;AAMjD,wBAQG"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Plugin } from '@opencode/plugin/effect';
|
|
2
|
+
import { Effect } from 'effect';
|
|
3
|
+
import { createEffectContext } from "./effect-context.js";
|
|
4
|
+
import { setup } from "./server.js";
|
|
5
|
+
export default Plugin.define({
|
|
3
6
|
id: 'opencode-english-prompt-polisher',
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
effect: (ctx) => Effect.gen(function* () {
|
|
8
|
+
const context = yield* createEffectContext(ctx);
|
|
9
|
+
const cleanup = yield* Effect.promise(() => setup(context));
|
|
10
|
+
yield* Effect.addFinalizer(() => Effect.promise(() => Promise.resolve(cleanup())));
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
6
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAwB,MAAM,aAAa,CAAC;AAE1D,eAAe,MAAM,CAAC,MAAM,CAAC;IAC5B,EAAE,EAAE,kCAAkC;IACtC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAoB,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,OAAO,GAAsC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/F,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC;CACH,CAAC,CAAC"}
|
package/dist/options.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import type { PluginOptions } from '@opencode
|
|
1
|
+
import type { PluginOptions } from '@opencode/plugin';
|
|
2
2
|
import type { OpenCodeOptions, PromptMode } from './types.ts';
|
|
3
3
|
export { checkerOptions } from './options/checker.ts';
|
|
4
4
|
export declare const DEFAULT_OUTPUT_FILE: string;
|
|
5
|
-
export declare function promptModeOption(value: unknown): PromptMode | undefined;
|
|
6
|
-
export declare function resolvePromptMode(options: Pick<OpenCodeOptions, 'mode'>): PromptMode;
|
|
7
5
|
export declare function normalizeOpenCodeOptions(rawOptions?: PluginOptions): OpenCodeOptions;
|
|
8
6
|
export declare function modeOption(options: OpenCodeOptions): PromptMode;
|
|
9
7
|
//# sourceMappingURL=options.d.ts.map
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,KAAK,EAA0B,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,mBAAmB,EAAE,MAAgD,CAAC;AAEnF,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,eAAe,CAwBpF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAE/D"}
|
package/dist/options.js
CHANGED
|
@@ -2,16 +2,11 @@ import { normalizeOptions } from 'english-prompt-polisher';
|
|
|
2
2
|
import { normalizeCheckerOptions } from "./options/checker.js";
|
|
3
3
|
export { checkerOptions } from "./options/checker.js";
|
|
4
4
|
export const DEFAULT_OUTPUT_FILE = '~/opencode-english-prompt-polisher.md';
|
|
5
|
-
export function promptModeOption(value) {
|
|
6
|
-
return value === 'proposal' || value === 'rewrite' ? value : undefined;
|
|
7
|
-
}
|
|
8
|
-
export function resolvePromptMode(options) {
|
|
9
|
-
return options.mode === 'rewrite' ? 'rewrite' : 'proposal';
|
|
10
|
-
}
|
|
11
5
|
export function normalizeOpenCodeOptions(rawOptions) {
|
|
12
|
-
const coreOptions = normalizeOptions(rawOptions, {
|
|
6
|
+
const coreOptions = normalizeOptions(rawOptions, {
|
|
7
|
+
outputFile: DEFAULT_OUTPUT_FILE,
|
|
8
|
+
});
|
|
13
9
|
const checker = normalizeCheckerOptions(rawOptions?.checker);
|
|
14
|
-
const mode = promptModeOption(rawOptions?.mode);
|
|
15
10
|
const options = { outputFile: coreOptions.outputFile ?? DEFAULT_OUTPUT_FILE };
|
|
16
11
|
if (coreOptions.maxChars !== undefined) {
|
|
17
12
|
options.maxChars = coreOptions.maxChars;
|
|
@@ -19,8 +14,8 @@ export function normalizeOpenCodeOptions(rawOptions) {
|
|
|
19
14
|
if (coreOptions.includeOriginal !== undefined) {
|
|
20
15
|
options.includeOriginal = coreOptions.includeOriginal;
|
|
21
16
|
}
|
|
22
|
-
if (mode !== undefined) {
|
|
23
|
-
options.mode = mode;
|
|
17
|
+
if (coreOptions.mode !== undefined) {
|
|
18
|
+
options.mode = coreOptions.mode;
|
|
24
19
|
}
|
|
25
20
|
if (checker !== undefined) {
|
|
26
21
|
options.checker = checker;
|
|
@@ -31,6 +26,6 @@ export function normalizeOpenCodeOptions(rawOptions) {
|
|
|
31
26
|
return options;
|
|
32
27
|
}
|
|
33
28
|
export function modeOption(options) {
|
|
34
|
-
return
|
|
29
|
+
return options.mode ?? 'proposal';
|
|
35
30
|
}
|
|
36
31
|
//# sourceMappingURL=options.js.map
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAW,uCAAuC,CAAC;AAEnF,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAW,uCAAuC,CAAC;AAEnF,MAAM,UAAU,wBAAwB,CAAC,UAA0B;IAClE,MAAM,WAAW,GAAsB,gBAAgB,CAAC,UAAU,EAAE;QACnE,UAAU,EAAE,mBAAmB;KAC/B,CAAC,CAAC;IACH,MAAM,OAAO,GAAuC,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjG,MAAM,OAAO,GAAoB,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAAC;IAE/F,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACzC,CAAC;IACD,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,CAAC,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC;IACvD,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAwB;IAClD,OAAO,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type PendingWorkRegistration = {
|
|
2
|
+
track: (task: Promise<void>) => void;
|
|
3
|
+
};
|
|
4
|
+
export type PendingWorkTracker = PendingWorkRegistration & {
|
|
5
|
+
drain: () => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
export declare function createPendingWorkTracker(): PendingWorkTracker;
|
|
8
|
+
//# sourceMappingURL=pending-work-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-work-tracker.d.ts","sourceRoot":"","sources":["../src/pending-work-tracker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG;IAC1D,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAIF,wBAAgB,wBAAwB,IAAI,kBAAkB,CA4C7D"}
|