polymath-society 0.2.19 → 0.2.21
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/dist/cli.js +24620 -22073
- package/dist/engine/chat-loops.js +8 -1
- package/dist/engine/exp-allfacets.js +8 -1
- package/dist/engine/exp-person.js +8 -1
- package/dist/engine/exp-pipeline.js +8 -1
- package/dist/engine/ingest-export.js +7 -6
- package/dist/engine/peak-demos.js +8 -1
- package/dist/engine/person-dimension-summary.js +8 -1
- package/dist/engine/person-facet-lines.js +8 -1
- package/dist/engine/person-headline.js +8 -1
- package/dist/engine/person-report.js +8 -1
- package/dist/engine/person-self-image.js +8 -1
- package/dist/engine/public-report.js +15 -7
- package/dist/engine/run-analysis.js +8 -1
- package/dist/engine/run-tagger.js +8 -1
- package/dist/index.js +19600 -17706
- package/dist/pipeline/FOCUS-EXAMPLES.md +127 -0
- package/dist/pipeline/FOCUS-RUBRIC.md +418 -0
- package/dist/pipeline/coding-agglomerate.js +947 -79
- package/dist/pipeline/coding-aggregate.js +443 -23
- package/dist/pipeline/coding-build.js +569 -97
- package/dist/pipeline/coding-coaching.js +651 -101
- package/dist/pipeline/coding-day-digest.js +417 -36
- package/dist/pipeline/coding-delegation.js +564 -68
- package/dist/pipeline/coding-expertise.js +477 -59
- package/dist/pipeline/coding-flow.js +424 -15
- package/dist/pipeline/coding-focus.js +507 -51
- package/dist/pipeline/coding-frontier-detail.js +465 -47
- package/dist/pipeline/coding-frontier.js +7 -6
- package/dist/pipeline/coding-gap-dist.js +424 -15
- package/dist/pipeline/coding-gap.js +679 -128
- package/dist/pipeline/coding-grade.js +469 -42
- package/dist/pipeline/coding-growth.js +17041 -0
- package/dist/pipeline/coding-nutshell.js +168 -151
- package/dist/pipeline/coding-projects.js +7 -6
- package/dist/pipeline/coding-walkthrough.js +461 -37
- package/dist/pipeline/coding-workbrief.js +16387 -0
- package/dist/web/app.js +2095 -1396
- package/dist/web/styles.css +1 -1
- package/package.json +1 -1
|
@@ -134,7 +134,7 @@ var require_secure_json_parse = __commonJS({
|
|
|
134
134
|
});
|
|
135
135
|
|
|
136
136
|
// ../../scripts/coding-frontier-detail.mts
|
|
137
|
-
import { promises as
|
|
137
|
+
import { promises as fs8 } from "fs";
|
|
138
138
|
|
|
139
139
|
// ../../lib/agents/shared/agent.ts
|
|
140
140
|
import { readFileSync } from "fs";
|
|
@@ -502,6 +502,13 @@ ${report}`);
|
|
|
502
502
|
}
|
|
503
503
|
|
|
504
504
|
// ../../lib/agents/shared/codexAdapter.ts
|
|
505
|
+
var CODEX_DEFAULT_MODEL = "gpt-5.5";
|
|
506
|
+
var CODEX_MINI_MODEL = "gpt-5.4-mini";
|
|
507
|
+
function mapCodexTier(model, env = process.env) {
|
|
508
|
+
if (model && !/^(claude|haiku|sonnet|opus)/i.test(model)) return model;
|
|
509
|
+
if (model && /^haiku/i.test(model)) return env.POLYMATH_CODEX_MODEL_MINI || CODEX_MINI_MODEL;
|
|
510
|
+
return env.POLYMATH_CODEX_MODEL || CODEX_DEFAULT_MODEL;
|
|
511
|
+
}
|
|
505
512
|
function composePrompt(inv, roots) {
|
|
506
513
|
return [
|
|
507
514
|
inv.systemPrompt ? `<system>
|
|
@@ -542,7 +549,7 @@ var codexAdapter = {
|
|
|
542
549
|
"read-only",
|
|
543
550
|
"--json"
|
|
544
551
|
];
|
|
545
|
-
|
|
552
|
+
args.push("--model", mapCodexTier(inv.model));
|
|
546
553
|
args.push(composePrompt(inv, roots));
|
|
547
554
|
const started = Date.now();
|
|
548
555
|
const toolCalls = [];
|
|
@@ -2170,8 +2177,8 @@ function getErrorMap() {
|
|
|
2170
2177
|
|
|
2171
2178
|
// ../../node_modules/zod/v3/helpers/parseUtil.js
|
|
2172
2179
|
var makeIssue = (params) => {
|
|
2173
|
-
const { data, path:
|
|
2174
|
-
const fullPath = [...
|
|
2180
|
+
const { data, path: path12, errorMaps, issueData } = params;
|
|
2181
|
+
const fullPath = [...path12, ...issueData.path || []];
|
|
2175
2182
|
const fullIssue = {
|
|
2176
2183
|
...issueData,
|
|
2177
2184
|
path: fullPath
|
|
@@ -2287,11 +2294,11 @@ var errorUtil;
|
|
|
2287
2294
|
|
|
2288
2295
|
// ../../node_modules/zod/v3/types.js
|
|
2289
2296
|
var ParseInputLazyPath = class {
|
|
2290
|
-
constructor(parent, value,
|
|
2297
|
+
constructor(parent, value, path12, key) {
|
|
2291
2298
|
this._cachedPath = [];
|
|
2292
2299
|
this.parent = parent;
|
|
2293
2300
|
this.data = value;
|
|
2294
|
-
this._path =
|
|
2301
|
+
this._path = path12;
|
|
2295
2302
|
this._key = key;
|
|
2296
2303
|
}
|
|
2297
2304
|
get path() {
|
|
@@ -15078,39 +15085,39 @@ function createOpenAI(options = {}) {
|
|
|
15078
15085
|
});
|
|
15079
15086
|
const createChatModel = (modelId, settings = {}) => new OpenAIChatLanguageModel(modelId, settings, {
|
|
15080
15087
|
provider: `${providerName}.chat`,
|
|
15081
|
-
url: ({ path:
|
|
15088
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15082
15089
|
headers: getHeaders,
|
|
15083
15090
|
compatibility,
|
|
15084
15091
|
fetch: options.fetch
|
|
15085
15092
|
});
|
|
15086
15093
|
const createCompletionModel = (modelId, settings = {}) => new OpenAICompletionLanguageModel(modelId, settings, {
|
|
15087
15094
|
provider: `${providerName}.completion`,
|
|
15088
|
-
url: ({ path:
|
|
15095
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15089
15096
|
headers: getHeaders,
|
|
15090
15097
|
compatibility,
|
|
15091
15098
|
fetch: options.fetch
|
|
15092
15099
|
});
|
|
15093
15100
|
const createEmbeddingModel = (modelId, settings = {}) => new OpenAIEmbeddingModel(modelId, settings, {
|
|
15094
15101
|
provider: `${providerName}.embedding`,
|
|
15095
|
-
url: ({ path:
|
|
15102
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15096
15103
|
headers: getHeaders,
|
|
15097
15104
|
fetch: options.fetch
|
|
15098
15105
|
});
|
|
15099
15106
|
const createImageModel = (modelId, settings = {}) => new OpenAIImageModel(modelId, settings, {
|
|
15100
15107
|
provider: `${providerName}.image`,
|
|
15101
|
-
url: ({ path:
|
|
15108
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15102
15109
|
headers: getHeaders,
|
|
15103
15110
|
fetch: options.fetch
|
|
15104
15111
|
});
|
|
15105
15112
|
const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel(modelId, {
|
|
15106
15113
|
provider: `${providerName}.transcription`,
|
|
15107
|
-
url: ({ path:
|
|
15114
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15108
15115
|
headers: getHeaders,
|
|
15109
15116
|
fetch: options.fetch
|
|
15110
15117
|
});
|
|
15111
15118
|
const createSpeechModel = (modelId) => new OpenAISpeechModel(modelId, {
|
|
15112
15119
|
provider: `${providerName}.speech`,
|
|
15113
|
-
url: ({ path:
|
|
15120
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15114
15121
|
headers: getHeaders,
|
|
15115
15122
|
fetch: options.fetch
|
|
15116
15123
|
});
|
|
@@ -15131,7 +15138,7 @@ function createOpenAI(options = {}) {
|
|
|
15131
15138
|
const createResponsesModel = (modelId) => {
|
|
15132
15139
|
return new OpenAIResponsesLanguageModel(modelId, {
|
|
15133
15140
|
provider: `${providerName}.responses`,
|
|
15134
|
-
url: ({ path:
|
|
15141
|
+
url: ({ path: path12 }) => `${baseURL}${path12}`,
|
|
15135
15142
|
headers: getHeaders,
|
|
15136
15143
|
fetch: options.fetch
|
|
15137
15144
|
});
|
|
@@ -15628,19 +15635,391 @@ function invokeAgent(inv, opts = {}) {
|
|
|
15628
15635
|
}
|
|
15629
15636
|
|
|
15630
15637
|
// ../../lib/agents/coding/docsDir.ts
|
|
15631
|
-
import { promises as
|
|
15632
|
-
import
|
|
15638
|
+
import { promises as fs6 } from "fs";
|
|
15639
|
+
import path10 from "path";
|
|
15633
15640
|
|
|
15634
15641
|
// ../../lib/agents/coding/materialize.ts
|
|
15635
|
-
import { promises as
|
|
15642
|
+
import { promises as fs5 } from "fs";
|
|
15636
15643
|
|
|
15637
15644
|
// ../coding-core/dist/injected.js
|
|
15645
|
+
var SYSTEM_REMINDER_RE = /<system-reminder>[\s\S]*?<\/system-reminder>/g;
|
|
15638
15646
|
function isHarnessEntry(e) {
|
|
15639
15647
|
return e.isMeta === true || e.isCompactSummary === true;
|
|
15640
15648
|
}
|
|
15641
15649
|
|
|
15650
|
+
// ../coding-core/dist/codex.js
|
|
15651
|
+
var SYSTEM_REMINDER_RE2 = /<system-reminder>[\s\S]*?<\/system-reminder>/g;
|
|
15652
|
+
var CODEX_INJECTED_TEXT_RE = /^\s*(<(environment_context|user_instructions|ENVIRONMENT_CONTEXT|turn_aborted)\b|#\s*AGENTS\.md instructions\b)/;
|
|
15653
|
+
function isCodexInjectedUserText(text2) {
|
|
15654
|
+
return CODEX_INJECTED_TEXT_RE.test(text2);
|
|
15655
|
+
}
|
|
15656
|
+
function codexContentText(content) {
|
|
15657
|
+
if (typeof content === "string")
|
|
15658
|
+
return content;
|
|
15659
|
+
if (!Array.isArray(content))
|
|
15660
|
+
return "";
|
|
15661
|
+
const parts = [];
|
|
15662
|
+
for (const item of content) {
|
|
15663
|
+
if (typeof item === "string") {
|
|
15664
|
+
parts.push(item);
|
|
15665
|
+
continue;
|
|
15666
|
+
}
|
|
15667
|
+
if (item && typeof item === "object") {
|
|
15668
|
+
const it = item;
|
|
15669
|
+
if (it.type === "input_text" || it.type === "output_text" || it.type === "text")
|
|
15670
|
+
parts.push(it.text || "");
|
|
15671
|
+
}
|
|
15672
|
+
}
|
|
15673
|
+
return parts.join("\n");
|
|
15674
|
+
}
|
|
15675
|
+
function sniffCodexRaw(raw) {
|
|
15676
|
+
let checked = 0;
|
|
15677
|
+
for (const lineRaw of raw.split("\n")) {
|
|
15678
|
+
const line = lineRaw.trim();
|
|
15679
|
+
if (!line)
|
|
15680
|
+
continue;
|
|
15681
|
+
if (checked++ >= 5)
|
|
15682
|
+
break;
|
|
15683
|
+
try {
|
|
15684
|
+
const e = JSON.parse(line);
|
|
15685
|
+
if (e.type === "session_meta" || e.type === "response_item" || e.type === "turn_context")
|
|
15686
|
+
return true;
|
|
15687
|
+
if (e.type === "user" || e.type === "assistant" || e.type === "summary" || e.type === "queue-operation")
|
|
15688
|
+
return false;
|
|
15689
|
+
} catch {
|
|
15690
|
+
}
|
|
15691
|
+
}
|
|
15692
|
+
return false;
|
|
15693
|
+
}
|
|
15694
|
+
var EXIT_CODE_RE = /(?:Process exited with code|Exit code:)\s+(\d+)/;
|
|
15695
|
+
function extractCodexEvents(raw) {
|
|
15696
|
+
const out = [];
|
|
15697
|
+
for (const lineRaw of raw.split("\n")) {
|
|
15698
|
+
const line = lineRaw.trim();
|
|
15699
|
+
if (!line)
|
|
15700
|
+
continue;
|
|
15701
|
+
let e;
|
|
15702
|
+
try {
|
|
15703
|
+
e = JSON.parse(line);
|
|
15704
|
+
} catch {
|
|
15705
|
+
continue;
|
|
15706
|
+
}
|
|
15707
|
+
if (e.type !== "response_item")
|
|
15708
|
+
continue;
|
|
15709
|
+
const p = e.payload ?? {};
|
|
15710
|
+
const t = typeof e.timestamp === "string" ? Date.parse(e.timestamp) : NaN;
|
|
15711
|
+
const ptype = p.type;
|
|
15712
|
+
if (ptype === "message") {
|
|
15713
|
+
const role = p.role;
|
|
15714
|
+
const text2 = codexContentText(p.content).replace(SYSTEM_REMINDER_RE2, "").trim();
|
|
15715
|
+
if (!text2)
|
|
15716
|
+
continue;
|
|
15717
|
+
if (role === "user") {
|
|
15718
|
+
if (isCodexInjectedUserText(text2))
|
|
15719
|
+
continue;
|
|
15720
|
+
out.push({ kind: "user", t, text: text2 });
|
|
15721
|
+
} else if (role === "assistant") {
|
|
15722
|
+
out.push({ kind: "assistant", t, text: text2 });
|
|
15723
|
+
}
|
|
15724
|
+
continue;
|
|
15725
|
+
}
|
|
15726
|
+
if (ptype === "function_call" || ptype === "custom_tool_call" || ptype === "local_shell_call") {
|
|
15727
|
+
const name17 = typeof p.name === "string" && p.name ? p.name : ptype === "local_shell_call" ? "shell" : String(ptype);
|
|
15728
|
+
const input = typeof p.arguments === "string" ? p.arguments : typeof p.input === "string" ? p.input : "";
|
|
15729
|
+
out.push({ kind: "tool", t, name: name17, input });
|
|
15730
|
+
continue;
|
|
15731
|
+
}
|
|
15732
|
+
if (ptype === "function_call_output" || ptype === "custom_tool_call_output") {
|
|
15733
|
+
const output = typeof p.output === "string" ? p.output : "";
|
|
15734
|
+
const m = EXIT_CODE_RE.exec(output.slice(0, 200));
|
|
15735
|
+
out.push({ kind: "tool_output", t, output, isError: !!m && m[1] !== "0" });
|
|
15736
|
+
}
|
|
15737
|
+
}
|
|
15738
|
+
return out;
|
|
15739
|
+
}
|
|
15740
|
+
|
|
15741
|
+
// ../coding-core/dist/cursor.js
|
|
15742
|
+
import { promises as fs4 } from "fs";
|
|
15743
|
+
var NODE_SQLITE = "node:sqlite";
|
|
15744
|
+
async function openCursorSqlite(dbPath) {
|
|
15745
|
+
try {
|
|
15746
|
+
await fs4.access(dbPath);
|
|
15747
|
+
} catch {
|
|
15748
|
+
return null;
|
|
15749
|
+
}
|
|
15750
|
+
let mod;
|
|
15751
|
+
try {
|
|
15752
|
+
mod = await import(NODE_SQLITE);
|
|
15753
|
+
} catch {
|
|
15754
|
+
return null;
|
|
15755
|
+
}
|
|
15756
|
+
const DatabaseSync = mod?.DatabaseSync;
|
|
15757
|
+
if (!DatabaseSync)
|
|
15758
|
+
return null;
|
|
15759
|
+
let db;
|
|
15760
|
+
try {
|
|
15761
|
+
db = new DatabaseSync(dbPath, { readOnly: true });
|
|
15762
|
+
} catch {
|
|
15763
|
+
try {
|
|
15764
|
+
db = new DatabaseSync(dbPath);
|
|
15765
|
+
} catch {
|
|
15766
|
+
return null;
|
|
15767
|
+
}
|
|
15768
|
+
}
|
|
15769
|
+
const asText = (v) => v == null ? null : typeof v === "string" ? v : Buffer.from(v).toString("utf-8");
|
|
15770
|
+
return {
|
|
15771
|
+
prefix(prefix) {
|
|
15772
|
+
try {
|
|
15773
|
+
const rows = db.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE ? ESCAPE '\\'").all(likePrefix(prefix));
|
|
15774
|
+
return rows.map((r) => ({ key: r.key, value: asText(r.value) ?? "" }));
|
|
15775
|
+
} catch {
|
|
15776
|
+
return [];
|
|
15777
|
+
}
|
|
15778
|
+
},
|
|
15779
|
+
get(key) {
|
|
15780
|
+
try {
|
|
15781
|
+
const row = db.prepare("SELECT value FROM cursorDiskKV WHERE key = ?").get(key);
|
|
15782
|
+
return row ? asText(row.value) : null;
|
|
15783
|
+
} catch {
|
|
15784
|
+
return null;
|
|
15785
|
+
}
|
|
15786
|
+
},
|
|
15787
|
+
close() {
|
|
15788
|
+
try {
|
|
15789
|
+
db.close();
|
|
15790
|
+
} catch {
|
|
15791
|
+
}
|
|
15792
|
+
}
|
|
15793
|
+
};
|
|
15794
|
+
}
|
|
15795
|
+
function likePrefix(prefix) {
|
|
15796
|
+
return prefix.replace(/[\\%_]/g, (c) => "\\" + c) + "%";
|
|
15797
|
+
}
|
|
15798
|
+
var CURSOR_USER_QUERY_RE = /<user_query>\s*([\s\S]*?)\s*<\/user_query>/;
|
|
15799
|
+
function cleanUserText(raw) {
|
|
15800
|
+
let t = raw.replace(SYSTEM_REMINDER_RE, "");
|
|
15801
|
+
const m = t.match(CURSOR_USER_QUERY_RE);
|
|
15802
|
+
if (m)
|
|
15803
|
+
t = m[1];
|
|
15804
|
+
return t.trim();
|
|
15805
|
+
}
|
|
15806
|
+
var msFrom = (v) => {
|
|
15807
|
+
if (typeof v === "number" && Number.isFinite(v))
|
|
15808
|
+
return v;
|
|
15809
|
+
if (typeof v === "string") {
|
|
15810
|
+
const n = Date.parse(v);
|
|
15811
|
+
return Number.isFinite(n) ? n : null;
|
|
15812
|
+
}
|
|
15813
|
+
return null;
|
|
15814
|
+
};
|
|
15815
|
+
function readCursorComposer(db, composerId) {
|
|
15816
|
+
const cdRaw = db.get(`composerData:${composerId}`);
|
|
15817
|
+
if (!cdRaw)
|
|
15818
|
+
return null;
|
|
15819
|
+
let cd;
|
|
15820
|
+
try {
|
|
15821
|
+
cd = JSON.parse(cdRaw);
|
|
15822
|
+
} catch {
|
|
15823
|
+
return null;
|
|
15824
|
+
}
|
|
15825
|
+
const headers = Array.isArray(cd.fullConversationHeadersOnly) ? cd.fullConversationHeadersOnly : [];
|
|
15826
|
+
if (headers.length === 0)
|
|
15827
|
+
return null;
|
|
15828
|
+
const bubbles = /* @__PURE__ */ new Map();
|
|
15829
|
+
for (const row of db.prefix(`bubbleId:${composerId}:`)) {
|
|
15830
|
+
const bid = row.key.slice(`bubbleId:${composerId}:`.length);
|
|
15831
|
+
try {
|
|
15832
|
+
bubbles.set(bid, JSON.parse(row.value));
|
|
15833
|
+
} catch {
|
|
15834
|
+
}
|
|
15835
|
+
}
|
|
15836
|
+
const turns = [];
|
|
15837
|
+
let clock = msFrom(cd.createdAt) ?? 0;
|
|
15838
|
+
for (const h of headers) {
|
|
15839
|
+
const b = bubbles.get(h.bubbleId);
|
|
15840
|
+
if (!b)
|
|
15841
|
+
continue;
|
|
15842
|
+
const type = h.type === 1 ? 1 : 2;
|
|
15843
|
+
const tool2 = type === 2 && b.toolFormerData && typeof b.toolFormerData.name === "string" ? b.toolFormerData.name : null;
|
|
15844
|
+
const rawText = typeof b.text === "string" ? b.text : "";
|
|
15845
|
+
const text2 = type === 1 ? cleanUserText(rawText) : rawText.replace(SYSTEM_REMINDER_RE, "").trim();
|
|
15846
|
+
if (!text2 && !tool2)
|
|
15847
|
+
continue;
|
|
15848
|
+
const t = msFrom(b.createdAt);
|
|
15849
|
+
clock = Math.max(clock, t ?? clock + 1);
|
|
15850
|
+
const model = b.modelInfo && typeof b.modelInfo.modelName === "string" ? b.modelInfo.modelName : null;
|
|
15851
|
+
turns.push({ t: clock, type, text: text2, tool: tool2, model });
|
|
15852
|
+
}
|
|
15853
|
+
if (turns.length === 0)
|
|
15854
|
+
return null;
|
|
15855
|
+
const gitRepo = Array.isArray(cd.trackedGitRepos) && cd.trackedGitRepos[0] && typeof cd.trackedGitRepos[0].repoPath === "string" ? cd.trackedGitRepos[0].repoPath : null;
|
|
15856
|
+
return {
|
|
15857
|
+
composerId,
|
|
15858
|
+
createdAt: msFrom(cd.createdAt),
|
|
15859
|
+
updatedAt: msFrom(cd.lastUpdatedAt),
|
|
15860
|
+
name: typeof cd.name === "string" && cd.name.trim() ? cd.name.trim() : null,
|
|
15861
|
+
gitRepo,
|
|
15862
|
+
turns
|
|
15863
|
+
};
|
|
15864
|
+
}
|
|
15865
|
+
function sniffCursorRaw(raw) {
|
|
15866
|
+
for (const lineRaw of raw.split("\n")) {
|
|
15867
|
+
const line = lineRaw.trim();
|
|
15868
|
+
if (!line)
|
|
15869
|
+
continue;
|
|
15870
|
+
try {
|
|
15871
|
+
const e = JSON.parse(line);
|
|
15872
|
+
return (e.role === "user" || e.role === "assistant") && typeof e.message === "object" && e.message !== null && "content" in e.message && !("type" in e);
|
|
15873
|
+
} catch {
|
|
15874
|
+
return false;
|
|
15875
|
+
}
|
|
15876
|
+
}
|
|
15877
|
+
return false;
|
|
15878
|
+
}
|
|
15879
|
+
function jsonlText(content) {
|
|
15880
|
+
const parts = [];
|
|
15881
|
+
const tools = [];
|
|
15882
|
+
if (Array.isArray(content)) {
|
|
15883
|
+
for (const item of content) {
|
|
15884
|
+
if (!item || typeof item !== "object")
|
|
15885
|
+
continue;
|
|
15886
|
+
const it = item;
|
|
15887
|
+
if (it.type === "text" && it.text)
|
|
15888
|
+
parts.push(it.text);
|
|
15889
|
+
else if (it.type === "tool_use" && it.name)
|
|
15890
|
+
tools.push(it.name);
|
|
15891
|
+
}
|
|
15892
|
+
} else if (typeof content === "string")
|
|
15893
|
+
parts.push(content);
|
|
15894
|
+
return { text: parts.join("\n"), tools };
|
|
15895
|
+
}
|
|
15896
|
+
function parseCursorJsonl(raw, base) {
|
|
15897
|
+
const turns = [];
|
|
15898
|
+
let clock = base;
|
|
15899
|
+
for (const lineRaw of raw.split("\n")) {
|
|
15900
|
+
const line = lineRaw.trim();
|
|
15901
|
+
if (!line)
|
|
15902
|
+
continue;
|
|
15903
|
+
let e;
|
|
15904
|
+
try {
|
|
15905
|
+
e = JSON.parse(line);
|
|
15906
|
+
} catch {
|
|
15907
|
+
continue;
|
|
15908
|
+
}
|
|
15909
|
+
if (e.role !== "user" && e.role !== "assistant")
|
|
15910
|
+
continue;
|
|
15911
|
+
const { text: rawText, tools } = jsonlText(e.message?.content);
|
|
15912
|
+
const type = e.role === "user" ? 1 : 2;
|
|
15913
|
+
const text2 = type === 1 ? cleanUserText(rawText) : rawText.replace(SYSTEM_REMINDER_RE, "").trim();
|
|
15914
|
+
if (type === 2 && tools.length) {
|
|
15915
|
+
for (const tool2 of tools) {
|
|
15916
|
+
clock += 1;
|
|
15917
|
+
turns.push({ t: clock, type: 2, text: "", tool: tool2, model: null });
|
|
15918
|
+
}
|
|
15919
|
+
}
|
|
15920
|
+
if (!text2)
|
|
15921
|
+
continue;
|
|
15922
|
+
clock += 1;
|
|
15923
|
+
turns.push({ t: clock, type, text: text2, tool: null, model: null });
|
|
15924
|
+
}
|
|
15925
|
+
if (turns.length === 0)
|
|
15926
|
+
return null;
|
|
15927
|
+
return { composerId: "", createdAt: base, updatedAt: clock, name: null, gitRepo: null, turns };
|
|
15928
|
+
}
|
|
15929
|
+
var AI_GIST = 500;
|
|
15930
|
+
function renderCursorTranscript(c) {
|
|
15931
|
+
const lines = [];
|
|
15932
|
+
let humanTurns = 0, humanChars = 0;
|
|
15933
|
+
let aiProse = "";
|
|
15934
|
+
const aiTools = /* @__PURE__ */ new Map();
|
|
15935
|
+
const flushAI = () => {
|
|
15936
|
+
if (!aiProse && aiTools.size === 0)
|
|
15937
|
+
return;
|
|
15938
|
+
const tools = [...aiTools.entries()].map(([n, k]) => k > 1 ? `${n}\xD7${k}` : n).join(", ");
|
|
15939
|
+
const gist = aiProse ? aiProse.length > AI_GIST ? aiProse.slice(0, AI_GIST) + "\u2026" : aiProse : "";
|
|
15940
|
+
const bits = [];
|
|
15941
|
+
if (gist)
|
|
15942
|
+
bits.push(gist);
|
|
15943
|
+
if (tools)
|
|
15944
|
+
bits.push(`ran ${tools}`);
|
|
15945
|
+
lines.push(`[AI: ${bits.join(" \xB7 ")}]`);
|
|
15946
|
+
aiProse = "";
|
|
15947
|
+
aiTools.clear();
|
|
15948
|
+
};
|
|
15949
|
+
for (const turn of c.turns) {
|
|
15950
|
+
if (turn.type === 1) {
|
|
15951
|
+
flushAI();
|
|
15952
|
+
humanTurns++;
|
|
15953
|
+
humanChars += turn.text.length;
|
|
15954
|
+
lines.push(`>> ${turn.text}`);
|
|
15955
|
+
} else {
|
|
15956
|
+
if (turn.tool)
|
|
15957
|
+
aiTools.set(turn.tool, (aiTools.get(turn.tool) ?? 0) + 1);
|
|
15958
|
+
if (turn.text)
|
|
15959
|
+
aiProse = turn.text.replace(/\s+/g, " ").trim();
|
|
15960
|
+
}
|
|
15961
|
+
}
|
|
15962
|
+
flushAI();
|
|
15963
|
+
return { text: lines.join("\n"), humanTurns, humanChars };
|
|
15964
|
+
}
|
|
15965
|
+
function composerIdFromFile(file2) {
|
|
15966
|
+
const m = file2.match(/agent-transcripts\/([^/]+)\/[^/]+\.jsonl$/);
|
|
15967
|
+
return m ? m[1] : null;
|
|
15968
|
+
}
|
|
15969
|
+
async function loadCursorComposer(file2, raw, dbPath) {
|
|
15970
|
+
const cid = composerIdFromFile(file2);
|
|
15971
|
+
if (cid && dbPath) {
|
|
15972
|
+
const db = await openCursorSqlite(dbPath);
|
|
15973
|
+
if (db) {
|
|
15974
|
+
try {
|
|
15975
|
+
const c = readCursorComposer(db, cid);
|
|
15976
|
+
if (c)
|
|
15977
|
+
return c;
|
|
15978
|
+
} finally {
|
|
15979
|
+
db.close();
|
|
15980
|
+
}
|
|
15981
|
+
}
|
|
15982
|
+
}
|
|
15983
|
+
return parseCursorJsonl(raw, 0);
|
|
15984
|
+
}
|
|
15985
|
+
|
|
15986
|
+
// ../coding-core/dist/raw.js
|
|
15987
|
+
import path9 from "path";
|
|
15988
|
+
import os2 from "os";
|
|
15989
|
+
var SOURCE_ROOT_ENV_VARS = [
|
|
15990
|
+
"CLAUDE_PROJECTS_DIR",
|
|
15991
|
+
"CODEX_SESSIONS_DIR",
|
|
15992
|
+
"CURSOR_WORKSPACE_DIR",
|
|
15993
|
+
"CURSOR_PROJECTS_DIR",
|
|
15994
|
+
// Cursor's globalStorage dir (holds state.vscdb — the composer bubbles that
|
|
15995
|
+
// carry a Cursor session's real per-turn timestamps + content). Same
|
|
15996
|
+
// isolation contract: overriding any root disables every unset source.
|
|
15997
|
+
"CURSOR_GLOBAL_DIR"
|
|
15998
|
+
];
|
|
15999
|
+
var anyRootOverridden = () => SOURCE_ROOT_ENV_VARS.some((v) => !!process.env[v]);
|
|
16000
|
+
function resolveSourceRoot(envVar, ...defaultSegments) {
|
|
16001
|
+
const explicit = process.env[envVar];
|
|
16002
|
+
if (explicit)
|
|
16003
|
+
return explicit;
|
|
16004
|
+
if (anyRootOverridden())
|
|
16005
|
+
return null;
|
|
16006
|
+
return path9.join(os2.homedir(), ...defaultSegments);
|
|
16007
|
+
}
|
|
16008
|
+
var cursorGlobalRoot = () => resolveSourceRoot("CURSOR_GLOBAL_DIR", "Library", "Application Support", "Cursor", "User", "globalStorage");
|
|
16009
|
+
function cursorGlobalDbPath() {
|
|
16010
|
+
const root = cursorGlobalRoot();
|
|
16011
|
+
return root === null ? null : path9.join(root, "state.vscdb");
|
|
16012
|
+
}
|
|
16013
|
+
var MACHINE_CURSOR_FILE_RE = /^(.*[/\\]machines[/\\][^/\\]+[/\\]\.cursor)[/\\]projects[/\\]/;
|
|
16014
|
+
function cursorDbPathForFile(file2) {
|
|
16015
|
+
const m = file2.match(MACHINE_CURSOR_FILE_RE);
|
|
16016
|
+
if (m)
|
|
16017
|
+
return path9.join(m[1], "globalStorage", "state.vscdb");
|
|
16018
|
+
return cursorGlobalDbPath();
|
|
16019
|
+
}
|
|
16020
|
+
|
|
15642
16021
|
// ../../lib/agents/coding/materialize.ts
|
|
15643
|
-
var
|
|
16022
|
+
var SYSTEM_REMINDER_RE3 = /<system-reminder>[\s\S]*?<\/system-reminder>/g;
|
|
15644
16023
|
var INJECT_GIST = 120;
|
|
15645
16024
|
var INJECTED = [
|
|
15646
16025
|
{ re: /<task-notification>[\s\S]*?<\/task-notification>/g, label: "bg task", gistRe: /<summary>([\s\S]*?)<\/summary>/ },
|
|
@@ -15660,7 +16039,7 @@ function collapseInjected(input) {
|
|
|
15660
16039
|
return "";
|
|
15661
16040
|
});
|
|
15662
16041
|
}
|
|
15663
|
-
return { text: text2.replace(
|
|
16042
|
+
return { text: text2.replace(SYSTEM_REMINDER_RE3, "").trim(), markers };
|
|
15664
16043
|
}
|
|
15665
16044
|
function extractText(content) {
|
|
15666
16045
|
if (typeof content === "string") return content;
|
|
@@ -15676,14 +16055,52 @@ function extractText(content) {
|
|
|
15676
16055
|
function isToolResultOnly(content) {
|
|
15677
16056
|
return Array.isArray(content) && content.length > 0 && content.every((c) => c && typeof c === "object" && c.type === "tool_result");
|
|
15678
16057
|
}
|
|
15679
|
-
var
|
|
16058
|
+
var AI_GIST2 = 160;
|
|
16059
|
+
function materializeCodex(raw) {
|
|
16060
|
+
const lines = [];
|
|
16061
|
+
let humanTurns = 0, humanChars = 0;
|
|
16062
|
+
let aiLastProse = "";
|
|
16063
|
+
const aiTools = /* @__PURE__ */ new Map();
|
|
16064
|
+
const flushAI = () => {
|
|
16065
|
+
if (!aiLastProse && aiTools.size === 0) return;
|
|
16066
|
+
const tools = [...aiTools.entries()].map(([n, c]) => c > 1 ? `${n}\xD7${c}` : n).join(", ");
|
|
16067
|
+
const gist = aiLastProse ? aiLastProse.length > AI_GIST2 ? aiLastProse.slice(0, AI_GIST2) + "\u2026" : aiLastProse : "";
|
|
16068
|
+
const bits = [];
|
|
16069
|
+
if (gist) bits.push(gist);
|
|
16070
|
+
if (tools) bits.push(`ran ${tools}`);
|
|
16071
|
+
lines.push(`[AI: ${bits.join(" \xB7 ")}]`);
|
|
16072
|
+
aiLastProse = "";
|
|
16073
|
+
aiTools.clear();
|
|
16074
|
+
};
|
|
16075
|
+
for (const ev of extractCodexEvents(raw)) {
|
|
16076
|
+
if (ev.kind === "user") {
|
|
16077
|
+
flushAI();
|
|
16078
|
+
humanTurns++;
|
|
16079
|
+
humanChars += ev.text.length;
|
|
16080
|
+
lines.push(`>> ${ev.text}`);
|
|
16081
|
+
} else if (ev.kind === "assistant") {
|
|
16082
|
+
const prose = ev.text.replace(/\s+/g, " ").trim();
|
|
16083
|
+
if (prose) aiLastProse = prose;
|
|
16084
|
+
} else if (ev.kind === "tool") {
|
|
16085
|
+
aiTools.set(ev.name, (aiTools.get(ev.name) ?? 0) + 1);
|
|
16086
|
+
}
|
|
16087
|
+
}
|
|
16088
|
+
flushAI();
|
|
16089
|
+
return { text: lines.join("\n"), humanTurns, humanChars };
|
|
16090
|
+
}
|
|
16091
|
+
async function materializeCursor(file2, raw) {
|
|
16092
|
+
const composer = await loadCursorComposer(file2, raw, cursorDbPathForFile(file2));
|
|
16093
|
+
return composer ? renderCursorTranscript(composer) : { text: "", humanTurns: 0, humanChars: 0 };
|
|
16094
|
+
}
|
|
15680
16095
|
async function materializeSession(file2) {
|
|
15681
16096
|
let raw;
|
|
15682
16097
|
try {
|
|
15683
|
-
raw = await
|
|
16098
|
+
raw = await fs5.readFile(file2, "utf-8");
|
|
15684
16099
|
} catch {
|
|
15685
16100
|
return null;
|
|
15686
16101
|
}
|
|
16102
|
+
if (sniffCodexRaw(raw)) return materializeCodex(raw);
|
|
16103
|
+
if (sniffCursorRaw(raw)) return materializeCursor(file2, raw);
|
|
15687
16104
|
const lines = [];
|
|
15688
16105
|
let humanTurns = 0, humanChars = 0;
|
|
15689
16106
|
const pendingQueued = [];
|
|
@@ -15696,7 +16113,7 @@ async function materializeSession(file2) {
|
|
|
15696
16113
|
const flushAI = () => {
|
|
15697
16114
|
if (!aiLastProse && aiTools.size === 0) return;
|
|
15698
16115
|
const tools = [...aiTools.entries()].map(([n, c]) => c > 1 ? `${n}\xD7${c}` : n).join(", ");
|
|
15699
|
-
const gist = aiLastProse ? aiLastProse.length >
|
|
16116
|
+
const gist = aiLastProse ? aiLastProse.length > AI_GIST2 ? aiLastProse.slice(0, AI_GIST2) + "\u2026" : aiLastProse : "";
|
|
15700
16117
|
const bits = [];
|
|
15701
16118
|
if (gist) bits.push(gist);
|
|
15702
16119
|
if (tools) bits.push(`ran ${tools}`);
|
|
@@ -15776,10 +16193,10 @@ async function materializeSession(file2) {
|
|
|
15776
16193
|
|
|
15777
16194
|
// ../../lib/agents/coding/docsDir.ts
|
|
15778
16195
|
async function writeScoreboard(codingDir, docs) {
|
|
15779
|
-
const gradesDir =
|
|
16196
|
+
const gradesDir = path10.join(codingDir, "grades");
|
|
15780
16197
|
let files = [];
|
|
15781
16198
|
try {
|
|
15782
|
-
files = (await
|
|
16199
|
+
files = (await fs6.readdir(gradesDir)).filter((f) => f.endsWith(".json")).sort();
|
|
15783
16200
|
} catch {
|
|
15784
16201
|
return;
|
|
15785
16202
|
}
|
|
@@ -15787,7 +16204,7 @@ async function writeScoreboard(codingDir, docs) {
|
|
|
15787
16204
|
for (const f of files) {
|
|
15788
16205
|
let g;
|
|
15789
16206
|
try {
|
|
15790
|
-
g = JSON.parse(await
|
|
16207
|
+
g = JSON.parse(await fs6.readFile(path10.join(gradesDir, f), "utf8"));
|
|
15791
16208
|
} catch {
|
|
15792
16209
|
continue;
|
|
15793
16210
|
}
|
|
@@ -15803,8 +16220,8 @@ async function writeScoreboard(codingDir, docs) {
|
|
|
15803
16220
|
([key, rows]) => `## ${key}
|
|
15804
16221
|
${rows.sort((a, b) => b.s - a.s).map((r) => r.line).join("\n")}`
|
|
15805
16222
|
);
|
|
15806
|
-
await
|
|
15807
|
-
|
|
16223
|
+
await fs6.writeFile(
|
|
16224
|
+
path10.join(docs, "_scoreboard.md"),
|
|
15808
16225
|
`# Scoreboard \u2014 every graded session per criterion, best first.
|
|
15809
16226
|
# Lx~ = estimate. Format: level \xB7 date \xB7 title \xB7 sessionId \u2014 graded instance.
|
|
15810
16227
|
|
|
@@ -15813,24 +16230,24 @@ ${blocks.join("\n\n")}
|
|
|
15813
16230
|
);
|
|
15814
16231
|
}
|
|
15815
16232
|
async function ensureCodingDocs(codingDir, sessions) {
|
|
15816
|
-
const docs =
|
|
15817
|
-
await
|
|
16233
|
+
const docs = path10.join(codingDir, "docs");
|
|
16234
|
+
await fs6.mkdir(docs, { recursive: true });
|
|
15818
16235
|
const user = sessions.filter((s) => s.sessionId && !s.duplicateOf && (!("klass" in s) || s.klass === "interactive"));
|
|
15819
16236
|
let written = 0;
|
|
15820
16237
|
for (const s of user) {
|
|
15821
|
-
const out =
|
|
16238
|
+
const out = path10.join(docs, `${s.sessionId}.txt`);
|
|
15822
16239
|
try {
|
|
15823
|
-
await
|
|
16240
|
+
await fs6.access(out);
|
|
15824
16241
|
continue;
|
|
15825
16242
|
} catch {
|
|
15826
16243
|
}
|
|
15827
16244
|
const mat = await materializeSession(s.file).catch(() => null);
|
|
15828
16245
|
if (!mat?.text) continue;
|
|
15829
|
-
await
|
|
16246
|
+
await fs6.writeFile(out, mat.text);
|
|
15830
16247
|
written++;
|
|
15831
16248
|
}
|
|
15832
16249
|
const rows = user.sort((a, b) => (a.start ?? "") < (b.start ?? "") ? -1 : 1).map((s) => `${(s.start ?? "").slice(0, 10)} \xB7 ${(s.title ?? "").replace(/\n.*/s, "").slice(0, 80)} \xB7 ${s.sessionId}`);
|
|
15833
|
-
await
|
|
16250
|
+
await fs6.writeFile(path10.join(docs, "_map.md"), rows.join("\n") + "\n");
|
|
15834
16251
|
await writeScoreboard(codingDir, docs);
|
|
15835
16252
|
if (written) console.log(`[docs] materialized ${written} new transcript(s) \u2192 ${docs}`);
|
|
15836
16253
|
return docs;
|
|
@@ -15843,7 +16260,7 @@ SOURCE LOOKUP \u2014 you have Read/Grep/Glob over the working directory, which h
|
|
|
15843
16260
|
|
|
15844
16261
|
// ../../lib/agents/coding/promptCache.ts
|
|
15845
16262
|
import { createHash } from "crypto";
|
|
15846
|
-
import { promises as
|
|
16263
|
+
import { promises as fs7 } from "fs";
|
|
15847
16264
|
function promptSha(parts) {
|
|
15848
16265
|
const h = createHash("sha256");
|
|
15849
16266
|
for (const p of parts) {
|
|
@@ -15854,7 +16271,7 @@ function promptSha(parts) {
|
|
|
15854
16271
|
}
|
|
15855
16272
|
async function reusableOutput(outPath, sha, valid, key = "promptSha") {
|
|
15856
16273
|
try {
|
|
15857
|
-
const o = JSON.parse(await
|
|
16274
|
+
const o = JSON.parse(await fs7.readFile(outPath, "utf8"));
|
|
15858
16275
|
if (o[key] === sha && valid(o)) return o;
|
|
15859
16276
|
} catch {
|
|
15860
16277
|
}
|
|
@@ -15862,7 +16279,7 @@ async function reusableOutput(outPath, sha, valid, key = "promptSha") {
|
|
|
15862
16279
|
}
|
|
15863
16280
|
|
|
15864
16281
|
// ../../lib/agents/coding/profile.ts
|
|
15865
|
-
import
|
|
16282
|
+
import path11 from "path";
|
|
15866
16283
|
|
|
15867
16284
|
// ../../lib/calibration/fingerprint.ts
|
|
15868
16285
|
import { createHash as createHash2 } from "node:crypto";
|
|
@@ -16016,7 +16433,7 @@ var TRANSCRIPT_LINE_RE = new RegExp(`^\\s*(${NOTE})((,| and) ${NOTE})*\\s*$|^\\s
|
|
|
16016
16433
|
|
|
16017
16434
|
// ../../lib/calibration/index.ts
|
|
16018
16435
|
var DEFAULT_CALIBRATION = {
|
|
16019
|
-
version: "2026-07-
|
|
16436
|
+
version: "2026-07-21.1",
|
|
16020
16437
|
// = RUBRIC_FINGERPRINT of the shipped npm rubric (packages/coding-analyzer/
|
|
16021
16438
|
// src/grade/criteria.ts). A unit test fails loud when the rubric changes
|
|
16022
16439
|
// without this being updated (and re-pushed to the server).
|
|
@@ -16112,13 +16529,14 @@ var DEFAULT_CALIBRATION = {
|
|
|
16112
16529
|
},
|
|
16113
16530
|
codingBenchmarks: {
|
|
16114
16531
|
flow: {
|
|
16115
|
-
// typical knowledge worker ≈ 35% of an 8h day focused; ~4h/day
|
|
16116
|
-
//
|
|
16532
|
+
// typical knowledge worker ≈ 35% of an 8h day focused; the ~4h/day
|
|
16533
|
+
// deep-work ceiling (Newport) sits nearer ~40% of a real (9-10h) top
|
|
16534
|
+
// performer's day — 50% overstated it (owner call 2026-07-21).
|
|
16117
16535
|
typicalPctOfDay: 0.35,
|
|
16118
|
-
topPctOfDay: 0.
|
|
16536
|
+
topPctOfDay: 0.4,
|
|
16119
16537
|
tag: "measured",
|
|
16120
|
-
source: "RescueTime 2019 (~2h48m focused/day) \xB7 Cal Newport, Deep Work (~4h/day deep-work ceiling)",
|
|
16121
|
-
line: "the best spend ~
|
|
16538
|
+
source: "RescueTime 2019 (~2h48m focused/day) \xB7 Cal Newport, Deep Work (~4h/day deep-work ceiling against a 9-10h day)",
|
|
16539
|
+
line: "the best spend ~40% of the workday in true deep flow; ~4h/day is the human ceiling"
|
|
16122
16540
|
},
|
|
16123
16541
|
longestRun: {
|
|
16124
16542
|
typicalHours: 0.67,
|
|
@@ -16167,8 +16585,8 @@ var BEST = DEFAULT_CALIBRATION.codingBenchmarks;
|
|
|
16167
16585
|
|
|
16168
16586
|
// ../../lib/agents/coding/profile.ts
|
|
16169
16587
|
var ROOT = process.cwd();
|
|
16170
|
-
var CODING_DIR = process.env.POLYMATH_DATA_DIR ?
|
|
16171
|
-
var GRADES =
|
|
16588
|
+
var CODING_DIR = process.env.POLYMATH_DATA_DIR ? path11.join(process.env.POLYMATH_DATA_DIR, "coding") : path11.join(ROOT, ".data", "coding");
|
|
16589
|
+
var GRADES = path11.join(CODING_DIR, "grades");
|
|
16172
16590
|
|
|
16173
16591
|
// ../../scripts/coding-frontier-detail.mts
|
|
16174
16592
|
var CODING = CODING_DIR;
|
|
@@ -16185,7 +16603,7 @@ var isUuid = (s) => /^[0-9a-f]{8}-?[0-9a-f]/.test(s);
|
|
|
16185
16603
|
async function parseSkillCalls(file2) {
|
|
16186
16604
|
let raw;
|
|
16187
16605
|
try {
|
|
16188
|
-
raw = await
|
|
16606
|
+
raw = await fs8.readFile(file2, "utf8");
|
|
16189
16607
|
} catch {
|
|
16190
16608
|
return [];
|
|
16191
16609
|
}
|
|
@@ -16208,7 +16626,7 @@ async function parseSkillCalls(file2) {
|
|
|
16208
16626
|
return out;
|
|
16209
16627
|
}
|
|
16210
16628
|
async function main() {
|
|
16211
|
-
const all = JSON.parse(await
|
|
16629
|
+
const all = JSON.parse(await fs8.readFile(`${CODING}/sessions.json`, "utf8"));
|
|
16212
16630
|
const sessions = all.filter((s) => s.klass === "interactive");
|
|
16213
16631
|
const dateOf = (s) => (s.start || "").slice(0, 10);
|
|
16214
16632
|
const byActive = (a, b) => (b.activeMin ?? 0) - (a.activeMin ?? 0);
|
|
@@ -16296,14 +16714,14 @@ Put anything with verdict "tried-failed" into BOTH its list (with the verdict) A
|
|
|
16296
16714
|
console.log("ERR", e.message.slice(0, 160));
|
|
16297
16715
|
}
|
|
16298
16716
|
if (!ok) {
|
|
16299
|
-
const existing = await
|
|
16717
|
+
const existing = await fs8.readFile(`${CODING}/frontier-detail.json`, "utf8").then(JSON.parse).catch(() => null);
|
|
16300
16718
|
if (existing && (existing.skills || []).length) {
|
|
16301
16719
|
console.error(`REFUSING to write ${CODING}/frontier-detail.json \u2014 the LLM pass failed and the existing file has ${existing.skills.length} assessed skill(s)`);
|
|
16302
16720
|
process.exit(1);
|
|
16303
16721
|
}
|
|
16304
16722
|
}
|
|
16305
16723
|
const out = { generatedAt: (/* @__PURE__ */ new Date()).toISOString(), ...ok ? { promptSha: sha } : {}, skillsUsed, mcpServers, ...detail };
|
|
16306
|
-
await
|
|
16724
|
+
await fs8.writeFile(`${CODING}/frontier-detail.json`, JSON.stringify(out, null, 2));
|
|
16307
16725
|
if (!ok) {
|
|
16308
16726
|
console.error(`frontier-detail LLM pass failed \u2014 wrote deterministic portion only (skillsUsed/mcpServers), exiting non-zero`);
|
|
16309
16727
|
process.exit(1);
|