@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 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.
@@ -0,0 +1,2 @@
1
+ export { default } from "./ocAdvisor.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { default } from "./ocAdvisor.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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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"}