@pfoundation/ocadvisor 26.9.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/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/ocAdvisor.d.ts +104 -0
- package/dist/ocAdvisor.d.ts.map +1 -0
- package/dist/ocAdvisor.js +1127 -0
- package/dist/ocAdvisor.js.map +1 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 P Foundation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# ocAdvisor
|
|
2
|
+
|
|
3
|
+
OpenCode V2 plugin: consult Claude Fable as a senior advisor with your full
|
|
4
|
+
session transcript (including parent sessions for subagents).
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
Requires OpenCode V2 with a configured connection for the advisor provider.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
opencode plugin add @pfoundation/ocadvisor
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This installs the latest release from npmjs.com. To pin a version:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
opencode plugin add @pfoundation/ocadvisor@26.9.0
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Manage the install with:
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
opencode plugin list # show installed plugins
|
|
24
|
+
opencode plugin update # update all outdated plugins
|
|
25
|
+
opencode plugin update @pfoundation/ocadvisor
|
|
26
|
+
opencode plugin remove @pfoundation/ocadvisor
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
After installing, upgrading, or removing the plugin, restart the background
|
|
30
|
+
service so the server loads the new code (`opencode service restart`).
|
|
31
|
+
Location eviction does not reload plugin files.
|
|
32
|
+
|
|
33
|
+
## Naming
|
|
34
|
+
|
|
35
|
+
The tool agents call is named `advisor`. Repo/file names (`ocAdvisor`),
|
|
36
|
+
the plugin id (`oc-advisor`), the metrics file
|
|
37
|
+
(`ocAdvisor-metrics.jsonl`), and the `OCADVISOR_*` environment variables
|
|
38
|
+
keep the old name for continuity; history counting, session discovery,
|
|
39
|
+
and the usage report accept both `advisor` and the pre-rename `ocAdvisor`.
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
The advisor model and limits are configurable. Defaults are unchanged:
|
|
44
|
+
`anthropic/claude-fable-5-1#max`, a 300 s generation timeout, and no
|
|
45
|
+
transcript cap.
|
|
46
|
+
|
|
47
|
+
| Option | Default | Meaning |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `model` | `claude-fable-5-1` | Model id, or a full `provider/model#variant` reference |
|
|
50
|
+
| `provider` | `anthropic` | Provider id (overrides the provider in `model`) |
|
|
51
|
+
| `variant` | `max` | Reasoning-effort variant; `null` or `"none"` pins no variant |
|
|
52
|
+
| `timeoutMs` | `300000` | Per-consultation generation timeout, in milliseconds |
|
|
53
|
+
| `maxTranscriptChars` | `0` | Cap on transcript size (`0` = unlimited); the most recent tail is kept |
|
|
54
|
+
|
|
55
|
+
Set them as plugin options in `opencode.json`. Because a plugin loaded from
|
|
56
|
+
the auto-discovered `plugin/` directory cannot receive options, list it
|
|
57
|
+
explicitly in the `plugins` array:
|
|
58
|
+
|
|
59
|
+
```jsonc
|
|
60
|
+
{
|
|
61
|
+
"plugins": [
|
|
62
|
+
{
|
|
63
|
+
"package": "@pfoundation/ocadvisor",
|
|
64
|
+
"options": { "model": "anthropic/claude-opus-5#max", "maxTranscriptChars": 120000 }
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Environment variables work for any install and take
|
|
71
|
+
lower precedence than plugin options: `OCADVISOR_MODEL` (accepts
|
|
72
|
+
`provider/model#variant`), `OCADVISOR_PROVIDER`, `OCADVISOR_VARIANT`,
|
|
73
|
+
`OCADVISOR_TIMEOUT_MS`, `OCADVISOR_MAX_TRANSCRIPT_CHARS`.
|
|
74
|
+
|
|
75
|
+
The "already the advisor model" skip is still keyed to Fable
|
|
76
|
+
(`anthropic/claude-fable-*`); if you point the advisor at a different model,
|
|
77
|
+
that self-consultation guard no longer matches it.
|
|
78
|
+
|
|
79
|
+
## Usage policy (what agents are told)
|
|
80
|
+
|
|
81
|
+
Use `advisor` selectively on substantial, non-trivial work. Straightforward
|
|
82
|
+
tasks normally need no consultation.
|
|
83
|
+
|
|
84
|
+
- Normally **at most one consultation per task**, at the point where a
|
|
85
|
+
second opinion has the most value — pick one stage, not all three:
|
|
86
|
+
|
|
87
|
+
| Situation | Mode / trigger |
|
|
88
|
+
|---|---|
|
|
89
|
+
| Consequential unresolved design decision | `plan` / `before_approach` |
|
|
90
|
+
| Blocker after two substantially different attempts | `debug` / `stuck` |
|
|
91
|
+
| High-risk change with a specific unresolved correctness concern | `review` / `pre_complete` |
|
|
92
|
+
|
|
93
|
+
Rules enforced by the tool description and an injected session instruction:
|
|
94
|
+
|
|
95
|
+
- Always pass a concrete `question` naming the decision or artifact.
|
|
96
|
+
- A second consultation requires material new evidence, a distinct
|
|
97
|
+
unresolved issue, or an explicit user request (`followup` trigger to
|
|
98
|
+
reconcile conflicts with primary-source evidence).
|
|
99
|
+
- Give the advice serious weight; a passing self-test alone is not
|
|
100
|
+
counter-evidence. Clear factual corrections do not need another
|
|
101
|
+
confirmation call.
|
|
102
|
+
- The tool is hidden in `anthropic/claude-fable-*` sessions (the current
|
|
103
|
+
model is already Fable); calls there return a disabled notice.
|
|
104
|
+
|
|
105
|
+
## How it works
|
|
106
|
+
|
|
107
|
+
- `src/index.ts` → `dist/index.js` is the published entrypoint (default
|
|
108
|
+
export). `src/ocAdvisor.ts` holds the plugin implementation: it registers
|
|
109
|
+
the `advisor` tool, injects a
|
|
110
|
+
short selective-use instruction into eligible sessions via the `context` hook,
|
|
111
|
+
and builds the transcript from the OpenCode SQLite database.
|
|
112
|
+
- The tool is registered as a direct tool (`options.codemode: false`).
|
|
113
|
+
OpenCode 2 otherwise exposes plugin tools only through the `execute` Code
|
|
114
|
+
Mode tool, whose tool log records each nested call's input but hides the
|
|
115
|
+
script output on success, so the advisor's answer never appeared in the
|
|
116
|
+
TUI. As a direct tool, the TUI's tool log shows the call's `mode`,
|
|
117
|
+
`trigger`, and `question` fields followed by `output:` with the answer.
|
|
118
|
+
Direct calls also avoid Code Mode's output-size truncation. The `context`
|
|
119
|
+
hook can only hide the tool (Fable sessions), never add one, and the
|
|
120
|
+
selective-use instruction is injected only when the tool is available to
|
|
121
|
+
the request.
|
|
122
|
+
- Before each consultation it checks OpenCode for support of the configured
|
|
123
|
+
advisor model: the provider is enabled (`catalog.provider.get`), the model
|
|
124
|
+
is available (`catalog.model.list`, configured variant when listed), and a
|
|
125
|
+
connection exists (`integration.connection.active`).
|
|
126
|
+
- Consultations run as transient generations on a dedicated, reusable
|
|
127
|
+
`advisor` session pinned to the configured model (default
|
|
128
|
+
`anthropic/claude-fable-5-1#max`) via `session.create` +
|
|
129
|
+
`session.switchModel` once, then `session.generate` per call. Transient
|
|
130
|
+
generations do not mutate session history, so the advisor session stays
|
|
131
|
+
empty while its stats attribute advisor spend. Title discovery also
|
|
132
|
+
accepts the pre-rename `ocAdvisor` session title.
|
|
133
|
+
- The generation timeout wraps only the model call, not the time a call
|
|
134
|
+
spends queued behind another consultation. Oversized transcripts are
|
|
135
|
+
capped to the configured `maxTranscriptChars` (keeping the recent tail)
|
|
136
|
+
because transcript size drives latency and can otherwise exhaust the
|
|
137
|
+
timeout.
|
|
138
|
+
Session instructions are folded into the prompt because the generation
|
|
139
|
+
APIs accept prompt text only.
|
|
140
|
+
- Why a pinned session instead of one-shot `POST /api/generate`? One-shot
|
|
141
|
+
generation returns 503 for Anthropic (OAuth credential not resolved on
|
|
142
|
+
that path) while the session path works. Revisit if that changes.
|
|
143
|
+
- Repeat control is advisory, not blocking: the plugin counts prior
|
|
144
|
+
consultations in the session chain and tells the advisor to focus on
|
|
145
|
+
what is new since then.
|
|
146
|
+
- Real failures (provider/model/connection issues, missing
|
|
147
|
+
transcript/session) throw so OpenCode records them as errors instead of
|
|
148
|
+
silent `completed` results. Fable skips still return the disabled notice.
|
|
149
|
+
|
|
150
|
+
## Metrics
|
|
151
|
+
|
|
152
|
+
Every invocation appends one JSON line to
|
|
153
|
+
`~/.local/share/opencode/ocAdvisor-metrics.jsonl` with timestamp, session,
|
|
154
|
+
caller model/agent, mode, trigger, outcome (`advisor_response`,
|
|
155
|
+
`skipped_fable`, `error`, `no_transcript`, `no_session`), error type
|
|
156
|
+
(`provider_unavailable`, `model_unavailable`, `auth`, …), latency,
|
|
157
|
+
transcript size, prior-consultation count, and transport (`via`).
|
|
158
|
+
Token usage is `null`: OpenCode generation returns text only.
|
|
159
|
+
Logging is best-effort and never breaks a call.
|
|
160
|
+
|
|
161
|
+
## Activation
|
|
162
|
+
|
|
163
|
+
The server loads plugin files once per process, so after installing or
|
|
164
|
+
updating the plugin restart the background service
|
|
165
|
+
(`opencode service restart`) or the old code keeps running. Location
|
|
166
|
+
eviction does not reload plugin files.
|
|
167
|
+
|
|
168
|
+
## Development
|
|
169
|
+
|
|
170
|
+
```sh
|
|
171
|
+
bun install # install dependencies (frozen lockfile in CI)
|
|
172
|
+
bun test # unit tests
|
|
173
|
+
bun run typecheck # typecheck (tsc --noEmit)
|
|
174
|
+
bun run build # compile dist/ (runs automatically on npm pack/publish)
|
|
175
|
+
bun run report # advisor usage over the last 30 days
|
|
176
|
+
bun src/usageReport.ts --days 7
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Evaluation
|
|
180
|
+
|
|
181
|
+
The report combines the metrics log with the session database and shows
|
|
182
|
+
invocation counts by outcome/mode/trigger plus eligibility coverage
|
|
183
|
+
(sessions with ≥10 non-Fable tool calls vs. sessions that consulted).
|
|
184
|
+
Re-run it after a few weeks of the new checkpoints to judge coverage and
|
|
185
|
+
whether advice is changing outcomes. The usage report is a maintainer tool
|
|
186
|
+
run from a source checkout; it is not shipped in the npm package.
|
|
187
|
+
|
|
188
|
+
## Versioning
|
|
189
|
+
|
|
190
|
+
Releases use calendar versioning (`YY.M.patch`, e.g. `26.9.0`). The Git tag
|
|
191
|
+
(`v26.9.0`) must match `package.json` exactly; tag pushes publish to npm.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
interface AdvisorConfig {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
variant: string | undefined;
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
maxTranscriptChars: number;
|
|
7
|
+
}
|
|
8
|
+
declare const DEFAULT_ADVISOR_CONFIG: AdvisorConfig;
|
|
9
|
+
declare function parseModelRef(ref: string): {
|
|
10
|
+
provider?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
variant?: string;
|
|
13
|
+
};
|
|
14
|
+
declare function resolveAdvisorConfig(options?: Record<string, unknown> | null, env?: Record<string, string | undefined>): AdvisorConfig;
|
|
15
|
+
declare const TOOL_DESCRIPTION = "Consult a senior advisor model with your full session transcript \u2014 including parent sessions for subagents \u2014 for high-quality analysis.\n\nUse advisor selectively on substantial, non-trivial work. Straightforward tasks normally need no consultation.\n\n- Normally make AT MOST ONE consultation per task, at the point where a second opinion has the most value: a consequential unresolved design decision (mode \"plan\"), a blocker after two substantially different attempts (mode \"debug\"), or a high-risk change with a specific unresolved correctness concern (mode \"review\"). Pick one stage, not all three.\n- mode \"general\": a second opinion that does not fit the above.\n\nRules:\n- Always pass a concrete \"question\" naming the decision or artifact under review.\n- A second consultation requires material new evidence, a distinct unresolved issue, or an explicit user request. Reconcile an advisor conflict with primary-source evidence via one \"followup\" call stating both sides.\n- Give the advice serious weight. A passing self-test alone is not counter-evidence; primary-source evidence (the file says X) is. Clear factual corrections do not need another confirmation call.\n\nArgs: \"mode\" (general, review, plan, debug), \"trigger\" (before_approach, stuck, pre_complete, followup, other), \"question\" (concrete question focusing the advisor).\n";
|
|
16
|
+
declare const CHECKPOINT_INSTRUCTION = "[advisor] Use advisor selectively on substantial work: normally 0-1 consultations per task, at most one unless material new evidence, a distinct unresolved issue, or an explicit user request. Consult for a consequential undecided design (mode \"plan\"), a blocker after 2+ different attempts (mode \"debug\"), or a high-risk change with a specific correctness concern (mode \"review\"). Always pass a concrete question.";
|
|
17
|
+
declare const ADVISOR_TRIGGERS: readonly ["before_approach", "stuck", "pre_complete", "followup", "other"];
|
|
18
|
+
type AdvisorTrigger = (typeof ADVISOR_TRIGGERS)[number];
|
|
19
|
+
type AdvisorOutcome = "advisor_response" | "skipped_fable" | "error" | "no_transcript" | "no_session";
|
|
20
|
+
interface V2PluginContext {
|
|
21
|
+
tool?: {
|
|
22
|
+
transform?: Function;
|
|
23
|
+
};
|
|
24
|
+
session?: {
|
|
25
|
+
hook?: Function;
|
|
26
|
+
create?: Function;
|
|
27
|
+
get?: Function;
|
|
28
|
+
list?: Function;
|
|
29
|
+
switchModel?: Function;
|
|
30
|
+
generate?: Function;
|
|
31
|
+
};
|
|
32
|
+
catalog?: {
|
|
33
|
+
provider?: {
|
|
34
|
+
get?: Function;
|
|
35
|
+
list?: Function;
|
|
36
|
+
};
|
|
37
|
+
model?: {
|
|
38
|
+
list?: Function;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
integration?: {
|
|
42
|
+
connection?: {
|
|
43
|
+
active?: Function;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
storage?: {
|
|
47
|
+
get?: Function;
|
|
48
|
+
set?: Function;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
declare function isFableModel(model: {
|
|
52
|
+
providerID?: string;
|
|
53
|
+
provider?: string;
|
|
54
|
+
id?: string;
|
|
55
|
+
modelID?: string;
|
|
56
|
+
} | null | undefined): boolean;
|
|
57
|
+
declare function inferTrigger(mode: string | undefined, trigger: string | undefined): AdvisorTrigger;
|
|
58
|
+
declare function classifyAdvisorError(message: string): string;
|
|
59
|
+
declare function isAdvisorToolName(name: unknown): boolean;
|
|
60
|
+
declare function buildAdvisorPrompt(systemPrompt: string, transcript: string, question: string | undefined, priorNote: string | null): string;
|
|
61
|
+
declare function unwrapData<T>(value: T | {
|
|
62
|
+
data: T;
|
|
63
|
+
} | null | undefined): T | null;
|
|
64
|
+
declare function extractGeneratedText(value: unknown): string | null;
|
|
65
|
+
declare function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T>;
|
|
66
|
+
interface CatalogModelRef {
|
|
67
|
+
providerID?: string;
|
|
68
|
+
id?: string;
|
|
69
|
+
modelID?: string;
|
|
70
|
+
enabled?: boolean;
|
|
71
|
+
status?: string;
|
|
72
|
+
variants?: Array<{
|
|
73
|
+
id?: string;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
declare function isProviderUsable(provider: {
|
|
77
|
+
activation?: string;
|
|
78
|
+
} | null | undefined): boolean;
|
|
79
|
+
declare function findAdvisorModel(models: CatalogModelRef[] | null | undefined, config?: AdvisorConfig): CatalogModelRef | null;
|
|
80
|
+
declare function resolveAdvisorVariant(model: CatalogModelRef | null | undefined, config?: AdvisorConfig): string | undefined;
|
|
81
|
+
declare function hasAdvisorConnection(connection: unknown): boolean;
|
|
82
|
+
type AdvisorSupport = {
|
|
83
|
+
supported: true;
|
|
84
|
+
variant: string | undefined;
|
|
85
|
+
} | {
|
|
86
|
+
supported: false;
|
|
87
|
+
reason: string;
|
|
88
|
+
};
|
|
89
|
+
declare function checkAdvisorSupport(runtime: V2PluginContext, config?: AdvisorConfig): Promise<AdvisorSupport>;
|
|
90
|
+
declare function resetAdvisorSessionCache(): void;
|
|
91
|
+
declare function ensureAdvisorSession(runtime: V2PluginContext, variant: string | undefined, config?: AdvisorConfig): Promise<string>;
|
|
92
|
+
export declare function setupOcAdvisorV2(ctx: V2PluginContext): Promise<(() => void) | void>;
|
|
93
|
+
declare const plugin: {
|
|
94
|
+
id: string;
|
|
95
|
+
setup: typeof setupOcAdvisorV2;
|
|
96
|
+
};
|
|
97
|
+
export declare const OcAdvisorPluginV2: {
|
|
98
|
+
id: string;
|
|
99
|
+
setup: typeof setupOcAdvisorV2;
|
|
100
|
+
};
|
|
101
|
+
export default plugin;
|
|
102
|
+
export { ADVISOR_TRIGGERS, CHECKPOINT_INSTRUCTION, DEFAULT_ADVISOR_CONFIG, TOOL_DESCRIPTION, buildAdvisorPrompt, checkAdvisorSupport, classifyAdvisorError, ensureAdvisorSession, extractGeneratedText, findAdvisorModel, hasAdvisorConnection, inferTrigger, isAdvisorToolName, isFableModel, isProviderUsable, parseModelRef, resolveAdvisorConfig, resolveAdvisorVariant, resetAdvisorSessionCache, unwrapData, withTimeout, };
|
|
103
|
+
export type { AdvisorConfig, AdvisorOutcome, AdvisorTrigger, V2PluginContext };
|
|
104
|
+
//# sourceMappingURL=ocAdvisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocAdvisor.d.ts","sourceRoot":"","sources":["../src/ocAdvisor.ts"],"names":[],"mappings":"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"}
|