@pfoundation/ocadvisor 26.9.1 → 26.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +388 -46
  2. package/dist/artificialAnalysis.d.ts +4 -0
  3. package/dist/artificialAnalysis.d.ts.map +1 -0
  4. package/dist/artificialAnalysis.js +77 -0
  5. package/dist/artificialAnalysis.js.map +1 -0
  6. package/dist/benchmarkConfig.d.ts +19 -0
  7. package/dist/benchmarkConfig.d.ts.map +1 -0
  8. package/dist/benchmarkConfig.js +58 -0
  9. package/dist/benchmarkConfig.js.map +1 -0
  10. package/dist/benchmarkEvidence.d.ts +37 -0
  11. package/dist/benchmarkEvidence.d.ts.map +1 -0
  12. package/dist/benchmarkEvidence.js +81 -0
  13. package/dist/benchmarkEvidence.js.map +1 -0
  14. package/dist/benchmarkMatch.d.ts +57 -0
  15. package/dist/benchmarkMatch.d.ts.map +1 -0
  16. package/dist/benchmarkMatch.js +236 -0
  17. package/dist/benchmarkMatch.js.map +1 -0
  18. package/dist/benchmarkStore.d.ts +44 -0
  19. package/dist/benchmarkStore.d.ts.map +1 -0
  20. package/dist/benchmarkStore.js +308 -0
  21. package/dist/benchmarkStore.js.map +1 -0
  22. package/dist/benchmarkTypes.d.ts +48 -0
  23. package/dist/benchmarkTypes.d.ts.map +1 -0
  24. package/dist/benchmarkTypes.js +298 -0
  25. package/dist/benchmarkTypes.js.map +1 -0
  26. package/dist/benchmarkUpdate.d.ts +33 -0
  27. package/dist/benchmarkUpdate.d.ts.map +1 -0
  28. package/dist/benchmarkUpdate.js +327 -0
  29. package/dist/benchmarkUpdate.js.map +1 -0
  30. package/dist/cli.d.ts +13 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +377 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/data/artificialAnalysis.mappings.json +197 -0
  35. package/dist/data/artificialAnalysis.snapshot.json +17684 -0
  36. package/dist/modelProfiles.d.ts +45 -0
  37. package/dist/modelProfiles.d.ts.map +1 -0
  38. package/dist/modelProfiles.js +141 -0
  39. package/dist/modelProfiles.js.map +1 -0
  40. package/dist/ocAdvisor.d.ts +105 -5
  41. package/dist/ocAdvisor.d.ts.map +1 -1
  42. package/dist/ocAdvisor.js +502 -44
  43. package/dist/ocAdvisor.js.map +1 -1
  44. package/dist/typesafeGate.d.ts +89 -0
  45. package/dist/typesafeGate.d.ts.map +1 -0
  46. package/dist/typesafeGate.js +463 -0
  47. package/dist/typesafeGate.js.map +1 -0
  48. package/dist/typesafeState.d.ts +94 -0
  49. package/dist/typesafeState.d.ts.map +1 -0
  50. package/dist/typesafeState.js +301 -0
  51. package/dist/typesafeState.js.map +1 -0
  52. package/package.json +8 -2
@@ -0,0 +1,301 @@
1
+ export const TYPESAFE_DEFAULTS = {
2
+ timeoutMs: 3000,
3
+ skipBelow: 0.2,
4
+ minEffortConfidence: 0.6,
5
+ maxStateBytes: 16384,
6
+ efforts: ["high", "xhigh", "max"],
7
+ };
8
+ function parseBoundedPositiveInt(value, name) {
9
+ const parsed = typeof value === "number"
10
+ ? value
11
+ : typeof value === "string" && value.trim()
12
+ ? Number(value)
13
+ : NaN;
14
+ if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {
15
+ return { error: `typesafe.${name} must be a positive integer` };
16
+ }
17
+ return parsed;
18
+ }
19
+ function parseClosedProbability(value, name) {
20
+ const parsed = typeof value === "number" ? value : Number(value);
21
+ if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
22
+ return { error: `typesafe.${name} must be a number between 0 and 1` };
23
+ }
24
+ return parsed;
25
+ }
26
+ // Normalizes the `typesafe` plugin option. `true`/`null`/omitted mean
27
+ // "enabled with defaults"; `false` is a complete bypass; an object enables
28
+ // the gate and validates its overrides. Invalid explicit values return a
29
+ // validation error instead of silently enabling a different policy.
30
+ export function normalizeTypeSafeOptions(value) {
31
+ if (value === undefined || value === null || value === true) {
32
+ return { disabled: false, overrides: {} };
33
+ }
34
+ if (value === false)
35
+ return { disabled: true };
36
+ if (typeof value !== "object" || Array.isArray(value)) {
37
+ return { error: "typesafe must be true, false, or an options object" };
38
+ }
39
+ const raw = value;
40
+ const overrides = {};
41
+ if (raw.model !== undefined) {
42
+ if (typeof raw.model !== "string" || !raw.model.trim()) {
43
+ return { error: "typesafe.model must be a non-empty string" };
44
+ }
45
+ overrides.model = raw.model.trim();
46
+ }
47
+ for (const key of ["timeoutMs", "maxStateBytes"]) {
48
+ if (raw[key] === undefined)
49
+ continue;
50
+ const parsed = parseBoundedPositiveInt(raw[key], key);
51
+ if (typeof parsed === "object")
52
+ return parsed;
53
+ overrides[key] = parsed;
54
+ }
55
+ for (const key of ["skipBelow", "minEffortConfidence"]) {
56
+ if (raw[key] === undefined)
57
+ continue;
58
+ const parsed = parseClosedProbability(raw[key], key);
59
+ if (typeof parsed === "object")
60
+ return parsed;
61
+ overrides[key] = parsed;
62
+ }
63
+ if (raw.efforts !== undefined) {
64
+ const list = Array.isArray(raw.efforts)
65
+ ? raw.efforts
66
+ : typeof raw.efforts === "string" && raw.efforts.trim()
67
+ ? raw.efforts.split(",")
68
+ : null;
69
+ if (!list) {
70
+ return { error: "typesafe.efforts must be an array of effort names" };
71
+ }
72
+ const seen = new Set();
73
+ for (const entry of list) {
74
+ if (typeof entry !== "string" || !entry.trim()) {
75
+ return {
76
+ error: "typesafe.efforts must contain non-empty effort names",
77
+ };
78
+ }
79
+ seen.add(entry.trim());
80
+ }
81
+ overrides.efforts = [...seen];
82
+ }
83
+ return { disabled: false, overrides };
84
+ }
85
+ export function resolveTypeSafeSettings(source) {
86
+ if (source.disabled)
87
+ return { ...TYPESAFE_DEFAULTS };
88
+ return { ...TYPESAFE_DEFAULTS, ...source.overrides };
89
+ }
90
+ // `TYPESAFE_API_KEY` (whitespace-only counts as absent) is the SDK's own
91
+ // environment variable. Bypass means no client construction and no network
92
+ // request; a missing key alone never disables the advisor itself.
93
+ export function resolveTypeSafeConfig(source, env = process.env) {
94
+ const key = env.TYPESAFE_API_KEY;
95
+ const keyPresent = typeof key === "string" && key.trim().length > 0;
96
+ if (!source || source.disabled || !keyPresent) {
97
+ // No key means no client and no request; settings stay unconstructed.
98
+ return { enabled: false, settings: null, keyPresent };
99
+ }
100
+ return {
101
+ enabled: true,
102
+ settings: resolveTypeSafeSettings(source),
103
+ keyPresent,
104
+ };
105
+ }
106
+ export const TYPE_SAFE_ENV_KEY = "TYPESAFE_API_KEY";
107
+ const MAX_CHAIN_DEPTH = 10;
108
+ const MAX_MESSAGE_CHARS = 4000;
109
+ // Assembles the decision state shell without reading any session records;
110
+ // the builder below fills `context` from the session chain. Exported so the
111
+ // evaluation and tests can construct representative state directly.
112
+ export function makeDecisionState(options) {
113
+ return {
114
+ request: {
115
+ question: options.question ?? null,
116
+ mode: options.mode,
117
+ trigger: options.trigger,
118
+ explicitEffort: options.explicitEffort ?? null,
119
+ caller: options.caller ?? null,
120
+ directory: options.directory ?? null,
121
+ },
122
+ user: { latestRequest: null },
123
+ context: { messages: [], latestUserIncluded: false },
124
+ history: {
125
+ priorConsultations: options.priorConsultations,
126
+ priorModes: options.priorModes,
127
+ repeatedQuestion: isRepeatedQuestion(options.question ?? null, options.priorQuestions ?? []),
128
+ },
129
+ availability: {
130
+ supportedEfforts: [...options.supportedEfforts],
131
+ defaultEffort: options.defaultEffort ?? null,
132
+ },
133
+ models: options.models ?? null,
134
+ benchmarks: options.benchmarks ?? null,
135
+ coverage: {
136
+ truncated: false,
137
+ droppedMessages: 0,
138
+ includedMessages: 0,
139
+ totalMessages: 0,
140
+ stateBytes: 0,
141
+ maxStateBytes: options.maxStateBytes ?? 0,
142
+ benchmarksOmitted: false,
143
+ },
144
+ };
145
+ }
146
+ function getChainRow(db, sessionId) {
147
+ try {
148
+ return db
149
+ .query("SELECT id, parent_id, title FROM session_v2 WHERE id = ?")
150
+ .get(sessionId);
151
+ }
152
+ catch {
153
+ // Legacy databases without session_v2 have no chain to read.
154
+ return null;
155
+ }
156
+ }
157
+ // Collects the session and its parents (oldest first) within the same chain
158
+ // cap the advisor transcript uses.
159
+ function collectChain(db, sessionId) {
160
+ const chain = [];
161
+ const visited = new Set();
162
+ let current = sessionId;
163
+ while (current && !visited.has(current) && chain.length < MAX_CHAIN_DEPTH) {
164
+ visited.add(current);
165
+ const row = getChainRow(db, current);
166
+ if (!row)
167
+ break;
168
+ chain.push(row);
169
+ current = row.parent_id;
170
+ }
171
+ return chain.reverse();
172
+ }
173
+ function readChainMessages(db, chain) {
174
+ const out = [];
175
+ for (const session of chain) {
176
+ let rows = [];
177
+ try {
178
+ rows = db
179
+ .query("SELECT type, data FROM session_message WHERE session_id = ? ORDER BY seq ASC LIMIT 400")
180
+ .all(session.id);
181
+ }
182
+ catch {
183
+ rows = [];
184
+ }
185
+ for (const row of rows) {
186
+ try {
187
+ out.push({ type: row.type, data: JSON.parse(row.data) });
188
+ }
189
+ catch { }
190
+ }
191
+ }
192
+ return out;
193
+ }
194
+ function messageText(entry, formatMessage) {
195
+ const formatted = formatMessage(entry.type, entry.data);
196
+ if (!formatted)
197
+ return null;
198
+ return formatted.length > MAX_MESSAGE_CHARS
199
+ ? formatted.slice(-MAX_MESSAGE_CHARS)
200
+ : formatted;
201
+ }
202
+ function latestUserRequest(entries) {
203
+ for (let i = entries.length - 1; i >= 0; i--) {
204
+ const entry = entries[i];
205
+ if (entry.type !== "user")
206
+ continue;
207
+ const text = typeof entry.data.text === "string" ? entry.data.text : "";
208
+ if (text.trim())
209
+ return text.slice(-MAX_MESSAGE_CHARS);
210
+ }
211
+ return null;
212
+ }
213
+ function byteLength(value) {
214
+ return Buffer.byteLength(JSON.stringify(value), "utf8");
215
+ }
216
+ // Repeats are only flagged when the current question covers the same ground
217
+ // as a previous one; the gate treats this as context, never as a quota.
218
+ function isRepeatedQuestion(question, priorQuestions) {
219
+ if (!question)
220
+ return false;
221
+ const normalize = (text) => text.toLowerCase().replace(/\s+/g, " ").trim();
222
+ const target = normalize(question);
223
+ if (!target)
224
+ return false;
225
+ return priorQuestions.some((prior) => {
226
+ const candidate = normalize(prior);
227
+ if (!candidate)
228
+ return false;
229
+ return (candidate === target ||
230
+ candidate.includes(target) ||
231
+ target.includes(candidate));
232
+ });
233
+ }
234
+ export function buildDecisionState(db, sessionId, options) {
235
+ const chain = collectChain(db, sessionId);
236
+ const entries = chain.length > 0 ? readChainMessages(db, chain) : [];
237
+ const latestRequest = latestUserRequest(entries);
238
+ const base = makeDecisionState({ ...options, formatMessage: undefined });
239
+ base.user.latestRequest = latestRequest;
240
+ base.context.latestUserIncluded = latestRequest !== null;
241
+ base.coverage.totalMessages = entries.length;
242
+ const maxBytes = options.maxStateBytes ?? Infinity;
243
+ // Verbose benchmark detail yields before task context: score comparisons
244
+ // drop first (identities and match coverage stay), then the whole
245
+ // benchmark block with an explicit omission flag.
246
+ if (base.benchmarks && byteLength(base) > maxBytes) {
247
+ base.benchmarks = { ...base.benchmarks, comparisons: [], omitted: true };
248
+ }
249
+ if (base.benchmarks && byteLength(base) > maxBytes) {
250
+ base.benchmarks = null;
251
+ base.coverage.benchmarksOmitted = true;
252
+ }
253
+ if (!options.formatMessage)
254
+ return base;
255
+ const rendered = entries.map((entry) => messageText(entry, options.formatMessage ?? (() => null)));
256
+ // The latest user request is the intent under review; keep it even when
257
+ // older context must be dropped.
258
+ let latestUserIndex = -1;
259
+ for (let i = entries.length - 1; i >= 0; i--) {
260
+ if (entries[i].type === "user" && rendered[i]) {
261
+ latestUserIndex = i;
262
+ break;
263
+ }
264
+ }
265
+ // Walk backwards from the newest message, stopping at the first message
266
+ // that no longer fits so kept context stays contiguous. The budget counts
267
+ // the serialized state, so the measured value is what the gate sends.
268
+ let dropped = 0;
269
+ const keptIndices = [];
270
+ let blocked = false;
271
+ for (let i = rendered.length - 1; i >= 0; i--) {
272
+ const text = rendered[i];
273
+ if (!text)
274
+ continue;
275
+ if (i === latestUserIndex)
276
+ continue;
277
+ const candidate = [text, ...keptIndices.map((index) => rendered[index])];
278
+ const probe = {
279
+ ...base,
280
+ context: { ...base.context, messages: candidate },
281
+ };
282
+ if (blocked || byteLength(probe) > maxBytes) {
283
+ blocked = true;
284
+ dropped++;
285
+ continue;
286
+ }
287
+ keptIndices.unshift(i);
288
+ }
289
+ const withLatest = latestUserIndex >= 0 ? [latestUserIndex, ...keptIndices] : keptIndices;
290
+ withLatest.sort((a, b) => a - b);
291
+ const kept = withLatest.map((index) => rendered[index]);
292
+ base.context.messages = kept;
293
+ base.context.latestUserIncluded =
294
+ latestUserIndex >= 0 && keptIndices.concat(latestUserIndex).length > 0;
295
+ base.coverage.includedMessages = kept.length;
296
+ base.coverage.droppedMessages = dropped;
297
+ base.coverage.truncated = dropped > 0;
298
+ base.coverage.stateBytes = byteLength(base);
299
+ return base;
300
+ }
301
+ //# sourceMappingURL=typesafeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typesafeState.js","sourceRoot":"","sources":["../src/typesafeState.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pfoundation/ocadvisor",
3
- "version": "26.9.1",
3
+ "version": "26.9.2",
4
4
  "description": "OpenCode V2 plugin: consult Claude Fable 5.1 as senior advisor via OpenCode session generation",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,6 +23,9 @@
23
23
  ],
24
24
  "main": "./dist/index.js",
25
25
  "types": "./dist/index.d.ts",
26
+ "bin": {
27
+ "ocadvisor": "./dist/cli.js"
28
+ },
26
29
  "exports": {
27
30
  ".": {
28
31
  "types": "./dist/index.d.ts",
@@ -44,7 +47,7 @@
44
47
  "scripts": {
45
48
  "test": "bun test",
46
49
  "typecheck": "tsc --noEmit",
47
- "build": "tsc -p tsconfig.build.json",
50
+ "build": "tsc -p tsconfig.build.json && bun scripts/copyBenchmarkData.ts && chmod +x dist/cli.js",
48
51
  "prepack": "bun run build",
49
52
  "prepublishOnly": "bun test && bun run typecheck",
50
53
  "report": "bun src/usageReport.ts --days 30"
@@ -52,5 +55,8 @@
52
55
  "devDependencies": {
53
56
  "bun-types": "^1.4.2",
54
57
  "typescript": "^5.7.2"
58
+ },
59
+ "dependencies": {
60
+ "@typesafe-ai/sdk": "^0.6.0"
55
61
  }
56
62
  }