@gobing-ai/spur 0.3.98 → 0.3.99
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/.claude-plugin/marketplace.json +1 -1
- package/config/plugin-scripts.json +5 -0
- package/config/templates/task/brainstorm.md +1 -1
- package/config/templates/task/feature-impl.md +1 -1
- package/config/templates/task/issue.md +1 -1
- package/config/templates/task/meta.md +1 -1
- package/config/templates/task/review.md +1 -1
- package/config/templates/task/standard.md +1 -1
- package/package.json +9 -9
- package/plugins/sp/lib/idea-handoff.generated.mjs +37 -4
- package/plugins/sp/lib/inline-run.generated.mjs +38 -5
- package/plugins/sp/lib/residual-scan.generated.d.mts +5 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +45 -5
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/persist-out-check.mjs +164 -0
- package/plugins/sp/scripts/persist-out-check.ts +185 -0
- package/plugins/sp/scripts/residual-scan.mjs +50 -8
- package/plugins/sp/scripts/residual-scan.ts +4 -3
- package/plugins/sp/scripts/task-diffstat.mjs +17 -5
- package/plugins/sp/scripts/task-diffstat.ts +25 -4
- package/plugins/sp/skills/code-verification/SKILL.md +3 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +17 -1
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +40 -7
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +216 -37
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +3 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +107 -3
- package/spur.js +1662 -386
- package/web/_astro/{BoardApp.CYbe-OTb.js → BoardApp.BVp-LYi6.js} +101 -101
- package/web/_astro/{BoardApp.Dflq5a8x.js → BoardApp.i4eh_fHA.js} +1 -1
- package/web/_astro/{TaskDetail.CK7oXddP.js → TaskDetail.C5Cu8LdB.js} +1 -1
- package/web/_astro/{arc.BIqkDATc.js → arc.Bu5XpBEz.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.D0B3SvWv.js → architectureDiagram-3BPJPVTR.9vHQTvhF.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.C2YyKQmL.js → blockDiagram-GPEHLZMM.Cn2Xl7D6.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DmtTYrt_.js → c4Diagram-AAUBKEIU.7o0P_QDo.js} +1 -1
- package/web/_astro/channel.6IFIKBhu.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.HsRXbh7l.js → chunk-2J33WTMH.C3zZFsNt.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.obE_P-R3.js → chunk-4BX2VUAB.CNy_M7fO.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CjWTF5mz.js → chunk-55IACEB6.2TiPnLBL.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DMo799Ax.js → chunk-727SXJPM.5CGSyKAp.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.-cE6JOKZ.js → chunk-AQP2D5EJ.w-ZIgfsK.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.D6Rw6HIk.js → chunk-FMBD7UC4.BkcEyhKa.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.d5rBD73Z.js → chunk-ND2GUHAM.mxKKbBG4.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.r3ox40Q3.js → chunk-QZHKN3VN.cyA0z9aT.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CGGbvjjJ.js → classDiagram-4FO5ZUOK.CqtUzwhX.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CGGbvjjJ.js → classDiagram-v2-Q7XG4LA2.CqtUzwhX.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CmKtPd4l.js → cose-bilkent-S5V4N54A.BExPTopI.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.QNg5GXs8.js → cynefin-OW5HDTMX.Bq2i10Cn.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.B1SabsjC.js → dagre-BM42HDAG.By_HsOuv.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.RtDbNj89.js → diagram-2AECGRRQ.BtU0b7hz.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.IzZpuM-Y.js → diagram-5GNKFQAL.D00ztMdT.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.DPTF_fgv.js → diagram-KO2AKTUF.DMVJWaUN.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CCyza39P.js → diagram-LMA3HP47.Cxqrjg5-.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BXAi8zcZ.js → diagram-OG6HWLK6.2lz_1B5h.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DUDX7_MR.js → erDiagram-TEJ5UH35.BVQEuJ3T.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.C63QTh3N.js → flowDiagram-I6XJVG4X.Qlyo90ky.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.CnlZJSwG.js → ganttDiagram-6RSMTGT7.DRwb8HHZ.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CTqIrOPC.js → gitGraphDiagram-PVQCEYII.YfoPthfS.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.BYMiDFh9.js → infoDiagram-5YYISTIA.DvFREck1.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CRiQmI-z.js → ishikawaDiagram-YF4QCWOH.BzCj9Q0-.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.YQgWBsEU.js → journeyDiagram-JHISSGLW.BDMT_AFb.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.1ECnrrK1.js → kanban-definition-UN3LZRKU.D6Fh3gj9.js} +1 -1
- package/web/_astro/{linear.DzVA71yT.js → linear.Dxw00fGQ.js} +1 -1
- package/web/_astro/{mermaid.core.BK7P2Sr_.js → mermaid.core.CsoxUWa0.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BvXyWZK7.js → mindmap-definition-RKZ34NQL.CN8oeHLu.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.BiXk1TW3.js → pieDiagram-4H26LBE5.C7ADqQ_7.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.krvBH8lh.js → quadrantDiagram-W4KKPZXB.Cw9lKyHP.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.ih1gL25c.js → requirementDiagram-4Y6WPE33.B1ni-z4q.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CpUxkv4u.js → sankeyDiagram-5OEKKPKP.BhexdjVr.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.clAfeN7y.js → sequenceDiagram-3UESZ5HK.C3Rm7dpQ.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DpXWb8-m.js → stateDiagram-AJRCARHV.CkuMt27u.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.ClZb9GIH.js → stateDiagram-v2-BHNVJYJU.Dc_aazUA.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BLcX5dh7.js → timeline-definition-PNZ67QCA.ja7sUFhH.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.oGgpKMpx.js → vennDiagram-CIIHVFJN.BxIshX_K.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BPHtMtt-.js → wardleyDiagram-YWT4CUSO.DfHlC0sh.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.BNZOPYSk.js → xychartDiagram-2RQKCTM6.DSnhHwCh.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/channel.JuKVyuhZ.js +0 -1
|
@@ -407,7 +407,7 @@ END`;var MEASURE_COLS="messages, tool_calls, skill_calls, fresh_input_tokens, ca
|
|
|
407
407
|
''
|
|
408
408
|
)
|
|
409
409
|
ELSE ''
|
|
410
|
-
END`;var POST_WATERMARK_TABLES=[...KEYED_ROLLUP_TABLES,...GLOBAL_RANKED_ROLLUP_TABLES,"history_daily_stats","history_board_source_daily"];var HISTORY_IMPORT_SCHEMA_VERSION="0.5.
|
|
410
|
+
END`;var POST_WATERMARK_TABLES=[...KEYED_ROLLUP_TABLES,...GLOBAL_RANKED_ROLLUP_TABLES,"history_daily_stats","history_board_source_daily"];var HISTORY_IMPORT_SCHEMA_VERSION="0.5.12",HISTORY_IMPORT_SCHEMA_SQL=`
|
|
411
411
|
CREATE TABLE IF NOT EXISTS history_import_checkpoint (
|
|
412
412
|
source TEXT NOT NULL,
|
|
413
413
|
source_file TEXT NOT NULL,
|
|
@@ -514,7 +514,14 @@ CREATE TABLE IF NOT EXISTS history_skill_call (
|
|
|
514
514
|
started_at TEXT,
|
|
515
515
|
completed_at TEXT,
|
|
516
516
|
duration_ms REAL,
|
|
517
|
-
imported_at TEXT NOT NULL
|
|
517
|
+
imported_at TEXT NOT NULL,
|
|
518
|
+
-- Capability facts (E93 task 1028). Nullable on every row: legacy rows and rows
|
|
519
|
+
-- whose classification could not be established store NULL. Column order after
|
|
520
|
+
-- imported_at converges with the guarded standalone upgrade in the DAO.
|
|
521
|
+
capability_kind TEXT,
|
|
522
|
+
evidence_kind TEXT,
|
|
523
|
+
invocation_id TEXT,
|
|
524
|
+
origin_identity TEXT
|
|
518
525
|
);
|
|
519
526
|
CREATE INDEX IF NOT EXISTS idx_history_skill_call_session
|
|
520
527
|
ON history_skill_call(source, session_id, seq);
|
|
@@ -524,7 +531,13 @@ CREATE INDEX IF NOT EXISTS idx_history_skill_call_message_hash
|
|
|
524
531
|
ON history_skill_call(message_hash);
|
|
525
532
|
CREATE INDEX IF NOT EXISTS idx_history_skill_call_invocation_kind
|
|
526
533
|
ON history_skill_call(invocation_kind);
|
|
527
|
-
`.trim();init_zod();init_zod();import{createHash}from"node:crypto";function stableJson(value){if(Array.isArray(value))return`[${value.map((entry)=>entry===void 0?"null":stableJson(entry)).join(",")}]`;if(value!==null&&typeof value==="object"){let record2=value;return`{${Object.keys(record2).filter((key)=>record2[key]!==void 0).sort().map((key)=>`${JSON.stringify(key)}:${stableJson(record2[key])}`).join(",")}}`}return JSON.stringify(value)??"null"}function sha256(value){return createHash("sha256").update(stableJson(value)).digest("hex")}var MESSAGE_MAPPER_KEYS=["_codexUsageCarrier","session_id","seq","turn_index","role","record_type","disposition","ts","duration_ms","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_usd","content_text","cwd","provenance","run_id","task_wbs","request_id"],TOOL_CALL_MAPPER_KEYS=["_messageSplitIndex","session_id","seq","tool_name","call_id","args_digest","args_raw","status","started_at","completed_at","duration_ms","result_bytes","error_text"],SKILL_CALL_MAPPER_KEYS=["_messageSplitIndex","session_id","seq","skill_name","invocation_kind","skill_path","args_raw","args_digest","call_id","status","started_at","completed_at","duration_ms"];function identityFieldMap(keys){let map2={};for(let key of keys)map2[key]=key;return map2}var HARNESS_SKILL_PACKAGES=new Set(["sp","rd3"]);function canonicalizeSkillName(raw){let name=raw.trim();if(name.startsWith("/")||name.startsWith("$"))name=name.slice(1);if(name.startsWith("skill:"))name=name.slice(6);let canonical=name.match(/^([a-z][a-z0-9]*):([a-z0-9-]+)$/);if(canonical!==null&&HARNESS_SKILL_PACKAGES.has(canonical[1]??""))return name;let dialect=name.match(/^([a-z][a-z0-9]*)-([a-z0-9-]+)$/);if(dialect!==null&&HARNESS_SKILL_PACKAGES.has(dialect[1]??""))return`${dialect[1]}:${dialect[2]}`;return name}function extractSkillCalls(raw,context,identity){switch(context?.source){case"claude":return detectClaudeSkillCalls(raw,identity);case"pi":return detectPiSkillCalls(raw,identity);case"omp":return detectOmpSkillCalls(raw,identity);case"codex":return detectCodexSkillCalls(raw,identity);case"agy":return detectAgySkillCalls(raw,identity);case"gemini":return detectGeminiSkillCalls(raw,identity);case"grok":return detectGrokSkillCalls(raw,identity);default:return[]}}function skillCallEntry(record2){return{targetTable:"history_skill_call",record:record2}}function skillRecord(identity,skillName,invocationKind,extra={}){return{_messageSplitIndex:identity.messageSplitIndex,session_id:identity.sessionId,seq:identity.seq,skill_name:canonicalizeSkillName(skillName),invocation_kind:invocationKind,skill_path:null,args_raw:null,args_digest:null,call_id:null,status:"ok",started_at:null,completed_at:null,duration_ms:null,...extra}}function skillNameFromPath(path){let normalized=path.replace(/\\/g,"/"),bySkillsSegment=normalized.match(/\/skills\/([^/]+)\/SKILL\.md$/i);if(bySkillsSegment!==null)return bySkillsSegment[1]??"";let stem=normalized.slice(0,normalized.length-9);return stem.split("/").pop()??stem}function detectClaudeSkillCalls(raw,identity){let contentBlocks=raw.content??o(raw.message).content;if(!Array.isArray(contentBlocks))return[];let rows=[];for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let b=block;if(b.type!=="tool_use"||b.name!=="Skill")continue;let input=b.input??{},skill=s(input.skill);if(skill===void 0)continue;rows.push(skillRecord(identity,skill,s(o(b.caller).type)==="direct"?"user":"model",{args_raw:maybeArgsRaw("claude","Skill",input)??null,args_digest:argsDigest(input),call_id:s(b.id)??null}))}return rows}var PI_SKILL_WRAPPER=/<skill\s+name="([^"]+)"(?:\s+location="([^"]*)")?\s*>/g;function detectPiSkillCalls(raw,identity){let msg=raw.message;if(piRole(msg?.role??raw.role??raw.recordType??raw.type)!=="user")return[];let text=extractContentText(msg?.content??raw.content);if(text===void 0)return[];let rows=[];for(let match of text.matchAll(PI_SKILL_WRAPPER))rows.push(skillRecord(identity,match[1]??"","user",{skill_path:match[2]||null}));return rows}function detectOmpSkillCalls(raw,identity){let msg=raw.message;if(mapRole(msg?.role??raw.type??raw.role)!=="assistant")return[];let contentBlocks=msg?.content??raw.content;if(!Array.isArray(contentBlocks))return[];let rows=[];for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null||call.name!=="Skill")continue;let input=call.input??call.arguments,skill=s(input?.skill);if(skill===void 0)continue;rows.push(skillRecord(identity,skill,"model",{args_raw:maybeArgsRaw("omp","Skill",input)??null,args_digest:argsDigest(input),call_id:s(call.id)??null}))}return rows}var CODEX_SKILL_BLOCK=/<skill>\s*<name>([^<]+)<\/name>\s*<path>([^<]+)<\/path>\s*<\/skill>/g;function detectCodexSkillCalls(raw,identity){let payload=raw.payload??raw,recordType=String(raw.type??""),payloadType=String(payload.type??""),role;if(recordType==="response_item")role=payloadType==="message"?mapRole(payload.role):payloadType==="agent_message"?"assistant":"meta";else if(recordType==="user"||recordType==="assistant")role=mapRole(recordType);else if(recordType==="message")role=mapRole(raw.role??payload.role);else return[];if(role!=="user")return[];let text=extractContentText(payload.content??raw.content)??s(payload.text,raw.text);if(text===void 0)return[];let rows=[];for(let match of text.matchAll(CODEX_SKILL_BLOCK))rows.push(skillRecord(identity,match[1]??"","user",{skill_path:match[2]??null}));return rows}function detectAgySkillCalls(raw,identity){if(String(raw.type??"")!=="PLANNER_RESPONSE"||!Array.isArray(raw.tool_calls))return[];let rows=[];for(let tc of raw.tool_calls){if(s(tc.name,tc.tool_name)!=="view_file")continue;let args=tc.args??tc.arguments??{};if(args.toolAction!=="Viewing skill file")continue;let path=s(args.AbsolutePath,args.absolute_path);if(path===void 0||!path.replace(/\\/g,"/").endsWith("/SKILL.md"))continue;let skillName=s(args.toolSummary)?.match(/SKILL\.md for (.+)$/)?.[1]??skillNameFromPath(path);rows.push(skillRecord(identity,skillName,"model",{skill_path:path,args_raw:maybeArgsRaw("agy","view_file",args)??null,args_digest:argsDigest(args)}))}return rows}var GEMINI_L0_PREFIX=/^\s*\/((?:sp|rd3)-[a-z0-9-]+)/;function detectGeminiSkillCalls(raw,identity){if(String(raw.type??"")!=="user")return[];let content=geminiContent(raw);if(content===null)return[];let match=content.match(GEMINI_L0_PREFIX);if(match===null)return[];return[skillRecord(identity,match[1]??"","user")]}function detectGrokSkillCalls(raw,identity){let n=normalizeGrokRecord(raw);if(n.recordType!=="tool_call"||n.toolName!=="read_file")return[];let meta3=n.body._meta??raw._meta??{};if(o(meta3["x.ai/tool"]).namespace!=="grok_build")return[];let targetFile=s(o(n.toolArgs).target_file);if(targetFile===void 0||!targetFile.replace(/\\/g,"/").endsWith("/SKILL.md"))return[];return[skillRecord(identity,skillNameFromPath(targetFile),"model",{skill_path:targetFile,args_raw:maybeArgsRaw("grok","read_file",n.toolArgs)??null,args_digest:argsDigest(n.toolArgs),started_at:n.ts??null})]}function argsDigest(args){let redacted=redactArgs(args);return sha256(redacted)}function redactArgs(args){if(typeof args==="string"){if(args.length>80)return"[REDACTED:long]";if(/[A-Za-z0-9+/]{40,}=*|[A-Za-z0-9_-]{20,}/.test(args))return"[REDACTED:secret]";return args}if(Array.isArray(args))return args.map(redactArgs);if(args!==null&&typeof args==="object"){let result={};for(let[key,value]of Object.entries(args))result[key]=redactArgs(value);return result}return args}var BASH_COMMAND_MAX_CHARS=8192,GENERIC_ARGS_MAX_CHARS=8192;function bashCommandOf(args){if(args===null||typeof args!=="object")return;let rec=args,command=rec.command??rec.CommandLine??rec.cmd??rec.script;if(typeof command==="string")return command;if(Array.isArray(command))return command.map(String).join(" ");return}var BULKY_PAYLOAD_KEYS=new Set(["content","codecontent","replacementcontent","targetcontent","filedata","buffer","blob","image","imagebase64"]);function normalizeKey(key){return key.toLowerCase().replace(/[^a-z0-9]/g,"")}function isShellTool(toolName){return/^(?:bash|shell|cmd|command|exec|execcommand|executecommand|runcommand|shellcommand|runshellcommand)$/.test(normalizeKey(toolName))}function sanitizeValue(value){if(typeof value==="string")return value.length>1000?`${value.slice(0,1000)}[truncated ${value.length} chars]`:value;if(Array.isArray(value))return value.map(sanitizeValue);if(value!==null&&typeof value==="object"){let out={};for(let[key,entry]of Object.entries(value))out[key]=typeof entry==="string"&&entry.length>120&&BULKY_PAYLOAD_KEYS.has(normalizeKey(key))?`[omitted ${entry.length} chars]`:sanitizeValue(entry);return out}return value}function serializeBounded(value){let serialized=JSON.stringify(sanitizeValue(value));if(serialized.length<=GENERIC_ARGS_MAX_CHARS)return serialized;let preview=serialized;for(;;){let wrapper=JSON.stringify({_truncated:!0,omittedChars:serialized.length-preview.length,preview});if(wrapper.length<=GENERIC_ARGS_MAX_CHARS)return wrapper;preview=preview.slice(0,preview.length-(wrapper.length-GENERIC_ARGS_MAX_CHARS))}}function maybeArgsRaw(_source,toolName,args){if(args===void 0||args===null)return;let value=args;if(typeof args==="string")try{value=JSON.parse(args)}catch{return args.length>BASH_COMMAND_MAX_CHARS?args.slice(0,BASH_COMMAND_MAX_CHARS):args}if(value!==null&&typeof value==="object"){let cmd=bashCommandOf(value);if(cmd!==void 0&&isShellTool(toolName))return cmd.length>BASH_COMMAND_MAX_CHARS?cmd.slice(0,BASH_COMMAND_MAX_CHARS):cmd;return serializeBounded(value)}return JSON.stringify(value)}function claudeSplit(raw,context){let entries=[],sessionId=s(raw.sessionId,raw.conversation_uuid)??"unknown",seq=typeof raw.seq==="number"?raw.seq:typeof raw.messageIndex==="number"?raw.messageIndex:0,ts=timestampOf(raw.ts,raw.timestamp,raw.createdAt),role=mapRole(raw.type??raw.role),recordType=String(raw.type??""),model=s(raw.model,o(raw.message).model),cwd=s(raw.cwd,raw.dir);if(raw.subtype==="turn_duration"&&typeof raw.durationMs==="number")return entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role:"system",record_type:"turn_duration",disposition:"meta",ts,duration_ms:raw.durationMs,content_text:null,provenance:"ambient"}}),entries;if(recordType==="attachment"||recordType.startsWith("file-history"))return entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}),entries;let usage=typeof raw.usage==="object"&&raw.usage!==null?raw.usage:o(raw.message).usage,inputTokens=raw.inputTokens??usage?.input_tokens,outputTokens=raw.outputTokens??usage?.output_tokens,cacheRead=usage?.cacheReadTokens??usage?.cache_read_tokens??usage?.cache_read_input_tokens,cacheWrite=usage?.cacheWriteTokens??usage?.cache_write_tokens??usage?.cache_creation_input_tokens,costUsd=computeCost(inputTokens,outputTokens,model),contentBlocks=raw.content??o(raw.message).content,contentText=extractContentText(contentBlocks),messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,turn_index:typeof raw.turnIndex==="number"?raw.turnIndex:void 0,role,record_type:recordType,disposition:"keep",ts,duration_ms:void 0,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:contentText??null,cwd:cwd??null,provenance:"ambient",request_id:s(raw.requestId)??null}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let b=block;if(b.type==="tool_use")entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,call_id:s(b.id),tool_name:String(b.name??""),args_digest:argsDigest(b.input),args_raw:maybeArgsRaw("claude",String(b.name??""),b.input),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function piSplit(raw,context){let msg=raw.message,recordType=String(raw.type??raw.recordType??""),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??(typeof raw.seq==="number"?raw.seq:0),ts=timestampOf(raw.timestamp,raw.createdAt,raw.ts);if(recordType==="title"||recordType==="title_change"||recordType==="service_tier_change"||recordType==="session_info"||recordType==="ttsr_injection"||recordType==="session_init"||recordType==="session"||recordType==="model_change"||recordType==="thinking_level_change"||recordType==="compaction"||recordType==="custom"||recordType==="custom_message"||recordType.startsWith("custom."))return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}];let entries=[],role=piRole(msg?.role??raw.role??recordType),model=s(raw.model,o(msg).model),cwd=s(raw.cwd,raw.dir),usage=msg?.usage??raw.usage,inputTokens=usage?.input??usage?.input_tokens??void 0,outputTokens=usage?.output??usage?.output_tokens??void 0,cacheRead=usage?.cacheRead??usage?.cache_read_tokens??void 0,cacheWrite=usage?.cacheWrite??usage?.cache_write_tokens??void 0,costObj=msg?.cost??raw.cost,costUsd=typeof costObj?.total==="number"?costObj.total:computeCost(inputTokens,outputTokens,model),contentBlocks=msg?.content??raw.content,durationMs=typeof msg?.duration==="number"&&Number.isFinite(msg.duration)?msg.duration:void 0,messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:durationMs,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:extractContentText(contentBlocks)??s(raw.content,raw.text,msg?.content)??null,cwd:cwd??null,provenance:"ambient"}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null)continue;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:String(call.name??""),call_id:s(call.id),args_digest:argsDigest(call.input??call.arguments),args_raw:maybeArgsRaw("pi",String(call.name??""),call.input??call.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function piRole(type){let t=String(type??"").toLowerCase();if(t==="toolresult"||t==="tool_result"||t==="bashexecution"||t==="tool")return"user";let mapped=mapRole(t);if(mapped==="user"||mapped==="assistant"||mapped==="system")return mapped;return"unknown"}function ompSplit(raw,context){let msg=raw.message,recordType=String(raw.type??""),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??(typeof raw.seq==="number"?raw.seq:0),ts=timestampOf(raw.ts,raw.timestamp,raw.createdAt);if(recordType==="title"||recordType==="title_change"||recordType==="service_tier_change"||recordType==="ttsr_injection"||recordType==="session_init"||recordType==="session"||recordType==="model_change"||recordType==="thinking_level_change"||recordType==="compaction"||recordType==="custom"||recordType==="custom_message"||recordType.startsWith("custom."))return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}];let entries=[],role=mapRole(msg?.role??raw.type??raw.role),model=s(raw.model,o(msg).model),cwd=s(raw.cwd,raw.dir),usage=msg?.usage??raw.usage,inputTokens=usage?.input??usage?.input_tokens??void 0,outputTokens=usage?.output??usage?.output_tokens??void 0,cacheRead=usage?.cacheRead??usage?.cache_read_tokens??void 0,cacheWrite=usage?.cacheWrite??usage?.cache_write_tokens??void 0,costObj=msg?.cost??raw.cost,costUsd=typeof costObj?.total==="number"?costObj.total:computeCost(inputTokens,outputTokens,model),contentBlocks=msg?.content??raw.content,durationMs=typeof msg?.duration==="number"&&Number.isFinite(msg.duration)?msg.duration:void 0,messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:durationMs,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:extractContentText(contentBlocks)??s(raw.content,raw.text,msg?.content)??null,cwd:cwd??null,provenance:"ambient"}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null)continue;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:String(call.name??""),call_id:s(call.id),args_digest:argsDigest(call.input??call.arguments),args_raw:maybeArgsRaw("omp",String(call.name??""),call.input??call.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function normalizeOmpToolCall(block){if(typeof block!=="object"||block===null)return null;let nested=o(block.toolCall);if(Object.keys(nested).length>0)return nested;if(block.type==="toolCall")return block;return null}function codexSplit(raw,context){let entries=[],payload=raw.payload??raw,seq=typeof raw.seq==="number"?raw.seq:0,ts=timestampOf(raw.timestamp,raw.ts,payload.ts),recordType=String(raw.type??""),payloadType=String(payload.type??""),isShortFormat=recordType===""&&raw.id!==void 0&&raw.timestamp!==void 0&&raw.instructions!==void 0,explicitSessionId=s(raw.session_id,o(raw.session_meta).id);if(explicitSessionId===void 0&&recordType==="session_meta")explicitSessionId=s(payload.id,o(raw.payload).id);if(explicitSessionId===void 0&&isShortFormat)explicitSessionId=s(raw.id);let pathSessionId=context?.sourceFile?sessionIdFromSourcePath("codex",context.sourceFile):void 0,sessionId=explicitSessionId??pathSessionId??"unknown";if(isShortFormat)return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:"short_format",disposition:"meta",ts,provenance:"ambient"}}];let role,disposition,contentText,usage;if(recordType==="response_item")if(payloadType==="message")role=mapRole(payload.role),disposition="keep",contentText=extractContentText(payload.content)??s(payload.text)??null;else if(payloadType==="agent_message")role="assistant",disposition="keep",contentText=extractContentText(payload.content)??s(payload.text,payload.message)??null;else if(payloadType==="reasoning")role="assistant",disposition="keep",contentText=extractContentText(payload.summary)??s(payload.text)??null;else if(payloadType==="function_call"||payloadType==="custom_tool_call")role="tool",disposition="keep",contentText=null;else role="meta",disposition="meta",contentText=s(payload.text)??null;else if(recordType==="user"||recordType==="assistant")role=mapRole(recordType),disposition="keep",contentText=extractContentText(payload.content)??s(raw.content,payload.text)??null;else if(recordType==="message")role=mapRole(raw.role??payload.role),disposition="keep",contentText=extractContentText(payload.content??raw.content)??s(payload.text,raw.text)??null;else if(recordType==="event_msg")role="meta",disposition="meta",contentText=s(payload.message,payload.text)??null,usage=o(o(payload.info).last_token_usage);else role="meta",disposition="meta",contentText=s(payload.text,raw.instructions)??null;let model=s(raw.model,payload.model,o(o(raw.turn_context).payload).model),cwd=s(raw.cwd,raw.dir),tokenCount=payload.token_count,usageInput=usage?.input_tokens??tokenCount?.input??tokenCount?.input_tokens??void 0,usageOutput=usage?.output_tokens??tokenCount?.output??tokenCount?.output_tokens??void 0,cacheRead=usage?.cached_input_tokens??void 0,turnPayload=raw.turn_context?.payload,turnInputTokens=turnPayload?.input_tokens,turnOutputTokens=turnPayload?.output_tokens,finalInput=usageInput!==void 0?usageInput:turnInputTokens,finalOutput=usageOutput!==void 0?usageOutput:turnOutputTokens,costUsd=computeCost(finalInput,finalOutput,model),usageCarrier=finalInput!==void 0||finalOutput!==void 0?{input:finalInput??null,output:finalOutput??null,cacheRead:cacheRead??null}:void 0,stripUsage=role==="meta"&&usageCarrier!==void 0,messageSplitIndex=entries.length;entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition,ts,duration_ms:void 0,model:model??null,input_tokens:stripUsage?null:finalInput??null,output_tokens:stripUsage?null:finalOutput??null,cache_read_tokens:stripUsage?null:cacheRead??null,...usageCarrier!==void 0?{_codexUsageCarrier:usageCarrier}:{},cache_write_tokens:null,cost_usd:costUsd??null,content_text:contentText,cwd:cwd??null,provenance:"ambient"}});let toolItems=[];if((recordType==="response_item"||recordType==="function_call"||recordType==="custom_tool_call")&&(payloadType==="function_call"||payloadType==="custom_tool_call"))toolItems.push(payload);else if(payload.response_item)toolItems.push(payload.response_item);else if(Array.isArray(payload.response_items))toolItems.push(...payload.response_items);for(let item of toolItems){let fc=item.function_call??item,toolName=s(fc.name)??"",args=fc.arguments??fc.input;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:toolName,call_id:s(fc.call_id),args_digest:argsDigest(args),args_raw:maybeArgsRaw("codex",toolName,args),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function agySplit(raw,context){let entries=[],recordType=String(raw.type??""),explicitSessionId=s(raw.session_id,raw.conversation_id,raw.conversationId),pathSessionId=context?.sourceFile?sessionIdFromSourcePath("agy",context.sourceFile):void 0,sessionId=explicitSessionId??pathSessionId??"unknown",seq=typeof raw.seq==="number"?raw.seq:typeof raw.step_index==="number"?raw.step_index:context?.sourceLine??0,ts=timestampOf(raw.created_at,raw.timestamp,raw.ts),role,disposition,contentText=null,messageRecordType=recordType;if(raw.display!==void 0)role="user",disposition="keep",contentText=s(raw.display)??null,messageRecordType=recordType.length>0?recordType:"USER_INPUT";else switch(recordType){case"USER_INPUT":case"ASK_QUESTION":role="user",disposition="keep",contentText=s(raw.content,raw.text,raw.message)??null;break;case"PLANNER_RESPONSE":role="assistant",disposition="keep",contentText=s(raw.content,raw.text,raw.message,raw.plan)??null;break;case"ERROR_MESSAGE":role="system",disposition="keep",contentText=s(raw.content,raw.text,raw.message)??null;break;case"RUN_COMMAND":case"VIEW_FILE":case"GREP_SEARCH":case"LIST_DIRECTORY":case"READ_URL_CONTENT":role="tool",disposition="keep",contentText=s(raw.content,raw.command,raw.file_path,raw.pattern)??null;break;case"CODE_ACTION":case"INVOKE_SUBAGENT":role="tool",disposition="keep",contentText=s(raw.content,raw.text)??null;break;case"CONVERSATION_HISTORY":case"CHECKPOINT":case"GENERIC":role="meta",disposition="meta",contentText=s(raw.content,raw.text)??null;break;default:if(recordType.length===0)role="unknown",disposition="unknown";else role="meta",disposition="meta",contentText=s(raw.content,raw.text)??null;break}let messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:messageRecordType,disposition,ts,duration_ms:void 0,model:null,input_tokens:null,output_tokens:null,cache_read_tokens:null,cache_write_tokens:null,cost_usd:null,content_text:contentText,cwd:s(raw.workspace,raw.cwd)??null,provenance:"ambient"}}),recordType==="PLANNER_RESPONSE"&&Array.isArray(raw.tool_calls))for(let tc of raw.tool_calls)entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq:typeof tc.step_index==="number"?tc.step_index:seq,tool_name:String(tc.name??tc.tool_name??""),args_digest:argsDigest(tc.input??tc.arguments),args_raw:maybeArgsRaw("agy",String(tc.name??tc.tool_name??""),tc.input??tc.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}});for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function geminiSplit(raw,context){let recordType=String(raw.type??(raw.kind!==void 0?"session":raw.$set!==void 0?"state":"")),state=o(raw.$set),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??0,ts=timestampOf(raw.timestamp,raw.startTime,raw.lastUpdated,state.lastUpdated);if(recordType==="session"||recordType==="state")return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,content_text:s(state.summary)??null,provenance:"ambient"}}];let role=recordType==="gemini"?"assistant":recordType==="user"?"user":"system",tokens=o(raw.tokens),content=geminiContent(raw),entries=[{targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:null,model:s(raw.model)??null,input_tokens:numberOrNull(tokens.input),output_tokens:numberOrNull(tokens.output),cache_read_tokens:numberOrNull(tokens.cached),cache_write_tokens:null,cost_usd:null,content_text:content,cwd:null,provenance:"ambient"}}];if(Array.isArray(raw.toolCalls))for(let value of raw.toolCalls){if(value===null||typeof value!=="object"||Array.isArray(value))continue;let tool=value,status=s(tool.status)??"unknown",timestamp=s(tool.timestamp),result=tool.result??tool.resultDisplay;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:0,session_id:sessionId,seq,tool_name:s(tool.name,tool.displayName)??"unknown",args_digest:argsDigest(tool.args),args_raw:maybeArgsRaw("gemini",s(tool.name,tool.displayName)??"",tool.args),status,started_at:timestamp,completed_at:timestamp,duration_ms:null,result_bytes:result===void 0?null:new TextEncoder().encode(JSON.stringify(result)).byteLength,error_text:status==="error"?s(tool.resultDisplay,tool.result)??null:null}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex:0}))entries.push(skillCallEntry(record2));return entries}function dshSplit(raw,context){let recordType=String(raw.type??"");if(recordType==="session")return[{targetTable:"history_message",record:{session_id:s(raw.id)??sessionIdFromSourcePath("deepseek",context?.sourceFile??"")??"unknown",seq:0,role:"meta",record_type:"session",disposition:"meta",ts:timestampOf(raw.createdAt),cwd:s(raw.cwd)??null,content_text:null,provenance:"ambient"}}];if(recordType!=="user/message"&&recordType!=="assistant/message")return[];let data=o(raw.data),msg=o(data.message),seq=typeof raw.seq==="number"?raw.seq:context?.sourceLine??0,sessionId=sessionIdFromSourcePath("deepseek",context?.sourceFile??"")??"unknown",role=recordType==="user/message"?"user":"assistant",source=o(data.source??msg.source),model=s(source.model,o(data.model??msg.model).model),usage=data.usage??msg.usage,messageId=s(msg.id,data.id);return[{targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",...messageId!==void 0?{source_record_id:messageId}:{},ts:timestampOf(raw.time,data.time,msg.time),duration_ms:null,model:model??null,input_tokens:numberOrNull(usage?.input_tokens??usage?.input)??null,output_tokens:numberOrNull(usage?.output_tokens??usage?.output)??null,cache_read_tokens:null,cache_write_tokens:null,cost_usd:null,content_text:extractContentText(data.content??msg.content)??s(data.text,msg.text)??null,cwd:null,provenance:"ambient"}}]}var UUID_PATTERN="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}",AGY_BRAIN_REGEX=new RegExp(`(?:^|\\/)brain\\/(${UUID_PATTERN})(?:\\/|$)`,"i"),DSH_SESSION_REGEX=new RegExp(`(?:^|\\/)session-(${UUID_PATTERN})(?:\\/|$)`,"i"),CODEX_ROLLOUT_REGEX=new RegExp(`(?:^|-|_)(${UUID_PATTERN})$`,"i");function sessionIdFromSourcePath(source,sourceFile){let normalized=sourceFile.replace(/\\/g,"/"),sLower=source.toLowerCase();if(sLower==="agy"||sLower==="antigravity")return normalized.match(AGY_BRAIN_REGEX)?.[1];if(sLower==="deepseek")return normalized.match(DSH_SESSION_REGEX)?.[1];if(sLower==="codex"){let basename=normalized.split("/").at(-1)??"";if(basename.startsWith("rollout-")&&basename.endsWith(".jsonl"))return basename.slice(0,-6).match(CODEX_ROLLOUT_REGEX)?.[1]}return}function sessionIdFromContext(context,raw){if(context!==void 0){let file2=context.sourceFile.split("/").at(-1);if(file2!==void 0)return file2.replace(/\.jsonl$/,"")}return s(raw.sessionId,raw.id)??"unknown"}function geminiContent(raw){let content=extractContentText(raw.content)??s(raw.text),thoughts=Array.isArray(raw.thoughts)?raw.thoughts.map((value)=>value!==null&&typeof value==="object"?s(o(value).description):void 0).filter((value)=>value!==void 0).join(`
|
|
534
|
+
`.trim();init_zod();init_zod();import{createHash}from"node:crypto";function stableJson(value){if(Array.isArray(value))return`[${value.map((entry)=>entry===void 0?"null":stableJson(entry)).join(",")}]`;if(value!==null&&typeof value==="object"){let record2=value;return`{${Object.keys(record2).filter((key)=>record2[key]!==void 0).sort().map((key)=>`${JSON.stringify(key)}:${stableJson(record2[key])}`).join(",")}}`}return JSON.stringify(value)??"null"}function sha256(value){return createHash("sha256").update(stableJson(value)).digest("hex")}function sha256Text(text){return createHash("sha256").update(text,"utf8").digest("hex")}function matchCapabilityOrigin(origins,source,canonicalName,observable){let candidates=origins.filter((origin)=>origin.source===source&&origin.skillName===canonicalName);if(candidates.length===0)return{origin:void 0,conflict:null};if(observable.skillPath!=null&&observable.skillPath!==""){let byPath=candidates.filter((origin)=>origin.skillPath!==void 0&&origin.skillPath===observable.skillPath);if(byPath.length>0)candidates=byPath}if(observable.artifactDigest!=null&&observable.artifactDigest!==""){let byDigest=candidates.filter((origin)=>origin.artifactDigest===observable.artifactDigest);if(byDigest.length===1)return{origin:byDigest[0],conflict:null};if(byDigest.length>1)return{origin:void 0,conflict:`capabilityOrigins: ${byDigest.length} origins agree on digest for '${canonicalName}'.`};return{origin:void 0,conflict:`capabilityOrigins: observed artifact digest does not match the supplied origin for '${canonicalName}'.`}}if(candidates.length===1)return{origin:candidates[0],conflict:null};return{origin:void 0,conflict:`capabilityOrigins: ${candidates.length} origins match '${canonicalName}' without distinguishing evidence.`}}function capabilityInvocationId(parts){return sha256Text(JSON.stringify({domain:"capability-invocation",v:1,source:parts.source,sessionId:parts.sessionId,kind:parts.kind,id:parts.id??null,ordinal:parts.ordinal??null,file:parts.file??null,line:parts.line??null},Object.keys({domain:0,v:0,source:0,sessionId:0,kind:0,id:0,ordinal:0,file:0,line:0}).sort()))}function scanShellSegment(segment){let tokens=[],current="",quote=null,dynamic=!1;for(let i=0;i<segment.length;i+=1){let ch=segment[i];if(quote==="'"){if(ch==="'")quote=null;else current+=ch;continue}if(quote==='"'){if(ch==='"')quote=null;else if(ch==="$"||ch==="`")dynamic=!0;else current+=ch;continue}if(ch==="'"||ch==='"'){quote=ch;continue}if(ch==="\\"||ch==="$"||ch==="`"){dynamic=!0;continue}if(ch===" "||ch==="\t"||ch===`
|
|
535
|
+
`){if(current!=="")tokens.push(current);current="";continue}current+=ch}if(quote!==null)dynamic=!0;if(current!=="")tokens.push(current);return{tokens,dynamic}}function splitShellSegments(command){let segments=[],current="",quote=null;for(let i=0;i<command.length;i+=1){let ch=command[i];if(quote!==null){if(current+=ch,ch===quote)quote=null;continue}if(ch==="'"||ch==='"'){quote=ch,current+=ch;continue}if(ch===";"){segments.push(current),current="";continue}if(ch==="|"||ch==="&"){if(command[i+1]===ch){segments.push(current),current="",i+=1;continue}segments.push(current),current="";continue}current+=ch}return segments.push(current),segments}function lastPathSegment(path){let trimmed=path.replace(/\/+$/,""),idx=trimmed.lastIndexOf("/");return idx===-1?trimmed:trimmed.slice(idx+1)}function isSedPrintRange(token){return/^\$?[0-9]+(\s*,\s*(\$|[0-9]+))?p$/.test(token)||/^\$p$/.test(token)}function hasRedirection(segment){let quote=null;for(let i=0;i<segment.length;i+=1){let ch=segment[i];if(quote!==null){if(ch===quote)quote=null;continue}if(ch==="'"||ch==='"'){quote=ch;continue}if(ch===">"||ch==="<")return!0}return!1}function parseLiteralReadTargets(command){if(typeof command!=="string"||command.trim()==="")return[];let targets=[];for(let segment of splitShellSegments(command)){if(segment.trim()===""||hasRedirection(segment))continue;let trimmed=segment.trim();if(trimmed.startsWith("#"))continue;let scan=scanShellSegment(trimmed);if(scan.dynamic||scan.tokens.length===0)continue;let[cmd,...args]=scan.tokens;if(cmd==="cat"){for(let arg of args){if(arg==="--")continue;if(arg.startsWith("-"))continue;if(lastPathSegment(arg)==="SKILL.md")targets.push(arg)}continue}if(cmd==="sed"){let sawNoPrint=!1,rangeArgs=[];for(let arg of args){if(arg==="--")continue;if(arg==="-n"||arg==="--quiet"||arg==="--silent"){sawNoPrint=!0;continue}if(arg.startsWith("-")){sawNoPrint=!1;break}if(isSedPrintRange(arg)){rangeArgs.push(arg);continue}if(rangeArgs.length===0){sawNoPrint=!1;break}if(lastPathSegment(arg)==="SKILL.md")targets.push(arg);break}if(!sawNoPrint)continue}}return targets}function extractNestedExecCommandLiterals(payloadText){if(typeof payloadText!=="string"||payloadText.trim()==="")return[];let literals=[],shape=/tools\.exec_command\(\s*\{\s*cmd:\s*("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')((?:\s*,\s*[A-Za-z_][A-Za-z0-9_]*\s*:\s*(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|[-0-9.eE+]+|true|false|null))*)\s*\}\s*\)/g,inBlockComment=!1;for(let rawLine of payloadText.split(/\r?\n/)){let line=rawLine;if(inBlockComment){let end=line.indexOf("*/");if(end===-1)continue;line=line.slice(end+2),inBlockComment=!1}if(line.trimStart().startsWith("//"))continue;let blockStart=line.indexOf("/*");if(blockStart!==-1){let end=line.indexOf("*/",blockStart+2);if(line=end===-1?line.slice(0,blockStart):line.slice(0,blockStart)+line.slice(end+2),end===-1)inBlockComment=!0}let statementStart=/(?:^|[{};]\s*)$/;shape.lastIndex=0;let match=shape.exec(line);while(match!==null){let before=line.slice(0,match.index);if(statementStart.test(before)){let literal2=match[1]??"",quote=literal2[0]??'"',body=literal2.slice(1,-1).replaceAll(`\\${quote}`,quote).replaceAll("\\\\","\\").replaceAll("\\n",`
|
|
536
|
+
`).replaceAll("\\t","\t");literals.push(body)}match=shape.exec(line)}}return literals}var MESSAGE_MAPPER_KEYS=["_codexUsageCarrier","session_id","seq","turn_index","role","record_type","disposition","ts","duration_ms","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_usd","content_text","cwd","provenance","run_id","task_wbs","request_id"],TOOL_CALL_MAPPER_KEYS=["_messageSplitIndex","session_id","seq","tool_name","call_id","args_digest","args_raw","status","started_at","completed_at","duration_ms","result_bytes","error_text"],SKILL_CALL_MAPPER_KEYS=["_messageSplitIndex","session_id","seq","skill_name","invocation_kind","skill_path","args_raw","args_digest","call_id","status","started_at","completed_at","duration_ms","capability_kind","evidence_kind","invocation_id","origin_identity","_capabilityConflict"];function identityFieldMap(keys){let map2={};for(let key of keys)map2[key]=key;return map2}var HARNESS_SKILL_PACKAGES=new Set(["sp","rd3"]);function canonicalizeSkillName(raw){let name=raw.trim();if(name.startsWith("/")||name.startsWith("$"))name=name.slice(1);if(name.startsWith("skill:"))name=name.slice(6);let canonical=name.match(/^([a-z][a-z0-9]*):([a-z0-9-]+)$/);if(canonical!==null&&HARNESS_SKILL_PACKAGES.has(canonical[1]??""))return name;let dialect=name.match(/^([a-z][a-z0-9]*)-([a-z0-9-]+)$/);if(dialect!==null&&HARNESS_SKILL_PACKAGES.has(dialect[1]??""))return`${dialect[1]}:${dialect[2]}`;return name}function extractSkillCalls(raw,context,identity){switch(context?.source){case"claude":return detectClaudeSkillCalls(raw,identity,context);case"pi":return detectPiSkillCalls(raw,identity,context);case"omp":return detectOmpSkillCalls(raw,identity,context);case"codex":return detectCodexSkillCalls(raw,identity,context);case"agy":return detectAgySkillCalls(raw,identity,context);case"gemini":return detectGeminiSkillCalls(raw,identity,context);case"grok":return detectGrokSkillCalls(raw,identity,context);default:return[]}}function skillCallEntry(record2){return{targetTable:"history_skill_call",record:record2}}function skillRecord(identity,skillName,invocationKind,extra={}){return{_messageSplitIndex:identity.messageSplitIndex,session_id:identity.sessionId,seq:identity.seq,skill_name:canonicalizeSkillName(skillName),invocation_kind:invocationKind,skill_path:null,args_raw:null,args_digest:null,call_id:null,status:"unknown",started_at:null,completed_at:null,duration_ms:null,capability_kind:null,evidence_kind:null,invocation_id:null,origin_identity:null,...extra}}function createOrdinalAllocator(){let ordinals=new Map;return(key)=>{let existing=ordinals.get(key);if(existing!==void 0)return existing;let ordinal=ordinals.size;return ordinals.set(key,ordinal),ordinal}}function originFields(context,canonicalName,observable){let origins=context?.capabilityOrigins;if(origins===void 0||origins.length===0)return{capability_kind:null,origin_identity:null,_capabilityConflict:void 0};let match=matchCapabilityOrigin(origins,context?.source??"",canonicalName,observable);return{capability_kind:match.origin?.capabilityKind??null,origin_identity:match.origin?.originIdentity??null,_capabilityConflict:match.conflict??void 0}}function invocationIdFor(context,sessionId,ref){let source=context?.source??"unknown";if(ref.invocationId!==void 0)return capabilityInvocationId({source,sessionId,kind:"invocation",id:ref.invocationId});if(ref.callId!==void 0)return capabilityInvocationId({source,sessionId,kind:"call",id:ref.callId,ordinal:ref.ordinal>0?ref.ordinal:void 0});if(ref.recordId!==void 0)return capabilityInvocationId({source,sessionId,kind:"record",id:ref.recordId,ordinal:ref.ordinal});return capabilityInvocationId({source,sessionId,kind:"line",file:context?.sourceFile??"",line:context?.sourceLine??0,ordinal:ref.ordinal})}function skillNameFromPath(path){let normalized=path.replace(/\\/g,"/"),bySkillsSegment=normalized.match(/\/skills\/([^/]+)\/SKILL\.md$/i);if(bySkillsSegment!==null)return bySkillsSegment[1]??"";let stem=normalized.slice(0,normalized.length-9);return stem.split("/").pop()??stem}function detectClaudeSkillCalls(raw,identity,context){let contentBlocks=raw.content??o(raw.message).content;if(!Array.isArray(contentBlocks))return[];let rows=[],role=mapRole(raw.type??o(raw.message).role),recordId=s(raw.uuid,raw.id,raw.requestId),ts=timestampOf(raw.timestamp,raw.ts,o(raw.message).timestamp)??null,ordinal=createOrdinalAllocator();for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let b=block;if(b.type!=="tool_use")continue;let input=b.input??{},callId=s(b.id),invocation=callId!==void 0?{callId,ordinal:0}:{recordId,ordinal:ordinal(`tool:${rows.length}`)};if(b.name==="Skill"){let skill=s(input.skill);if(skill===void 0)continue;let canonical=canonicalizeSkillName(skill);rows.push(skillRecord(identity,skill,s(o(b.caller).type)==="direct"?"user":"model",{args_raw:maybeArgsRaw("claude","Skill",input)??null,args_digest:argsDigest(input),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,invocation),...originFields(context,canonical,{})}));continue}if(b.name==="Task"){let subagent=s(input.subagent_type,input.agent_type,input.agent)??"subagent";rows.push(skillRecord(identity,subagent,"model",{args_raw:maybeArgsRaw("claude","Task",input)??null,args_digest:argsDigest(input),call_id:callId??null,started_at:ts,...originFields(context,canonicalizeSkillName(subagent),{}),capability_kind:"subagent",evidence_kind:"delegation",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,invocation)}));continue}if(b.name==="Read"){let filePath=s(input.file_path,input.path);if(filePath===void 0||lastPathSegmentNorm(filePath)!=="SKILL.md")continue;let canonical=canonicalizeSkillName(skillNameFromPath(filePath));rows.push(skillRecord(identity,skillNameFromPath(filePath),"model",{skill_path:filePath,args_raw:maybeArgsRaw("claude","Read",input)??null,args_digest:argsDigest(input),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,invocation),...originFields(context,canonical,{skillPath:filePath})}));continue}if(b.name==="Bash"){let command=s(input.command);if(command===void 0)continue;let targets=parseLiteralReadTargets(command);for(let i=0;i<targets.length;i+=1){let target=targets[i]??"",canonical=canonicalizeSkillName(skillNameFromPath(target));rows.push(skillRecord(identity,skillNameFromPath(target),"model",{skill_path:target,args_raw:maybeArgsRaw("claude","Bash",input)??null,args_digest:argsDigest(input),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{...invocation,ordinal:i}),...originFields(context,canonical,{skillPath:target})}))}}}if(role==="user"){let text=extractUserTextClaude(contentBlocks);if(text!==void 0){let rawName=leadingInjectionMatch(text,CLAUDE_COMMAND_NAME_ANCHORED)?.[1]??"";if(rawName.length>0){let canonical=canonicalizeSkillName(rawName);if(canonical.length>0)rows.push(skillRecord(identity,canonical,"user",{args_raw:text.match(CLAUDE_COMMAND_ARGS)?.[1]?.trim()||null,started_at:ts,capability_kind:"command",evidence_kind:"request",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:ordinal(`cmd:${canonical}`)})}))}}}return rows}var CLAUDE_COMMAND_NAME_ANCHORED=/^<command-name>([^<]+)<\/command-name>/,CLAUDE_COMMAND_ARGS=/<command-args>([\s\S]*?)<\/command-args>/;function extractUserTextClaude(contentBlocks){let parts=[];for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let b=block;if(b.type==="tool_result")continue;if(typeof b.text==="string")parts.push(b.text)}return parts.length>0?parts.join(`
|
|
537
|
+
`):void 0}function lastPathSegmentNorm(path){let normalized=path.replace(/\\/g,"/"),idx=normalized.lastIndexOf("/");return idx===-1?normalized:normalized.slice(idx+1)}function isQuotedSignatureContext(text,matchIndex){let lineStart=text.lastIndexOf(`
|
|
538
|
+
`,matchIndex-1)+1;if(text.slice(lineStart,matchIndex).trim().length>0)return!0;let openFence="";for(let line of text.slice(0,lineStart).split(`
|
|
539
|
+
`)){let fence=/^\s{0,3}(`{3,}|~{3,})/.exec(line);if(fence===null)continue;let run=fence[1]??"";if(openFence==="")openFence=run;else if(run[0]===openFence[0]&&run.length>=openFence.length)openFence=""}return openFence!==""}function isCodexMarkerLine(line){let trimmed=line.trim();return CODEX_DOLLAR_MARKER.test(trimmed)||CODEX_SLASH_MARKER.test(trimmed)||/^-\s+skill:\s*\S+/.test(trimmed)}function isCodexWrapperLeadPosition(text,matchIndex,chainStart){let before=text.slice(0,matchIndex);if(before.trim().length===0)return!0;if(chainStart!==void 0&&text.slice(chainStart,matchIndex).trim().length===0)return!0;let lines=before.split(`
|
|
540
|
+
`);if((lines[lines.length-1]??"").trim().length>0)return!1;if(lines.length<2)return!1;return isCodexMarkerLine(lines[lines.length-2]??"")}function leadingInjectionMatch(text,pattern){let trimmed=text.trimStart(),offset=text.length-trimmed.length,match=trimmed.match(pattern);if(match===null||match.index===void 0)return null;if(isQuotedSignatureContext(text,offset+match.index))return null;return match}var PI_SKILL_WRAPPER_ANCHORED=/^<skill\s+name="([^"]+)"(?:\s+location="([^"]*)")?\s*>/,READ_FAMILY_TOOLS=new Set(["read","read_file","view"]);function detectPiSkillCalls(raw,identity,context){let msg=raw.message,role=piRole(msg?.role??raw.role??raw.recordType??raw.type),recordId=s(raw.id,raw.uuid,raw.requestId),ts=timestampOf(raw.timestamp,raw.ts,o(msg).timestamp)??null,rows=[];if(role==="user"){let text=extractContentText(msg?.content??raw.content);if(text===void 0)return[];let ordinal=createOrdinalAllocator(),wrapper=leadingInjectionMatch(text,PI_SKILL_WRAPPER_ANCHORED);if(wrapper!==null){let skillPath=wrapper[2]||null,canonical=canonicalizeSkillName(wrapper[1]??"");if(canonical.length>0)rows.push(skillRecord(identity,canonical,"user",{skill_path:skillPath,started_at:ts,evidence_kind:"load",status:"ok",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:ordinal(`skill:${canonical}`)}),...originFields(context,canonical,{skillPath})}))}return rows}if(role==="assistant"){let contentBlocks=msg?.content??raw.content;if(!Array.isArray(contentBlocks))return[];for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let call=normalizeOmpToolCall(block);if(call===null||!READ_FAMILY_TOOLS.has(String(call.name??"")))continue;let args=call.input??call.arguments??{},filePath=s(args.filePath,args.file_path,args.path,args.target_file);if(filePath===void 0||lastPathSegmentNorm(filePath)!=="SKILL.md")continue;let callId=s(call.id),canonical=canonicalizeSkillName(skillNameFromPath(filePath));rows.push(skillRecord(identity,canonical,"model",{skill_path:filePath,args_raw:maybeArgsRaw("pi",String(call.name??"read"),args)??null,args_digest:argsDigest(args),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId,recordId:callId===void 0?recordId:void 0,ordinal:rows.length}),...originFields(context,canonical,{skillPath:filePath})}))}}return rows}function detectOmpSkillCalls(raw,identity,context){let msg=raw.message,role=mapRole(msg?.role??raw.type??raw.role),recordId=s(raw.id,raw.uuid,raw.requestId),ts=timestampOf(raw.timestamp,raw.ts,o(msg).timestamp)??null,rows=[];if(role==="assistant"){let contentBlocks=msg?.content??raw.content;if(!Array.isArray(contentBlocks))return[];for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null)continue;let input=call.input??call.arguments;if(call.name==="Skill"){let skill=s(input?.skill);if(skill===void 0)continue;let callId=s(call.id);rows.push(skillRecord(identity,skill,"model",{args_raw:maybeArgsRaw("omp","Skill",input)??null,args_digest:argsDigest(input),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId,recordId:callId===void 0?recordId:void 0,ordinal:rows.length}),...originFields(context,canonicalizeSkillName(skill),{})}));continue}if(READ_FAMILY_TOOLS.has(String(call.name??""))){let args=input??{},filePath=s(args.filePath,args.file_path,args.path,args.target_file);if(filePath===void 0||lastPathSegmentNorm(filePath)!=="SKILL.md")continue;let callId=s(call.id),canonical=canonicalizeSkillName(skillNameFromPath(filePath));rows.push(skillRecord(identity,canonical,"model",{skill_path:filePath,args_raw:maybeArgsRaw("omp",String(call.name??"read"),args)??null,args_digest:argsDigest(args),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId,recordId:callId===void 0?recordId:void 0,ordinal:rows.length}),...originFields(context,canonical,{skillPath:filePath})}))}}return rows}if(role==="user"){let text=extractContentText(msg?.content??raw.content);if(text===void 0)return[];let ordinal=createOrdinalAllocator(),wrapper=leadingInjectionMatch(text,PI_SKILL_WRAPPER_ANCHORED);if(wrapper!==null){let skillPath=wrapper[2]||null,canonical=canonicalizeSkillName(wrapper[1]??"");if(canonical.length>0)rows.push(skillRecord(identity,canonical,"user",{skill_path:skillPath,started_at:ts,evidence_kind:"load",status:"ok",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:ordinal(`skill:${canonical}`)}),...originFields(context,canonical,{skillPath})}))}}return rows}var CODEX_SKILL_BLOCK=/<skill>\s*<name>([^<]+)<\/name>\s*<path>([^<]+)<\/path>([\s\S]*?)<\/skill>/g,CODEX_DOLLAR_MARKER=/^\$([a-z][a-z0-9]*(?:-[a-z0-9]+)*)(?![\w./:])/,CODEX_SLASH_MARKER=/^\/([a-z][a-z0-9]*(?:-[a-z0-9]+)*)(?![\w./:])/,CODEX_SHELL_TOOLS=new Set(["shell","exec_command","exec"]);function detectCodexSkillCalls(raw,identity,context){let payload=raw.payload??raw,recordType=String(raw.type??""),payloadType=String(payload.type??""),role;if(recordType==="response_item")role=payloadType==="message"?mapRole(payload.role):payloadType==="agent_message"?"assistant":payloadType==="function_call"||payloadType==="custom_tool_call"?"tool":"meta";else if(recordType==="user"||recordType==="assistant")role=mapRole(recordType);else if(recordType==="message")role=mapRole(raw.role??payload.role);else return[];if(role==="tool"){let toolName=String(payload.name??"");if(!CODEX_SHELL_TOOLS.has(toolName)&&!toolName.endsWith(".exec"))return[];let callId=s(payload.call_id,payload.id),argsText=s(payload.arguments,payload.input);if(argsText===void 0)return[];let rows2=[],ts2=timestampOf(raw.timestamp,raw.ts,payload.created_at)??null,command=null;try{let parsed=JSON.parse(argsText);if(typeof parsed==="object"&&parsed!==null){let cmd=parsed.command;if(typeof cmd==="string")command=cmd;else if(Array.isArray(cmd))command=cmd.filter((c)=>typeof c==="string").join(" ")}}catch{command=null}let pushRead=(target,ordinal2)=>{let canonical=canonicalizeSkillName(skillNameFromPath(target));rows2.push(skillRecord(identity,canonical,"model",{skill_path:target,args_raw:argsText,args_digest:sha256Text(argsText),call_id:callId??null,started_at:ts2,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId:callId??recordIdFallback(raw),ordinal:ordinal2}),...originFields(context,canonical,{skillPath:target})}))};if(command!==null)for(let i=0;i<parseLiteralReadTargets(command).length;i+=1)pushRead(parseLiteralReadTargets(command)[i]??"",i);let nestedLiterals=extractNestedExecCommandLiterals(argsText),nestedOrdinal=0;for(let literal2 of nestedLiterals)for(let target of parseLiteralReadTargets(literal2))pushRead(target,1000+nestedOrdinal),nestedOrdinal+=1;return rows2}if(role!=="user")return[];let text=extractContentText(payload.content??raw.content)??s(payload.text,raw.text);if(text===void 0)return[];let rows=[],recordId=s(raw.id,payload.id,raw.uuid),ts=timestampOf(raw.timestamp,raw.ts)??null,ordinal=createOrdinalAllocator(),wrappers=[],acceptedWrapperEnd;for(let match of text.matchAll(CODEX_SKILL_BLOCK)){let start=match.index??0;if(isQuotedSignatureContext(text,start))continue;if(!isCodexWrapperLeadPosition(text,start,acceptedWrapperEnd))continue;acceptedWrapperEnd=start+match[0].length;let body=(match[3]??"").trim(),skillPath=match[2]||null;wrappers.push({name:canonicalizeSkillName(match[1]??""),path:skillPath,digest:body.length>0?sha256Text(body):null})}let wrapperOccurrences=new Map;for(let wrapper of wrappers){let occurrence=(wrapperOccurrences.get(wrapper.name)??0)+1;wrapperOccurrences.set(wrapper.name,occurrence);let ordinalKey=occurrence===1?`skill:${wrapper.name}`:`skill:${wrapper.name}#${occurrence}`;rows.push(skillRecord(identity,wrapper.name,"user",{skill_path:wrapper.path,args_digest:wrapper.digest,started_at:ts,evidence_kind:"load",status:"ok",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:ordinal(ordinalKey)}),...originFields(context,wrapper.name,{skillPath:wrapper.path,artifactDigest:wrapper.digest})}))}let leadingMarker=text.match(CODEX_DOLLAR_MARKER)??text.match(CODEX_SLASH_MARKER);if(leadingMarker!==null){let markerName=canonicalizeSkillName(leadingMarker[1]??"");rows.push(skillRecord(identity,markerName,"user",{started_at:ts,evidence_kind:"request",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:ordinal(`skill:${markerName}`)}),...originFields(context,markerName,{})}))}return rows}function recordIdFallback(raw){return s(raw.id,raw.uuid)??"codex-record"}function detectAgySkillCalls(raw,identity,context){let recordType=String(raw.type??""),recordId=s(raw.id,raw.event_id,raw.request_id),ts=timestampOf(raw.created_at,raw.timestamp,raw.ts)??null,rows=[];if(recordType==="PLANNER_RESPONSE"&&Array.isArray(raw.tool_calls))for(let tc of raw.tool_calls){let tool=s(tc.name,tc.tool_name);if(tool==="view_file"){let args=tc.args??tc.arguments??{};if(args.toolAction!=="Viewing skill file")continue;let path=s(args.AbsolutePath,args.absolute_path);if(path===void 0||lastPathSegmentNorm(path)!=="SKILL.md")continue;let skillName=s(args.toolSummary)?.match(/SKILL\.md for (.+)$/)?.[1]??skillNameFromPath(path),canonical=canonicalizeSkillName(skillName),callId=s(tc.id,tc.call_id);rows.push(skillRecord(identity,canonical,"model",{skill_path:path,args_raw:maybeArgsRaw("agy","view_file",args)??null,args_digest:argsDigest(args),call_id:callId??null,started_at:ts,evidence_kind:"load",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId,recordId:callId===void 0?recordId:void 0,ordinal:rows.length}),...originFields(context,canonical,{skillPath:path})}));continue}if(tool==="INVOKE_SUBAGENT"){let args=tc.args??tc.arguments??{},subagent=s(args.subagent_type,args.subagent,args.agent_name,args.agent,args.name)??"subagent",callId=s(tc.id,tc.call_id);rows.push(skillRecord(identity,subagent,"model",{args_raw:maybeArgsRaw("agy","INVOKE_SUBAGENT",args)??null,args_digest:argsDigest(args),call_id:callId??null,started_at:ts,...originFields(context,canonicalizeSkillName(subagent),{}),capability_kind:"subagent",evidence_kind:"delegation",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{callId,recordId:callId===void 0?recordId:void 0,ordinal:rows.length})}))}}if(recordType==="slash_command"){let display=s(raw.display);if(display!==void 0){let commandName=s(raw.command,raw.name)??display.match(/(?:^|\s)\/([a-z][a-z0-9:-]*)/)?.[1];if(commandName!==void 0)rows.push(skillRecord(identity,canonicalizeSkillName(commandName),"user",{started_at:ts,capability_kind:"command",evidence_kind:"request",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:0})}))}}return rows}var GEMINI_L0_PREFIX=/^\s*\/((?:sp|rd3)-[a-z0-9-]+)/;function detectGeminiSkillCalls(raw,identity,context){if(String(raw.type??"")!=="user")return[];let content=geminiContent(raw);if(content===null)return[];let match=content.match(GEMINI_L0_PREFIX);if(match===null)return[];let canonical=canonicalizeSkillName(match[1]??""),recordId=s(raw.id,raw.uuid),ts=timestampOf(raw.timestamp,raw.ts)??null;return[skillRecord(identity,canonical,"user",{started_at:ts,evidence_kind:"request",status:"unknown",invocation_id:invocationIdFor(context,identity.sessionId,{recordId,ordinal:0}),...originFields(context,canonical,{})})]}function detectGrokSkillCalls(raw,identity,context){let n=normalizeGrokRecord(raw);if(n.recordType!=="tool_call"||n.toolName!=="read_file")return[];let meta3=n.body._meta??raw._meta??{};if(o(meta3["x.ai/tool"]).namespace!=="grok_build")return[];let targetFile=s(o(n.toolArgs).target_file);if(targetFile===void 0||lastPathSegmentNorm(targetFile)!=="SKILL.md")return[];let canonical=canonicalizeSkillName(skillNameFromPath(targetFile)),recordId=s(n.body.id,raw.id,raw.uuid),callId=s(n.body.call_id,n.body.itemId,recordId),status=grokOutcomeStatus(typeof n.body.status==="string"?n.body.status:void 0);return[skillRecord(identity,canonical,"model",{skill_path:targetFile,args_raw:maybeArgsRaw("grok","read_file",n.toolArgs)??null,args_digest:argsDigest(n.toolArgs),call_id:callId??null,started_at:n.ts??null,status,evidence_kind:"load",invocation_id:invocationIdFor(context,identity.sessionId,{callId,ordinal:0}),...originFields(context,canonical,{skillPath:targetFile})})]}function grokOutcomeStatus(toolStatus){let value=String(toolStatus??"").toLowerCase();if(value==="ok"||value==="success"||value==="done"||value==="completed")return"ok";if(value==="error"||value==="failed")return"error";return"unknown"}function argsDigest(args){let redacted=redactArgs(args);return sha256(redacted)}function redactArgs(args){if(typeof args==="string"){if(args.length>80)return"[REDACTED:long]";if(/[A-Za-z0-9+/]{40,}=*|[A-Za-z0-9_-]{20,}/.test(args))return"[REDACTED:secret]";return args}if(Array.isArray(args))return args.map(redactArgs);if(args!==null&&typeof args==="object"){let result={};for(let[key,value]of Object.entries(args))result[key]=redactArgs(value);return result}return args}var BASH_COMMAND_MAX_CHARS=8192,GENERIC_ARGS_MAX_CHARS=8192;function bashCommandOf(args){if(args===null||typeof args!=="object")return;let rec=args,command=rec.command??rec.CommandLine??rec.cmd??rec.script;if(typeof command==="string")return command;if(Array.isArray(command))return command.map(String).join(" ");return}var BULKY_PAYLOAD_KEYS=new Set(["content","codecontent","replacementcontent","targetcontent","filedata","buffer","blob","image","imagebase64"]);function normalizeKey(key){return key.toLowerCase().replace(/[^a-z0-9]/g,"")}function isShellTool(toolName){return/^(?:bash|shell|cmd|command|exec|execcommand|executecommand|runcommand|shellcommand|runshellcommand)$/.test(normalizeKey(toolName))}function sanitizeValue(value){if(typeof value==="string")return value.length>1000?`${value.slice(0,1000)}[truncated ${value.length} chars]`:value;if(Array.isArray(value))return value.map(sanitizeValue);if(value!==null&&typeof value==="object"){let out={};for(let[key,entry]of Object.entries(value))out[key]=typeof entry==="string"&&entry.length>120&&BULKY_PAYLOAD_KEYS.has(normalizeKey(key))?`[omitted ${entry.length} chars]`:sanitizeValue(entry);return out}return value}function serializeBounded(value){let serialized=JSON.stringify(sanitizeValue(value));if(serialized.length<=GENERIC_ARGS_MAX_CHARS)return serialized;let preview=serialized;for(;;){let wrapper=JSON.stringify({_truncated:!0,omittedChars:serialized.length-preview.length,preview});if(wrapper.length<=GENERIC_ARGS_MAX_CHARS)return wrapper;preview=preview.slice(0,preview.length-(wrapper.length-GENERIC_ARGS_MAX_CHARS))}}function maybeArgsRaw(_source,toolName,args){if(args===void 0||args===null)return;let value=args;if(typeof args==="string")try{value=JSON.parse(args)}catch{return args.length>BASH_COMMAND_MAX_CHARS?args.slice(0,BASH_COMMAND_MAX_CHARS):args}if(value!==null&&typeof value==="object"){let cmd=bashCommandOf(value);if(cmd!==void 0&&isShellTool(toolName))return cmd.length>BASH_COMMAND_MAX_CHARS?cmd.slice(0,BASH_COMMAND_MAX_CHARS):cmd;return serializeBounded(value)}return JSON.stringify(value)}function claudeSplit(raw,context){let entries=[],sessionId=s(raw.sessionId,raw.conversation_uuid)??"unknown",seq=typeof raw.seq==="number"?raw.seq:typeof raw.messageIndex==="number"?raw.messageIndex:0,ts=timestampOf(raw.ts,raw.timestamp,raw.createdAt),role=mapRole(raw.type??raw.role),recordType=String(raw.type??""),model=s(raw.model,o(raw.message).model),cwd=s(raw.cwd,raw.dir);if(raw.subtype==="turn_duration"&&typeof raw.durationMs==="number")return entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role:"system",record_type:"turn_duration",disposition:"meta",ts,duration_ms:raw.durationMs,content_text:null,provenance:"ambient"}}),entries;if(recordType==="attachment"||recordType.startsWith("file-history"))return entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}),entries;let usage=typeof raw.usage==="object"&&raw.usage!==null?raw.usage:o(raw.message).usage,inputTokens=raw.inputTokens??usage?.input_tokens,outputTokens=raw.outputTokens??usage?.output_tokens,cacheRead=usage?.cacheReadTokens??usage?.cache_read_tokens??usage?.cache_read_input_tokens,cacheWrite=usage?.cacheWriteTokens??usage?.cache_write_tokens??usage?.cache_creation_input_tokens,costUsd=computeCost(inputTokens,outputTokens,model),contentBlocks=raw.content??o(raw.message).content,contentText=extractContentText(contentBlocks),messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,turn_index:typeof raw.turnIndex==="number"?raw.turnIndex:void 0,role,record_type:recordType,disposition:"keep",ts,duration_ms:void 0,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:contentText??null,cwd:cwd??null,provenance:"ambient",request_id:s(raw.requestId)??null}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){if(typeof block!=="object"||block===null)continue;let b=block;if(b.type==="tool_use")entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,call_id:s(b.id),tool_name:String(b.name??""),args_digest:argsDigest(b.input),args_raw:maybeArgsRaw("claude",String(b.name??""),b.input),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function piSplit(raw,context){let msg=raw.message,recordType=String(raw.type??raw.recordType??""),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??(typeof raw.seq==="number"?raw.seq:0),ts=timestampOf(raw.timestamp,raw.createdAt,raw.ts);if(recordType==="title"||recordType==="title_change"||recordType==="service_tier_change"||recordType==="session_info"||recordType==="ttsr_injection"||recordType==="session_init"||recordType==="session"||recordType==="model_change"||recordType==="thinking_level_change"||recordType==="compaction"||recordType==="custom"||recordType==="custom_message"||recordType.startsWith("custom."))return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}];let entries=[],role=piRole(msg?.role??raw.role??recordType),model=s(raw.model,o(msg).model),cwd=s(raw.cwd,raw.dir),usage=msg?.usage??raw.usage,inputTokens=usage?.input??usage?.input_tokens??void 0,outputTokens=usage?.output??usage?.output_tokens??void 0,cacheRead=usage?.cacheRead??usage?.cache_read_tokens??void 0,cacheWrite=usage?.cacheWrite??usage?.cache_write_tokens??void 0,costObj=msg?.cost??raw.cost,costUsd=typeof costObj?.total==="number"?costObj.total:computeCost(inputTokens,outputTokens,model),contentBlocks=msg?.content??raw.content,durationMs=typeof msg?.duration==="number"&&Number.isFinite(msg.duration)?msg.duration:void 0,messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:durationMs,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:extractContentText(contentBlocks)??s(raw.content,raw.text,msg?.content)??null,cwd:cwd??null,provenance:"ambient"}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null)continue;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:String(call.name??""),call_id:s(call.id),args_digest:argsDigest(call.input??call.arguments),args_raw:maybeArgsRaw("pi",String(call.name??""),call.input??call.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function piRole(type){let t=String(type??"").toLowerCase();if(t==="toolresult"||t==="tool_result"||t==="bashexecution"||t==="tool")return"user";let mapped=mapRole(t);if(mapped==="user"||mapped==="assistant"||mapped==="system")return mapped;return"unknown"}function ompSplit(raw,context){let msg=raw.message,recordType=String(raw.type??""),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??(typeof raw.seq==="number"?raw.seq:0),ts=timestampOf(raw.ts,raw.timestamp,raw.createdAt);if(recordType==="title"||recordType==="title_change"||recordType==="service_tier_change"||recordType==="ttsr_injection"||recordType==="session_init"||recordType==="session"||recordType==="model_change"||recordType==="thinking_level_change"||recordType==="compaction"||recordType==="custom"||recordType==="custom_message"||recordType.startsWith("custom."))return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,provenance:"ambient"}}];let entries=[],role=mapRole(msg?.role??raw.type??raw.role),model=s(raw.model,o(msg).model),cwd=s(raw.cwd,raw.dir),usage=msg?.usage??raw.usage,inputTokens=usage?.input??usage?.input_tokens??void 0,outputTokens=usage?.output??usage?.output_tokens??void 0,cacheRead=usage?.cacheRead??usage?.cache_read_tokens??void 0,cacheWrite=usage?.cacheWrite??usage?.cache_write_tokens??void 0,costObj=msg?.cost??raw.cost,costUsd=typeof costObj?.total==="number"?costObj.total:computeCost(inputTokens,outputTokens,model),contentBlocks=msg?.content??raw.content,durationMs=typeof msg?.duration==="number"&&Number.isFinite(msg.duration)?msg.duration:void 0,messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:durationMs,model:model??null,input_tokens:inputTokens??null,output_tokens:outputTokens??null,cache_read_tokens:cacheRead??null,cache_write_tokens:cacheWrite??null,cost_usd:costUsd??null,content_text:extractContentText(contentBlocks)??s(raw.content,raw.text,msg?.content)??null,cwd:cwd??null,provenance:"ambient"}}),Array.isArray(contentBlocks)&&role==="assistant")for(let block of contentBlocks){let call=normalizeOmpToolCall(block);if(call===null)continue;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:String(call.name??""),call_id:s(call.id),args_digest:argsDigest(call.input??call.arguments),args_raw:maybeArgsRaw("omp",String(call.name??""),call.input??call.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function normalizeOmpToolCall(block){if(typeof block!=="object"||block===null)return null;let nested=o(block.toolCall);if(Object.keys(nested).length>0)return nested;if(block.type==="toolCall")return block;return null}function codexSplit(raw,context){let entries=[],payload=raw.payload??raw,seq=typeof raw.seq==="number"?raw.seq:0,ts=timestampOf(raw.timestamp,raw.ts,payload.ts),recordType=String(raw.type??""),payloadType=String(payload.type??""),isShortFormat=recordType===""&&raw.id!==void 0&&raw.timestamp!==void 0&&raw.instructions!==void 0,explicitSessionId=s(raw.session_id,o(raw.session_meta).id);if(explicitSessionId===void 0&&recordType==="session_meta")explicitSessionId=s(payload.id,o(raw.payload).id);if(explicitSessionId===void 0&&isShortFormat)explicitSessionId=s(raw.id);let pathSessionId=context?.sourceFile?sessionIdFromSourcePath("codex",context.sourceFile):void 0,sessionId=explicitSessionId??pathSessionId??"unknown";if(isShortFormat)return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:"short_format",disposition:"meta",ts,provenance:"ambient"}}];let role,disposition,contentText,usage;if(recordType==="response_item")if(payloadType==="message")role=mapRole(payload.role),disposition="keep",contentText=extractContentText(payload.content)??s(payload.text)??null;else if(payloadType==="agent_message")role="assistant",disposition="keep",contentText=extractContentText(payload.content)??s(payload.text,payload.message)??null;else if(payloadType==="reasoning")role="assistant",disposition="keep",contentText=extractContentText(payload.summary)??s(payload.text)??null;else if(payloadType==="function_call"||payloadType==="custom_tool_call")role="tool",disposition="keep",contentText=null;else role="meta",disposition="meta",contentText=s(payload.text)??null;else if(recordType==="user"||recordType==="assistant")role=mapRole(recordType),disposition="keep",contentText=extractContentText(payload.content)??s(raw.content,payload.text)??null;else if(recordType==="message")role=mapRole(raw.role??payload.role),disposition="keep",contentText=extractContentText(payload.content??raw.content)??s(payload.text,raw.text)??null;else if(recordType==="event_msg")role="meta",disposition="meta",contentText=s(payload.message,payload.text)??null,usage=o(o(payload.info).last_token_usage);else role="meta",disposition="meta",contentText=s(payload.text,raw.instructions)??null;let model=s(raw.model,payload.model,o(o(raw.turn_context).payload).model),cwd=s(raw.cwd,raw.dir),tokenCount=payload.token_count,usageInput=usage?.input_tokens??tokenCount?.input??tokenCount?.input_tokens??void 0,usageOutput=usage?.output_tokens??tokenCount?.output??tokenCount?.output_tokens??void 0,cacheRead=usage?.cached_input_tokens??void 0,turnPayload=raw.turn_context?.payload,turnInputTokens=turnPayload?.input_tokens,turnOutputTokens=turnPayload?.output_tokens,finalInput=usageInput!==void 0?usageInput:turnInputTokens,finalOutput=usageOutput!==void 0?usageOutput:turnOutputTokens,costUsd=computeCost(finalInput,finalOutput,model),usageCarrier=finalInput!==void 0||finalOutput!==void 0?{input:finalInput??null,output:finalOutput??null,cacheRead:cacheRead??null}:void 0,stripUsage=role==="meta"&&usageCarrier!==void 0,messageSplitIndex=entries.length;entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition,ts,duration_ms:void 0,model:model??null,input_tokens:stripUsage?null:finalInput??null,output_tokens:stripUsage?null:finalOutput??null,cache_read_tokens:stripUsage?null:cacheRead??null,...usageCarrier!==void 0?{_codexUsageCarrier:usageCarrier}:{},cache_write_tokens:null,cost_usd:costUsd??null,content_text:contentText,cwd:cwd??null,provenance:"ambient"}});let toolItems=[];if((recordType==="response_item"||recordType==="function_call"||recordType==="custom_tool_call")&&(payloadType==="function_call"||payloadType==="custom_tool_call"))toolItems.push(payload);else if(payload.response_item)toolItems.push(payload.response_item);else if(Array.isArray(payload.response_items))toolItems.push(...payload.response_items);for(let item of toolItems){let fc=item.function_call??item,toolName=s(fc.name)??"",args=fc.arguments??fc.input;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq,tool_name:toolName,call_id:s(fc.call_id),args_digest:argsDigest(args),args_raw:maybeArgsRaw("codex",toolName,args),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function agySplit(raw,context){let entries=[],recordType=String(raw.type??""),explicitSessionId=s(raw.session_id,raw.conversation_id,raw.conversationId),pathSessionId=context?.sourceFile?sessionIdFromSourcePath("agy",context.sourceFile):void 0,sessionId=explicitSessionId??pathSessionId??"unknown",seq=typeof raw.seq==="number"?raw.seq:typeof raw.step_index==="number"?raw.step_index:context?.sourceLine??0,ts=timestampOf(raw.created_at,raw.timestamp,raw.ts),role,disposition,contentText=null,messageRecordType=recordType;if(raw.display!==void 0)role="user",disposition="keep",contentText=s(raw.display)??null,messageRecordType=recordType.length>0?recordType:"USER_INPUT";else switch(recordType){case"USER_INPUT":case"ASK_QUESTION":role="user",disposition="keep",contentText=s(raw.content,raw.text,raw.message)??null;break;case"PLANNER_RESPONSE":role="assistant",disposition="keep",contentText=s(raw.content,raw.text,raw.message,raw.plan)??null;break;case"ERROR_MESSAGE":role="system",disposition="keep",contentText=s(raw.content,raw.text,raw.message)??null;break;case"RUN_COMMAND":case"VIEW_FILE":case"GREP_SEARCH":case"LIST_DIRECTORY":case"READ_URL_CONTENT":role="tool",disposition="keep",contentText=s(raw.content,raw.command,raw.file_path,raw.pattern)??null;break;case"CODE_ACTION":case"INVOKE_SUBAGENT":role="tool",disposition="keep",contentText=s(raw.content,raw.text)??null;break;case"CONVERSATION_HISTORY":case"CHECKPOINT":case"GENERIC":role="meta",disposition="meta",contentText=s(raw.content,raw.text)??null;break;default:if(recordType.length===0)role="unknown",disposition="unknown";else role="meta",disposition="meta",contentText=s(raw.content,raw.text)??null;break}let messageSplitIndex=entries.length;if(entries.push({targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:messageRecordType,disposition,ts,duration_ms:void 0,model:null,input_tokens:null,output_tokens:null,cache_read_tokens:null,cache_write_tokens:null,cost_usd:null,content_text:contentText,cwd:s(raw.workspace,raw.cwd)??null,provenance:"ambient"}}),recordType==="PLANNER_RESPONSE"&&Array.isArray(raw.tool_calls))for(let tc of raw.tool_calls)entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:messageSplitIndex,session_id:sessionId,seq:typeof tc.step_index==="number"?tc.step_index:seq,tool_name:String(tc.name??tc.tool_name??""),args_digest:argsDigest(tc.input??tc.arguments),args_raw:maybeArgsRaw("agy",String(tc.name??tc.tool_name??""),tc.input??tc.arguments),status:"ok",started_at:void 0,completed_at:void 0,duration_ms:void 0,result_bytes:void 0,error_text:void 0}});for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex}))entries.push(skillCallEntry(record2));return entries}function geminiSplit(raw,context){let recordType=String(raw.type??(raw.kind!==void 0?"session":raw.$set!==void 0?"state":"")),state=o(raw.$set),sessionId=sessionIdFromContext(context,raw),seq=context?.sourceLine??0,ts=timestampOf(raw.timestamp,raw.startTime,raw.lastUpdated,state.lastUpdated);if(recordType==="session"||recordType==="state")return[{targetTable:"history_message",record:{session_id:sessionId,seq,role:"meta",record_type:recordType,disposition:"meta",ts,content_text:s(state.summary)??null,provenance:"ambient"}}];let role=recordType==="gemini"?"assistant":recordType==="user"?"user":"system",tokens=o(raw.tokens),content=geminiContent(raw),entries=[{targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",ts,duration_ms:null,model:s(raw.model)??null,input_tokens:numberOrNull(tokens.input),output_tokens:numberOrNull(tokens.output),cache_read_tokens:numberOrNull(tokens.cached),cache_write_tokens:null,cost_usd:null,content_text:content,cwd:null,provenance:"ambient"}}];if(Array.isArray(raw.toolCalls))for(let value of raw.toolCalls){if(value===null||typeof value!=="object"||Array.isArray(value))continue;let tool=value,status=s(tool.status)??"unknown",timestamp=s(tool.timestamp),result=tool.result??tool.resultDisplay;entries.push({targetTable:"history_tool_call",record:{_messageSplitIndex:0,session_id:sessionId,seq,tool_name:s(tool.name,tool.displayName)??"unknown",args_digest:argsDigest(tool.args),args_raw:maybeArgsRaw("gemini",s(tool.name,tool.displayName)??"",tool.args),status,started_at:timestamp,completed_at:timestamp,duration_ms:null,result_bytes:result===void 0?null:new TextEncoder().encode(JSON.stringify(result)).byteLength,error_text:status==="error"?s(tool.resultDisplay,tool.result)??null:null}})}for(let record2 of extractSkillCalls(raw,context,{sessionId,seq,messageSplitIndex:0}))entries.push(skillCallEntry(record2));return entries}function dshSplit(raw,context){let recordType=String(raw.type??"");if(recordType==="session")return[{targetTable:"history_message",record:{session_id:s(raw.id)??sessionIdFromSourcePath("deepseek",context?.sourceFile??"")??"unknown",seq:0,role:"meta",record_type:"session",disposition:"meta",ts:timestampOf(raw.createdAt),cwd:s(raw.cwd)??null,content_text:null,provenance:"ambient"}}];if(recordType!=="user/message"&&recordType!=="assistant/message")return[];let data=o(raw.data),msg=o(data.message),seq=typeof raw.seq==="number"?raw.seq:context?.sourceLine??0,sessionId=sessionIdFromSourcePath("deepseek",context?.sourceFile??"")??"unknown",role=recordType==="user/message"?"user":"assistant",source=o(data.source??msg.source),model=s(source.model,o(data.model??msg.model).model),usage=data.usage??msg.usage,messageId=s(msg.id,data.id);return[{targetTable:"history_message",record:{session_id:sessionId,seq,role,record_type:recordType,disposition:"keep",...messageId!==void 0?{source_record_id:messageId}:{},ts:timestampOf(raw.time,data.time,msg.time),duration_ms:null,model:model??null,input_tokens:numberOrNull(usage?.input_tokens??usage?.input)??null,output_tokens:numberOrNull(usage?.output_tokens??usage?.output)??null,cache_read_tokens:null,cache_write_tokens:null,cost_usd:null,content_text:extractContentText(data.content??msg.content)??s(data.text,msg.text)??null,cwd:null,provenance:"ambient"}}]}var UUID_PATTERN="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}",AGY_BRAIN_REGEX=new RegExp(`(?:^|\\/)brain\\/(${UUID_PATTERN})(?:\\/|$)`,"i"),DSH_SESSION_REGEX=new RegExp(`(?:^|\\/)session-(${UUID_PATTERN})(?:\\/|$)`,"i"),CODEX_ROLLOUT_REGEX=new RegExp(`(?:^|-|_)(${UUID_PATTERN})$`,"i");function sessionIdFromSourcePath(source,sourceFile){let normalized=sourceFile.replace(/\\/g,"/"),sLower=source.toLowerCase();if(sLower==="agy"||sLower==="antigravity")return normalized.match(AGY_BRAIN_REGEX)?.[1];if(sLower==="deepseek")return normalized.match(DSH_SESSION_REGEX)?.[1];if(sLower==="codex"){let basename=normalized.split("/").at(-1)??"";if(basename.startsWith("rollout-")&&basename.endsWith(".jsonl"))return basename.slice(0,-6).match(CODEX_ROLLOUT_REGEX)?.[1]}return}function sessionIdFromContext(context,raw){if(context!==void 0){let file2=context.sourceFile.split("/").at(-1);if(file2!==void 0)return file2.replace(/\.jsonl$/,"")}return s(raw.sessionId,raw.id)??"unknown"}function geminiContent(raw){let content=extractContentText(raw.content)??s(raw.text),thoughts=Array.isArray(raw.thoughts)?raw.thoughts.map((value)=>value!==null&&typeof value==="object"?s(o(value).description):void 0).filter((value)=>value!==void 0).join(`
|
|
528
541
|
`):"";return[content,thoughts].filter((value)=>value!==void 0&&value.length>0).join(`
|
|
529
542
|
`)||null}function numberOrNull(value){return typeof value==="number"&&Number.isFinite(value)?value:null}function normalizeGrokRecord(raw){let params=raw.params,update=params?.update,isUpdatesShape=typeof raw.method==="string"&¶ms!==void 0&&update!==void 0,body=isUpdatesShape?update:raw,recordType=String((isUpdatesShape?update?.sessionUpdate:raw.type)??raw.sessionUpdate??raw.eventType??(raw.file_snapshots!==void 0||raw.after_snapshots!==void 0?"file_snapshot":raw.prompt!==void 0?"user_message":raw.answer!==void 0||raw.question!==void 0?"assistant":"")),sessionId=s(params?.sessionId,raw.session_id,raw.sessionId,raw.parentSessionId,raw.btwSessionId,raw.params?.sessionId)??"unknown",ts=normalizeTs(raw.ts??raw.timestamp??raw.created_at??raw.askedAt??body.ts??body.timestamp),seq=typeof raw.seq==="number"?raw.seq:typeof body.seq==="number"?body.seq:0,meta3=body._meta??params?._meta??raw._meta,model=s(meta3?.modelId,body.model,raw.model),contentText=extractGrokContent(body.content??body.text??raw.content??raw.text??raw.prompt??(raw.answer!==void 0||raw.question!==void 0?[raw.question,raw.answer].filter((value)=>typeof value==="string").join(`
|
|
530
543
|
`):void 0)),usage=body.usage??raw.usage,toolMeta=meta3?.["x.ai/tool"],titleFallback=s(body.title)?.split("`")[0]?.trim(),toolName=s(toolMeta?.name,body.kind,body.tool_name,body.name,raw.tool_name,raw.name)??(titleFallback!==void 0&&titleFallback.length>0&&titleFallback.length<=40?titleFallback:""),toolArgs=body.rawInput??body.input??body.arguments??toolMeta?.input??raw.input??raw.arguments,toolStatus=s(body.status,raw.outcome,raw.status)??"ok",durationMs=typeof body.duration_ms==="number"?body.duration_ms:typeof raw.duration_ms==="number"?raw.duration_ms:typeof usage?.apiDurationMs==="number"?usage.apiDurationMs:void 0,errorText=body.error!==void 0?String(body.error):raw.error!==void 0?String(raw.error):void 0,hasTypeDiscriminator=recordType.length>0||isUpdatesShape;return{recordType,sessionId,ts,seq,body,model,contentText,usage,toolName,toolArgs,toolStatus,durationMs,errorText,hasTypeDiscriminator}}function normalizeTs(value){return timestampOf(value)}function extractGrokContent(content){if(typeof content==="string")return content;if(content!==null&&typeof content==="object"&&!Array.isArray(content)){let c=content;if(typeof c.text==="string")return c.text;if(typeof c.content==="string")return c.content}if(Array.isArray(content)){let parts=[];for(let block of content)if(typeof block==="string")parts.push(block);else if(block!==null&&typeof block==="object"){let b=block;if(typeof b.text==="string")parts.push(b.text)}return parts.length>0?parts.join(`
|
|
@@ -1193,6 +1206,26 @@ CREATE TABLE IF NOT EXISTS history_board_skill_5m (
|
|
|
1193
1206
|
calls INTEGER NOT NULL,
|
|
1194
1207
|
PRIMARY KEY (bucket_start, source, skill_name, invocation_kind)
|
|
1195
1208
|
);
|
|
1209
|
+
CREATE INDEX IF NOT EXISTS idx_history_board_skill_5m_skill_bucket
|
|
1210
|
+
ON history_board_skill_5m (skill_name, bucket_start);
|
|
1211
|
+
`,HISTORY_BOARD_SKILL_5M_CAPABILITY_GRAIN_SCHEMA_SQL=`
|
|
1212
|
+
CREATE TABLE history_board_skill_5m_capability_grain (
|
|
1213
|
+
bucket_start TEXT NOT NULL,
|
|
1214
|
+
source TEXT NOT NULL,
|
|
1215
|
+
skill_name TEXT NOT NULL,
|
|
1216
|
+
invocation_kind TEXT NOT NULL,
|
|
1217
|
+
capability_kind TEXT NOT NULL DEFAULT '',
|
|
1218
|
+
evidence_kind TEXT NOT NULL DEFAULT '',
|
|
1219
|
+
status TEXT NOT NULL DEFAULT '',
|
|
1220
|
+
calls INTEGER NOT NULL,
|
|
1221
|
+
PRIMARY KEY (bucket_start, source, skill_name, invocation_kind, capability_kind, evidence_kind, status)
|
|
1222
|
+
);
|
|
1223
|
+
INSERT INTO history_board_skill_5m_capability_grain
|
|
1224
|
+
(bucket_start, source, skill_name, invocation_kind, capability_kind, evidence_kind, status, calls)
|
|
1225
|
+
SELECT bucket_start, source, skill_name, invocation_kind, '', '', '', calls
|
|
1226
|
+
FROM history_board_skill_5m;
|
|
1227
|
+
DROP TABLE history_board_skill_5m;
|
|
1228
|
+
ALTER TABLE history_board_skill_5m_capability_grain RENAME TO history_board_skill_5m;
|
|
1196
1229
|
CREATE INDEX IF NOT EXISTS idx_history_board_skill_5m_skill_bucket
|
|
1197
1230
|
ON history_board_skill_5m (skill_name, bucket_start);
|
|
1198
1231
|
`,HISTORY_MESSAGE_TS_NULLABLE_SCHEMA_SQL=`
|
|
@@ -1453,7 +1486,7 @@ ALTER TABLE queue_jobs ADD COLUMN timeout_ms INTEGER;
|
|
|
1453
1486
|
ALTER TABLE queue_jobs ADD COLUMN timeout_unlimited INTEGER NOT NULL DEFAULT 0;
|
|
1454
1487
|
ALTER TABLE queue_jobs ADD COLUMN attempt_token TEXT;
|
|
1455
1488
|
ALTER TABLE queue_jobs ADD COLUMN lease_expires_at INTEGER;
|
|
1456
|
-
`,CLI_MIGRATIONS=[{id:"0000_spur_cli_foundation",sql:CLI_SCHEMA_SQL},{id:"0001_spur_cli_team_inbox",sql:INBOX_MESSAGES_SCHEMA_SQL},{id:"0002_spur_cli_rule_history",sql:RULE_ENGINE_SCHEMA_SQL},{id:"0003_spur_cli_planning",sql:PLANNING_SCHEMA_SQL},{id:"0004_spur_cli_queue_jobs",sql:QUEUE_JOBS_SCHEMA_SQL},{id:"0005_spur_cli_run_pid",sql:RUN_PID_COLUMN_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"pid"}},{id:"0006_spur_cli_system_events",sql:SYSTEM_EVENTS_SCHEMA_SQL},{id:"0007_spur_cli_runs_external_key",sql:RUNS_EXTERNAL_KEY_COLUMN_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"external_key"}},{id:"0008_spur_cli_system_events_correlation",sql:SYSTEM_EVENTS_CORRELATION_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"system_events",column:"sequence"}},{id:"0009_spur_cli_history_message_run_idx",sql:HISTORY_MESSAGE_RUN_INDEX_SCHEMA_SQL},{id:"0010_spur_cli_coordination_runs",sql:COORDINATION_RUNS_SCHEMA_SQL},{id:"0011_spur_cli_system_events_sequence_idx",sql:SYSTEM_EVENTS_SEQUENCE_INDEX_SCHEMA_SQL},{id:"0012_spur_cli_history_tool_call_args_raw",sql:HISTORY_TOOL_CALL_ARGS_RAW_SCHEMA_SQL,addColumnIfMissing:{table:"history_tool_call",column:"args_raw"}},{id:"0013_spur_cli_history_run_session",sql:HISTORY_RUN_SESSION_SCHEMA_SQL},{id:"0014_spur_cli_system_events_name_occurred_idx",sql:SYSTEM_EVENTS_NAME_OCCURRED_INDEX_SCHEMA_SQL},{id:"0015_spur_cli_history_tool_call_call_id",sql:HISTORY_TOOL_CALL_CALL_ID_SCHEMA_SQL,addColumnIfMissing:{table:"history_tool_call",column:"call_id"}},{id:"0016_spur_cli_history_message_ts_nullable",sql:HISTORY_MESSAGE_TS_NULLABLE_SCHEMA_SQL},{id:"0017_spur_cli_runs_status_completed_to_done",sql:"UPDATE runs SET status = 'done' WHERE status = 'completed'"},{id:"0018_spur_cli_history_message_request_id",sql:HISTORY_MESSAGE_REQUEST_ID_SCHEMA_SQL,addColumnIfMissing:{table:"history_message",column:"request_id"}},{id:"0019_spur_cli_history_etl_tables_drop",sql:HISTORY_ETL_TABLES_DROP_SCHEMA_SQL},{id:"0020_spur_cli_history_board_query_indexes",sql:HISTORY_BOARD_QUERY_INDEXES_SCHEMA_SQL},{id:"0021_spur_cli_history_board_rollups",sql:HISTORY_BOARD_ROLLUPS_SCHEMA_SQL},{id:"0022_spur_cli_history_performance_indexes",sql:HISTORY_PERFORMANCE_INDEXES_SCHEMA_SQL},{id:"0023_spur_cli_history_message_request_id_idx",sql:HISTORY_MESSAGE_REQUEST_ID_INDEX_SCHEMA_SQL},{id:"0024_spur_cli_history_checkpoint_identity",sql:"ALTER TABLE history_import_checkpoint ADD COLUMN source_size INTEGER",addColumnIfMissing:{table:"history_import_checkpoint",column:"source_size"}},{id:"0025_spur_cli_history_checkpoint_identity_mtime",sql:"ALTER TABLE history_import_checkpoint ADD COLUMN source_mtime_ms REAL",addColumnIfMissing:{table:"history_import_checkpoint",column:"source_mtime_ms"}},{id:"0026_spur_cli_history_message_duration_source",sql:"ALTER TABLE history_message ADD COLUMN duration_source TEXT",addColumnIfMissing:{table:"history_message",column:"duration_source"}},{id:"0027_spur_cli_history_refresh_active_unique",sql:HISTORY_REFRESH_ACTIVE_UNIQUE_SCHEMA_SQL},{id:"0028_spur_cli_history_task_session",sql:HISTORY_TASK_SESSION_SCHEMA_SQL},{id:"0029_spur_cli_history_tool_call_indexes",sql:HISTORY_TOOL_CALL_INDEXES_SCHEMA_SQL},{id:"0030_spur_cli_history_board_covering_indexes",sql:HISTORY_BOARD_COVERING_INDEXES_SCHEMA_SQL},{id:"0031_spur_cli_history_board_tool_stats_columns",sql:HISTORY_BOARD_TOOL_STATS_COLUMNS_SCHEMA_SQL},{id:"0032_spur_cli_history_board_skill_5m",sql:HISTORY_BOARD_SKILL_5M_SCHEMA_SQL},{id:"0033_spur_cli_importer_schema_version",sql:`INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES ('${IMPORTER_SCHEMA_LEDGER_PREFIX}${HISTORY_IMPORT_SCHEMA_VERSION}', strftime('%s', 'now') * 1000);`},{id:"0034_spur_cli_history_tool_identity",sql:HISTORY_TOOL_IDENTITY_SCHEMA_SQL},{id:"0035_spur_cli_history_measure_vector",sql:HISTORY_MEASURE_VECTOR_SCHEMA_SQL},{id:"0036_spur_cli_history_rollup_watermark",sql:HISTORY_ROLLUP_WATERMARK_SCHEMA_SQL},{id:"0037_spur_cli_history_dimension_marts",sql:HISTORY_DIMENSION_MARTS_SCHEMA_SQL},{id:"0038_spur_cli_retention_compaction_meta",sql:RETENTION_COMPACTION_META_SCHEMA_SQL},{id:"0039_spur_cli_bounded_rollup_derivations",sql:BOUNDED_ROLLUP_DERIVATIONS_SCHEMA_SQL,addColumnIfMissing:{table:"history_board_source_daily",column:"raw_messages"}},{id:"0040_spur_cli_agent_executor_updates",sql:AGENT_EXECUTOR_UPDATES_SCHEMA_SQL},{id:"0041_spur_cli_queue_jobs_deadline_lease_columns",sql:QUEUE_JOBS_DEADLINE_LEASE_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"queue_jobs",column:"timeout_ms"}},{id:"0042_spur_cli_history_model_fallback_index",sql:HISTORY_MESSAGE_MODEL_FALLBACK_INDEX_SCHEMA_SQL},{id:"0043_spur_cli_inbox_messages_request_key",sql:INBOX_MESSAGES_REQUEST_KEY_SCHEMA_SQL,addColumnIfMissing:{table:"inbox_messages",column:"request_key"}},{id:"0044_spur_cli_coordination_runs_receipt_columns",sql:COORDINATION_RUNS_RECEIPT_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"coordination_runs",column:"message_ids_json"}},{id:"0045_spur_cli_project_claims",sql:PROJECT_CLAIMS_SCHEMA_SQL},{id:"0046_spur_cli_project_strategy",sql:PROJECT_STRATEGY_SCHEMA_SQL},{id:"0047_spur_cli_scheduler_custom_active_unique",sql:SCHEDULER_CUSTOM_ACTIVE_UNIQUE_SCHEMA_SQL},{id:"0048_spur_cli_agent_executor_updates_owner_columns",sql:AGENT_EXECUTOR_UPDATES_OWNER_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"agent_executor_updates",column:"owner"}},{id:"0049_spur_cli_runs_terminal_reason",sql:CLI_RUNS_TERMINAL_REASON_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"terminal_reason"}}];async function allMigrationsJournaled(adapter,migrations){if(migrations.length===0)return!0;if(!await tableExists2(adapter,"__spur_cli_migrations"))return!1;let placeholders=migrations.map(()=>"?").join(", ");if(((await adapter.queryFirst(`SELECT COUNT(*) AS n FROM "__spur_cli_migrations" WHERE id IN (${placeholders})`,...migrations.map((m)=>m.id)))?.n??0)!==migrations.length)return!1;if(migrations.some((m)=>m.id==="0033_spur_cli_importer_schema_version")){if(!await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION))return!1}return!0}async function applyCliMigrations(adapter,migrations=CLI_MIGRATIONS){if(await allMigrationsJournaled(adapter,migrations))return 0;await adapter.exec('CREATE TABLE IF NOT EXISTS "__spur_cli_migrations" (id TEXT PRIMARY KEY, applied_at INTEGER NOT NULL)');let applied=0;for(let migration of migrations){if(await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',migration.id)!=null)continue;if(migration.id==="0009_spur_cli_history_message_run_idx"&&!await tableExists2(adapter,"history_message")){for(let statement of splitSqlStatements(HISTORY_IMPORT_SCHEMA_SQL))await adapter.exec(statement);let versionLedgerId=IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION;await adapter.run('INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[versionLedgerId,Date.now()])}if((migration.id==="0024_spur_cli_history_checkpoint_identity"||migration.id==="0025_spur_cli_history_checkpoint_identity_mtime")&&!await tableExists2(adapter,"history_import_checkpoint")){await adapter.run('INSERT INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[migration.id,Date.now()]);continue}if(migration.id==="0034_spur_cli_history_tool_identity"&&await tableExists2(adapter,"history_tool_call")){if(!await columnExists(adapter,"history_tool_call","effective_tool_name"))await adapter.exec("ALTER TABLE history_tool_call ADD COLUMN effective_tool_name TEXT NOT NULL DEFAULT 'unknown'");if(!await columnExists(adapter,"history_tool_call","tool_name_alias"))await adapter.exec("ALTER TABLE history_tool_call ADD COLUMN tool_name_alias TEXT NOT NULL DEFAULT 'unknown'")}let addColumnGuard=migration.addColumnIfMissing,shouldApplySql=addColumnGuard===void 0||!await columnExists(adapter,addColumnGuard.table,addColumnGuard.column),tsNullableSkip=migration.id==="0016_spur_cli_history_message_ts_nullable"&&(!await tableExists2(adapter,"history_message")||!await columnNotNull(adapter,"history_message","ts")),sequenceIndexSkip=migration.id==="0011_spur_cli_system_events_sequence_idx"&&!await tableExists2(adapter,"system_events"),argsRawSkip=migration.id==="0012_spur_cli_history_tool_call_args_raw"&&!await tableExists2(adapter,"history_tool_call"),callIdSkip=migration.id==="0015_spur_cli_history_tool_call_call_id"&&!await tableExists2(adapter,"history_tool_call"),nameOccurredIndexSkip=migration.id==="0014_spur_cli_system_events_name_occurred_idx"&&!await tableExists2(adapter,"system_events"),historyBoardQueryIndexesSkip=migration.id==="0020_spur_cli_history_board_query_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","seq")||!await columnExists(adapter,"history_message","duration_ms")||!await columnExists(adapter,"history_message","role")||!await columnExists(adapter,"history_message","input_tokens")||!await columnExists(adapter,"history_message","cache_read_tokens")),historyPerformanceIndexesSkip=migration.id==="0022_spur_cli_history_performance_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","ts")||!await columnExists(adapter,"history_message","model")||!await tableExists2(adapter,"history_tool_call")),historyToolCallIndexesSkip=migration.id==="0029_spur_cli_history_tool_call_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","ts")||!await tableExists2(adapter,"history_tool_call")),historyBoardCoveringIndexesSkip=migration.id==="0030_spur_cli_history_board_covering_indexes"&&(!await tableExists2(adapter,"history_daily_stats")||!await tableExists2(adapter,"history_board_tool_5m")||!await tableExists2(adapter,"history_board_message_5m")||!await tableExists2(adapter,"history_board_session_stats")||!await tableExists2(adapter,"history_board_source_daily")||!await tableExists2(adapter,"history_tool_call")||!await tableExists2(adapter,"history_task_session")),runsStatusDoneSkip=migration.id==="0017_spur_cli_runs_status_completed_to_done"&&(!await tableExists2(adapter,"runs")||!await columnExists(adapter,"runs","status")),historyBoardToolStatsColumnsSkip=migration.id==="0031_spur_cli_history_board_tool_stats_columns"&&(!await tableExists2(adapter,"history_board_tool_stats")||await columnExists(adapter,"history_board_tool_stats","fresh_input_tokens")),queueJobsActiveIndexSkip=migration.id==="0027_spur_cli_history_refresh_active_unique"&&!await tableExists2(adapter,"queue_jobs"),schedulerCustomActiveIndexSkip=migration.id==="0047_spur_cli_scheduler_custom_active_unique"&&!await tableExists2(adapter,"queue_jobs"),queueJobsDeadlineLeaseSkip=migration.id==="0041_spur_cli_queue_jobs_deadline_lease_columns"&&!await tableExists2(adapter,"queue_jobs"),runsTerminalReasonSkip=migration.id==="0049_spur_cli_runs_terminal_reason"&&!await tableExists2(adapter,"runs"),inboxRequestKeySkip=migration.id==="0043_spur_cli_inbox_messages_request_key"&&!await tableExists2(adapter,"inbox_messages"),coordinationReceiptColumnsSkip=migration.id==="0044_spur_cli_coordination_runs_receipt_columns"&&!await tableExists2(adapter,"coordination_runs"),historyToolIdentitySkip=migration.id==="0034_spur_cli_history_tool_identity"&&!await tableExists2(adapter,"history_tool_call"),historyMeasureVectorSkip=migration.id==="0035_spur_cli_history_measure_vector"&&(!await tableExists2(adapter,"history_board_message_5m")||await columnExists(adapter,"history_board_message_5m","cache_write_tokens")),historyRollupWatermarkSkip=migration.id==="0036_spur_cli_history_rollup_watermark"&&(await tableExists2(adapter,"history_board_rollup_watermark")||!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","imported_at")),boundedRollupDerivationsSkip=migration.id==="0039_spur_cli_bounded_rollup_derivations"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","source_file")||!await tableExists2(adapter,"history_board_source_daily")),historyModelFallbackIndexSkip=migration.id==="0042_spur_cli_history_model_fallback_index"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","model"));if(shouldApplySql&&!sequenceIndexSkip&&!argsRawSkip&&!runsStatusDoneSkip&&!nameOccurredIndexSkip&&!historyBoardQueryIndexesSkip&&!historyPerformanceIndexesSkip&&!historyToolCallIndexesSkip&&!historyBoardCoveringIndexesSkip&&!historyBoardToolStatsColumnsSkip&&!callIdSkip&&!tsNullableSkip&&!queueJobsActiveIndexSkip&&!schedulerCustomActiveIndexSkip&&!queueJobsDeadlineLeaseSkip&&!runsTerminalReasonSkip&&!inboxRequestKeySkip&&!coordinationReceiptColumnsSkip&&!historyToolIdentitySkip&&!historyMeasureVectorSkip&&!historyRollupWatermarkSkip&&!boundedRollupDerivationsSkip&&!historyModelFallbackIndexSkip)for(let statement of splitSqlStatements(migration.sql))await adapter.exec(statement);if(historyToolIdentitySkip&&!await tableExists2(adapter,"history_tool_alias_map"))await adapter.exec("CREATE TABLE IF NOT EXISTS history_tool_alias_map (source TEXT NOT NULL, effective_tool_name TEXT NOT NULL, alias TEXT NOT NULL, PRIMARY KEY (source, effective_tool_name));");await adapter.run('INSERT INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',migration.id,Date.now()),applied+=1}if(migrations.some((m)=>m.id==="0033_spur_cli_importer_schema_version")){let currentVersionLedgerId=IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION;if(!await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',currentVersionLedgerId)){for(let statement of splitSqlStatements(HISTORY_IMPORT_SCHEMA_SQL))if(statement.startsWith("CREATE TABLE"))await adapter.exec(statement);await adapter.run('INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[currentVersionLedgerId,Date.now()]),applied+=1}}return applied}async function columnExists(adapter,table3,column2){return(await adapter.queryAll(`PRAGMA table_info("${table3}")`)).some((row)=>row.name===column2)}async function columnNotNull(adapter,table3,column2){return(await adapter.queryAll(`PRAGMA table_info("${table3}")`)).some((row)=>row.name===column2&&row.notnull===1)}async function tableExists2(adapter,table3){return await adapter.queryFirst("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",table3)!=null}function splitSqlStatements(sql4){return sql4.split(";").map((statement)=>statement.trim()).filter(Boolean)}var SQLITE_BUSY_TIMEOUT_MS=30000;async function createMigratedDb(options){let{createDbAdapter:createDbAdapter3}=await Promise.resolve().then(() => (init_dist4(),exports_dist)),adapter=await createDbAdapter3({driver:"bun-sqlite",url:options.url});return await adapter.exec(`PRAGMA busy_timeout = ${SQLITE_BUSY_TIMEOUT_MS}`),await applyCliMigrations(adapter),adapter}init_zod();init_zod();var STAGE_REGISTRY_SCHEMA_VERSION={major:1,minor:3},stageSchemaVersionSchema=exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}).strict();var MUTATION_CLASSES=["none","corpus","code","tests","verdict","learnings","driver","irreversible"];var inlineExecutionSchema=exports_external.object({kind:exports_external.literal("inline"),current_agent_allowed:exports_external.literal(!0),may_reuse_captured_layers:exports_external.boolean().optional()}).strict(),subprocessExecutionSchema=exports_external.object({kind:exports_external.literal("subprocess"),current_agent_allowed:exports_external.literal(!1),via:exports_external.literal("spur-agent-run")}).strict(),deterministicExecutionSchema=exports_external.object({kind:exports_external.literal("deterministic"),current_agent_allowed:exports_external.literal(!1),executor:exports_external.enum(["cli","script"])}).strict(),hitlExecutionSchema=exports_external.object({kind:exports_external.literal("hitl"),current_agent_allowed:exports_external.literal(!0),gate_timing:exports_external.enum(["pre","post","both"])}).strict(),irreversibleExecutionSchema=exports_external.object({kind:exports_external.literal("irreversible"),requires_operator_intent:exports_external.literal(!0),current_agent_allowed:exports_external.boolean(),rollback_disclaimer:exports_external.string().min(1)}).strict(),executionKindSchema=exports_external.discriminatedUnion("kind",[inlineExecutionSchema,subprocessExecutionSchema,deterministicExecutionSchema,hitlExecutionSchema,irreversibleExecutionSchema]),ARTIFACT_DIRECTIONS=["input","output"],stageArtifactSchema=exports_external.object({kind:exports_external.string().min(1),direction:exports_external.enum(ARTIFACT_DIRECTIONS),identity:exports_external.string().optional(),description:exports_external.string().optional(),required:exports_external.boolean().optional().default(!0)}).strict(),stageGateSchema=exports_external.object({name:exports_external.string().min(1),timing:exports_external.enum(["pre","post","transition"]),min_verdict:exports_external.enum(["pass","partial","fail"]).optional(),description:exports_external.string().optional()}).strict(),stageRetryPolicySchema=exports_external.object({max_attempts:exports_external.number().int().min(1),terminal_stop:exports_external.enum(["block","escalate","fail"]),timeout_seconds:exports_external.number().int().positive().optional()}).strict(),CAPABILITY_TIERS=["cheap","standard","capable-1","capable-2","capable-3"],LEGACY_CAPABLE_ALIAS="capable";function normalizeCapabilityTier(value){return value===LEGACY_CAPABLE_ALIAS?"capable-1":value}var capabilityTierSchema=exports_external.preprocess(normalizeCapabilityTier,exports_external.enum(CAPABILITY_TIERS)),objectiveEscalationTriggerSchema=exports_external.enum(["gate-fail","timeout","insufficient-evidence","retry-exhausted","resource-exhaustion","auth"]),stageModelPolicySchema=exports_external.object({min_tier:capabilityTierSchema,fallback:exports_external.array(exports_external.object({tier:capabilityTierSchema,trigger:objectiveEscalationTriggerSchema}).strict()),override_key:exports_external.string().optional()}).strict();var CONTEXT_LAYER_NAMES=["harness-policy","project-authority","stage-contract","task-state","indexed-evidence","run-state","tool-observations"],stageContextLayerSchema=exports_external.object({layer:exports_external.enum(CONTEXT_LAYER_NAMES),required:exports_external.literal(!0)}).strict(),stageEventSchema=exports_external.object({name:exports_external.string().min(1),description:exports_external.string().optional()}).strict(),STAGE_ID_PATTERN=/^[a-z][a-z0-9-]*$/,stageRecordSchema=exports_external.object({schema_version:stageSchemaVersionSchema,id:exports_external.string().regex(STAGE_ID_PATTERN,{message:"stage id must be lowercase kebab-case"}),aliases:exports_external.array(exports_external.string().min(1)).optional().default([]),description:exports_external.string().min(1),artifacts:exports_external.array(stageArtifactSchema).min(1),reasoning_skill:exports_external.string().min(1),required_references:exports_external.array(exports_external.string().min(1)).optional().default([]),gates:exports_external.array(stageGateSchema).optional().default([]),mutation_class:exports_external.enum(MUTATION_CLASSES),retry:stageRetryPolicySchema,model_policy:stageModelPolicySchema,context_layers:exports_external.array(stageContextLayerSchema).optional().default([]),observability:exports_external.array(stageEventSchema).optional().default([]),execution:executionKindSchema}).strict();var REGISTERED_CANONICAL_STAGES=[{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"refine",aliases:["dev-refine"],description:"dev-refine: Q&A refinement, section filling, AC tightening",artifacts:[{kind:"task-section",direction:"input",required:!0,description:"Background/Requirements sections"},{kind:"task-section",direction:"output",required:!0,description:"Q&A/Design/Plan/AC sections"}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-2",trigger:"gate-fail"},{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"plan",aliases:["dev-plan"],description:"dev-plan: feature intake -> AC generation -> decomposition",artifacts:[{kind:"feature-frontmatter",direction:"input",required:!0},{kind:"task-batch",direction:"output",required:!0}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[{name:"feature-check",timing:"post",min_verdict:"pass"},{name:"batch-create",timing:"post",min_verdict:"pass"}],mutation_class:"corpus",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"capable-2",fallback:[{tier:"capable-3",trigger:"gate-fail"},{tier:"capable-3",trigger:"auth"},{tier:"capable-3",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"implement",aliases:["dev-run"],description:"dev-run --mode implement: code edits in worktree",artifacts:[{kind:"worktree-diff",direction:"output",required:!0},{kind:"task-section",direction:"output",required:!0,identity:"Solution"}],reasoning_skill:"sp:code-implementation",required_references:[],gates:[],mutation_class:"code",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"timeout"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"test",aliases:["dev-unit","dev-fixall"],description:"dev-unit: generate/extend tests to coverage target",artifacts:[{kind:"test-file",direction:"output",required:!0},{kind:"coverage-report",direction:"output",required:!1}],reasoning_skill:"sp:code-testing",required_references:[],gates:[],mutation_class:"tests",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}],min_tier:"standard"},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"verify",aliases:["dev-verify"],description:"dev-verify: SECUA review + requirements traceability",artifacts:[{kind:"worktree-diff",direction:"input",required:!0},{kind:"verdict-artifact",direction:"output",required:!0,identity:"<wbs>-verdict.json"}],reasoning_skill:"sp:code-verification",required_references:[],gates:[{name:"verdict-artifact",timing:"post",min_verdict:"pass"},{name:"strict-core",timing:"post",min_verdict:"pass"}],mutation_class:"verdict",retry:{max_attempts:2,terminal_stop:"escalate"},model_policy:{min_tier:"capable-1",fallback:[{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"},{tier:"capable-2",trigger:"gate-fail"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"wrap",aliases:["dev-wrap"],description:"dev-wrap: learnings/doc-sync/feature transition",artifacts:[{kind:"learning-entry",direction:"output",required:!0}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[{name:"task-check",timing:"pre",min_verdict:"pass"}],mutation_class:"learnings",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"hitl",current_agent_allowed:!0,gate_timing:"both"}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"review",aliases:["dev-review"],description:"dev-review: multi-dimensional code review (coordinator writes the combined Review)",artifacts:[{kind:"review-findings",direction:"output",required:!0,identity:"Review"}],reasoning_skill:"sp:code-verification",required_references:[],gates:[],mutation_class:"verdict",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"record",aliases:["dev-record"],description:"record: deterministic Testing write-back from the verdict artifact; bare-Review fallback only",artifacts:[{kind:"verdict-artifact",direction:"input",required:!0,identity:"<wbs>-verdict.json"},{kind:"task-section",direction:"output",required:!0,identity:"Testing"},{kind:"task-section",direction:"output",required:!1,identity:"Review",description:"fallback-only: backfills Review only when the section is bare; never overwrites authored Review"}],reasoning_skill:"inline",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:1,terminal_stop:"block"},model_policy:{min_tier:"cheap",fallback:[]},context_layers:[],observability:[],execution:{kind:"deterministic",current_agent_allowed:!1,executor:"cli"}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"dogfood",aliases:["dev-dogfood"],description:"dev-dogfood: end-to-end driver test",artifacts:[{kind:"dogfood-report",direction:"output",required:!0},{kind:"monitor-ledger",direction:"output",required:!1}],reasoning_skill:"sp:dogfood-testing",required_references:[],gates:[],mutation_class:"driver",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"capable-1",fallback:[{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"},{tier:"capable-2",trigger:"gate-fail"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"brainstorm",aliases:["dev-brainstorm"],description:"dev-brainstorm: structured ideation",artifacts:[{kind:"brainstorm-outline",direction:"output",required:!0}],reasoning_skill:"sp:brainstorm",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"changelog",aliases:["dev-changelog"],description:"dev-changelog: generate changelog from git commits",artifacts:[{kind:"changelog-entry",direction:"output",required:!0}],reasoning_skill:"inline",required_references:[],gates:[],mutation_class:"none",retry:{max_attempts:1,terminal_stop:"block"},model_policy:{min_tier:"cheap",fallback:[]},context_layers:[],observability:[],execution:{kind:"deterministic",current_agent_allowed:!1,executor:"cli"}}],CANONICAL_STAGE_BY_KEY=new Map;for(let s2 of REGISTERED_CANONICAL_STAGES){CANONICAL_STAGE_BY_KEY.set(s2.id,s2);for(let a2 of s2.aliases??[])CANONICAL_STAGE_BY_KEY.set(a2,s2)}var CACHEABILITY_CLASSES=["stable-prefix-eligible","volatile"],SENSITIVITY_CLASSES=["public","internal","confidential"],envelopeProvenanceSchema=exports_external.object({owner:exports_external.string().min(1),schema_version:exports_external.string().min(1),source_revision:exports_external.string().nullable().optional(),generated_at:exports_external.string().datetime()}).strict(),envelopeSizeBudgetSchema=exports_external.object({max_bytes:exports_external.number().int().positive()}).strict(),envelopeLayerSchema=exports_external.object({layer:exports_external.enum(CONTEXT_LAYER_NAMES),content:exports_external.string(),size_bytes:exports_external.number().int().nonnegative(),content_hash:exports_external.string().length(64),provenance:envelopeProvenanceSchema,cacheability:exports_external.enum(CACHEABILITY_CLASSES),sensitivity:exports_external.enum(SENSITIVITY_CLASSES).default("internal"),size_budget:envelopeSizeBudgetSchema.optional(),disclosure_handle:exports_external.string().optional()}).strict(),STABLE_LAYER_NAMES=["harness-policy","project-authority","stage-contract","task-state","indexed-evidence"],VOLATILE_LAYER_NAMES=["run-state","tool-observations"];var envelopeSchema=exports_external.object({schema_version:exports_external.string().default("1.0"),layers:exports_external.array(envelopeLayerSchema).min(1),stage_id:exports_external.string().optional(),run_id:exports_external.string().optional(),assembled_at:exports_external.string().datetime(),total_size_bytes:exports_external.number().int().nonnegative()}).strict(),projectSnapshotSchema=exports_external.object({name:exports_external.string(),version:exports_external.string(),task_counts:exports_external.object({backlog:exports_external.number().int().nonnegative(),todo:exports_external.number().int().nonnegative(),wip:exports_external.number().int().nonnegative(),testing:exports_external.number().int().nonnegative(),done:exports_external.number().int().nonnegative(),blocked:exports_external.number().int().nonnegative(),cancelled:exports_external.number().int().nonnegative()}).strict(),feature_counts:exports_external.object({backlog:exports_external.number().int().nonnegative(),active:exports_external.number().int().nonnegative(),verifying:exports_external.number().int().nonnegative(),done:exports_external.number().int().nonnegative(),blocked:exports_external.number().int().nonnegative(),cancelled:exports_external.number().int().nonnegative()}).strict(),active_features:exports_external.array(exports_external.string()),content_hash:exports_external.string().length(64).optional()}).strict(),taskSnapshotSchema=exports_external.object({wbs:exports_external.string().regex(/^\d{4}$/),name:exports_external.string(),status:exports_external.string(),priority:exports_external.string().optional(),feature_id:exports_external.string().optional(),acceptance_criteria:exports_external.string().optional(),locked_qa:exports_external.array(exports_external.string()).optional(),solution:exports_external.string().optional(),content_hash:exports_external.string().length(64).optional()}).strict(),featureSnapshotSchema=exports_external.object({id:exports_external.string(),name:exports_external.string(),status:exports_external.string(),priority:exports_external.string().optional(),scenarios:exports_external.array(exports_external.string()).optional(),content_hash:exports_external.string().length(64).optional()}).strict();var ALL_LAYER_NAMES=[...STABLE_LAYER_NAMES,...VOLATILE_LAYER_NAMES],LAYER_ORDER={};ALL_LAYER_NAMES.forEach((name,idx)=>{LAYER_ORDER[name]=idx});init_dist2();var TASK_CANONICAL_SECTIONS=["Background","Requirements","Acceptance Criteria","Q&A","Design","Plan","Root Cause","Solution","Testing","Review","References","History"],FEATURE_CANONICAL_SECTIONS=["Goal","Scope","Acceptance Criteria","Tasks","Notes","History"],UNIVERSAL_SECTIONS=["History","References","Notes"],HEADING_LEVELS={task:3,feature:2},START_MARKER="<!-- AUTO-GENERATED by spur feature refresh -->",END_MARKER="<!-- END AUTO-GENERATED -->",MARKER_START_RE=/<!--[ \t]*AUTO-GENERATED.*?-->/,MARKER_END_RE=/<!--[ \t]*END[ \t]*AUTO-GENERATED.*?-->/;function findHeadings(body,hashes){let hits=[],prefix=`${hashes} `,inCodeBlock=!1,lineStart=0;for(let i2=0;i2<=body.length;i2++){if(i2!==body.length&&body[i2]!==`
|
|
1489
|
+
`,CLI_MIGRATIONS=[{id:"0000_spur_cli_foundation",sql:CLI_SCHEMA_SQL},{id:"0001_spur_cli_team_inbox",sql:INBOX_MESSAGES_SCHEMA_SQL},{id:"0002_spur_cli_rule_history",sql:RULE_ENGINE_SCHEMA_SQL},{id:"0003_spur_cli_planning",sql:PLANNING_SCHEMA_SQL},{id:"0004_spur_cli_queue_jobs",sql:QUEUE_JOBS_SCHEMA_SQL},{id:"0005_spur_cli_run_pid",sql:RUN_PID_COLUMN_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"pid"}},{id:"0006_spur_cli_system_events",sql:SYSTEM_EVENTS_SCHEMA_SQL},{id:"0007_spur_cli_runs_external_key",sql:RUNS_EXTERNAL_KEY_COLUMN_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"external_key"}},{id:"0008_spur_cli_system_events_correlation",sql:SYSTEM_EVENTS_CORRELATION_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"system_events",column:"sequence"}},{id:"0009_spur_cli_history_message_run_idx",sql:HISTORY_MESSAGE_RUN_INDEX_SCHEMA_SQL},{id:"0010_spur_cli_coordination_runs",sql:COORDINATION_RUNS_SCHEMA_SQL},{id:"0011_spur_cli_system_events_sequence_idx",sql:SYSTEM_EVENTS_SEQUENCE_INDEX_SCHEMA_SQL},{id:"0012_spur_cli_history_tool_call_args_raw",sql:HISTORY_TOOL_CALL_ARGS_RAW_SCHEMA_SQL,addColumnIfMissing:{table:"history_tool_call",column:"args_raw"}},{id:"0013_spur_cli_history_run_session",sql:HISTORY_RUN_SESSION_SCHEMA_SQL},{id:"0014_spur_cli_system_events_name_occurred_idx",sql:SYSTEM_EVENTS_NAME_OCCURRED_INDEX_SCHEMA_SQL},{id:"0015_spur_cli_history_tool_call_call_id",sql:HISTORY_TOOL_CALL_CALL_ID_SCHEMA_SQL,addColumnIfMissing:{table:"history_tool_call",column:"call_id"}},{id:"0016_spur_cli_history_message_ts_nullable",sql:HISTORY_MESSAGE_TS_NULLABLE_SCHEMA_SQL},{id:"0017_spur_cli_runs_status_completed_to_done",sql:"UPDATE runs SET status = 'done' WHERE status = 'completed'"},{id:"0018_spur_cli_history_message_request_id",sql:HISTORY_MESSAGE_REQUEST_ID_SCHEMA_SQL,addColumnIfMissing:{table:"history_message",column:"request_id"}},{id:"0019_spur_cli_history_etl_tables_drop",sql:HISTORY_ETL_TABLES_DROP_SCHEMA_SQL},{id:"0020_spur_cli_history_board_query_indexes",sql:HISTORY_BOARD_QUERY_INDEXES_SCHEMA_SQL},{id:"0021_spur_cli_history_board_rollups",sql:HISTORY_BOARD_ROLLUPS_SCHEMA_SQL},{id:"0022_spur_cli_history_performance_indexes",sql:HISTORY_PERFORMANCE_INDEXES_SCHEMA_SQL},{id:"0023_spur_cli_history_message_request_id_idx",sql:HISTORY_MESSAGE_REQUEST_ID_INDEX_SCHEMA_SQL},{id:"0024_spur_cli_history_checkpoint_identity",sql:"ALTER TABLE history_import_checkpoint ADD COLUMN source_size INTEGER",addColumnIfMissing:{table:"history_import_checkpoint",column:"source_size"}},{id:"0025_spur_cli_history_checkpoint_identity_mtime",sql:"ALTER TABLE history_import_checkpoint ADD COLUMN source_mtime_ms REAL",addColumnIfMissing:{table:"history_import_checkpoint",column:"source_mtime_ms"}},{id:"0026_spur_cli_history_message_duration_source",sql:"ALTER TABLE history_message ADD COLUMN duration_source TEXT",addColumnIfMissing:{table:"history_message",column:"duration_source"}},{id:"0027_spur_cli_history_refresh_active_unique",sql:HISTORY_REFRESH_ACTIVE_UNIQUE_SCHEMA_SQL},{id:"0028_spur_cli_history_task_session",sql:HISTORY_TASK_SESSION_SCHEMA_SQL},{id:"0029_spur_cli_history_tool_call_indexes",sql:HISTORY_TOOL_CALL_INDEXES_SCHEMA_SQL},{id:"0030_spur_cli_history_board_covering_indexes",sql:HISTORY_BOARD_COVERING_INDEXES_SCHEMA_SQL},{id:"0031_spur_cli_history_board_tool_stats_columns",sql:HISTORY_BOARD_TOOL_STATS_COLUMNS_SCHEMA_SQL},{id:"0032_spur_cli_history_board_skill_5m",sql:HISTORY_BOARD_SKILL_5M_SCHEMA_SQL},{id:"0033_spur_cli_importer_schema_version",sql:`INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES ('${IMPORTER_SCHEMA_LEDGER_PREFIX}${HISTORY_IMPORT_SCHEMA_VERSION}', strftime('%s', 'now') * 1000);`},{id:"0034_spur_cli_history_tool_identity",sql:HISTORY_TOOL_IDENTITY_SCHEMA_SQL},{id:"0035_spur_cli_history_measure_vector",sql:HISTORY_MEASURE_VECTOR_SCHEMA_SQL},{id:"0036_spur_cli_history_rollup_watermark",sql:HISTORY_ROLLUP_WATERMARK_SCHEMA_SQL},{id:"0037_spur_cli_history_dimension_marts",sql:HISTORY_DIMENSION_MARTS_SCHEMA_SQL},{id:"0038_spur_cli_retention_compaction_meta",sql:RETENTION_COMPACTION_META_SCHEMA_SQL},{id:"0039_spur_cli_bounded_rollup_derivations",sql:BOUNDED_ROLLUP_DERIVATIONS_SCHEMA_SQL,addColumnIfMissing:{table:"history_board_source_daily",column:"raw_messages"}},{id:"0040_spur_cli_agent_executor_updates",sql:AGENT_EXECUTOR_UPDATES_SCHEMA_SQL},{id:"0041_spur_cli_queue_jobs_deadline_lease_columns",sql:QUEUE_JOBS_DEADLINE_LEASE_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"queue_jobs",column:"timeout_ms"}},{id:"0042_spur_cli_history_model_fallback_index",sql:HISTORY_MESSAGE_MODEL_FALLBACK_INDEX_SCHEMA_SQL},{id:"0043_spur_cli_inbox_messages_request_key",sql:INBOX_MESSAGES_REQUEST_KEY_SCHEMA_SQL,addColumnIfMissing:{table:"inbox_messages",column:"request_key"}},{id:"0044_spur_cli_coordination_runs_receipt_columns",sql:COORDINATION_RUNS_RECEIPT_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"coordination_runs",column:"message_ids_json"}},{id:"0045_spur_cli_project_claims",sql:PROJECT_CLAIMS_SCHEMA_SQL},{id:"0046_spur_cli_project_strategy",sql:PROJECT_STRATEGY_SCHEMA_SQL},{id:"0047_spur_cli_scheduler_custom_active_unique",sql:SCHEDULER_CUSTOM_ACTIVE_UNIQUE_SCHEMA_SQL},{id:"0048_spur_cli_agent_executor_updates_owner_columns",sql:AGENT_EXECUTOR_UPDATES_OWNER_COLUMNS_SCHEMA_SQL,addColumnIfMissing:{table:"agent_executor_updates",column:"owner"}},{id:"0049_spur_cli_runs_terminal_reason",sql:CLI_RUNS_TERMINAL_REASON_SCHEMA_SQL,addColumnIfMissing:{table:"runs",column:"terminal_reason"}},{id:"0050_spur_cli_history_board_skill_5m_capability_grain",sql:HISTORY_BOARD_SKILL_5M_CAPABILITY_GRAIN_SCHEMA_SQL}];async function allMigrationsJournaled(adapter,migrations){if(migrations.length===0)return!0;if(!await tableExists2(adapter,"__spur_cli_migrations"))return!1;let placeholders=migrations.map(()=>"?").join(", ");if(((await adapter.queryFirst(`SELECT COUNT(*) AS n FROM "__spur_cli_migrations" WHERE id IN (${placeholders})`,...migrations.map((m)=>m.id)))?.n??0)!==migrations.length)return!1;if(migrations.some((m)=>m.id==="0033_spur_cli_importer_schema_version")){if(!await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION))return!1}return!0}async function applyCliMigrations(adapter,migrations=CLI_MIGRATIONS){if(await allMigrationsJournaled(adapter,migrations))return 0;await adapter.exec('CREATE TABLE IF NOT EXISTS "__spur_cli_migrations" (id TEXT PRIMARY KEY, applied_at INTEGER NOT NULL)');let applied=0;for(let migration of migrations){if(await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',migration.id)!=null)continue;if(migration.id==="0009_spur_cli_history_message_run_idx"&&!await tableExists2(adapter,"history_message")){for(let statement of splitSqlStatements(HISTORY_IMPORT_SCHEMA_SQL))await adapter.exec(statement);let versionLedgerId=IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION;await adapter.run('INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[versionLedgerId,Date.now()])}if((migration.id==="0024_spur_cli_history_checkpoint_identity"||migration.id==="0025_spur_cli_history_checkpoint_identity_mtime")&&!await tableExists2(adapter,"history_import_checkpoint")){await adapter.run('INSERT INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[migration.id,Date.now()]);continue}if(migration.id==="0034_spur_cli_history_tool_identity"&&await tableExists2(adapter,"history_tool_call")){if(!await columnExists(adapter,"history_tool_call","effective_tool_name"))await adapter.exec("ALTER TABLE history_tool_call ADD COLUMN effective_tool_name TEXT NOT NULL DEFAULT 'unknown'");if(!await columnExists(adapter,"history_tool_call","tool_name_alias"))await adapter.exec("ALTER TABLE history_tool_call ADD COLUMN tool_name_alias TEXT NOT NULL DEFAULT 'unknown'")}let addColumnGuard=migration.addColumnIfMissing,shouldApplySql=addColumnGuard===void 0||!await columnExists(adapter,addColumnGuard.table,addColumnGuard.column),tsNullableSkip=migration.id==="0016_spur_cli_history_message_ts_nullable"&&(!await tableExists2(adapter,"history_message")||!await columnNotNull(adapter,"history_message","ts")),sequenceIndexSkip=migration.id==="0011_spur_cli_system_events_sequence_idx"&&!await tableExists2(adapter,"system_events"),argsRawSkip=migration.id==="0012_spur_cli_history_tool_call_args_raw"&&!await tableExists2(adapter,"history_tool_call"),callIdSkip=migration.id==="0015_spur_cli_history_tool_call_call_id"&&!await tableExists2(adapter,"history_tool_call"),nameOccurredIndexSkip=migration.id==="0014_spur_cli_system_events_name_occurred_idx"&&!await tableExists2(adapter,"system_events"),historyBoardQueryIndexesSkip=migration.id==="0020_spur_cli_history_board_query_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","seq")||!await columnExists(adapter,"history_message","duration_ms")||!await columnExists(adapter,"history_message","role")||!await columnExists(adapter,"history_message","input_tokens")||!await columnExists(adapter,"history_message","cache_read_tokens")),historyPerformanceIndexesSkip=migration.id==="0022_spur_cli_history_performance_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","ts")||!await columnExists(adapter,"history_message","model")||!await tableExists2(adapter,"history_tool_call")),historyToolCallIndexesSkip=migration.id==="0029_spur_cli_history_tool_call_indexes"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","ts")||!await tableExists2(adapter,"history_tool_call")),historyBoardCoveringIndexesSkip=migration.id==="0030_spur_cli_history_board_covering_indexes"&&(!await tableExists2(adapter,"history_daily_stats")||!await tableExists2(adapter,"history_board_tool_5m")||!await tableExists2(adapter,"history_board_message_5m")||!await tableExists2(adapter,"history_board_session_stats")||!await tableExists2(adapter,"history_board_source_daily")||!await tableExists2(adapter,"history_tool_call")||!await tableExists2(adapter,"history_task_session")),runsStatusDoneSkip=migration.id==="0017_spur_cli_runs_status_completed_to_done"&&(!await tableExists2(adapter,"runs")||!await columnExists(adapter,"runs","status")),historyBoardToolStatsColumnsSkip=migration.id==="0031_spur_cli_history_board_tool_stats_columns"&&(!await tableExists2(adapter,"history_board_tool_stats")||await columnExists(adapter,"history_board_tool_stats","fresh_input_tokens")),queueJobsActiveIndexSkip=migration.id==="0027_spur_cli_history_refresh_active_unique"&&!await tableExists2(adapter,"queue_jobs"),schedulerCustomActiveIndexSkip=migration.id==="0047_spur_cli_scheduler_custom_active_unique"&&!await tableExists2(adapter,"queue_jobs"),queueJobsDeadlineLeaseSkip=migration.id==="0041_spur_cli_queue_jobs_deadline_lease_columns"&&!await tableExists2(adapter,"queue_jobs"),runsTerminalReasonSkip=migration.id==="0049_spur_cli_runs_terminal_reason"&&!await tableExists2(adapter,"runs"),skillCapabilityGrainSkip=migration.id==="0050_spur_cli_history_board_skill_5m_capability_grain"&&!await tableExists2(adapter,"history_board_skill_5m"),inboxRequestKeySkip=migration.id==="0043_spur_cli_inbox_messages_request_key"&&!await tableExists2(adapter,"inbox_messages"),coordinationReceiptColumnsSkip=migration.id==="0044_spur_cli_coordination_runs_receipt_columns"&&!await tableExists2(adapter,"coordination_runs"),historyToolIdentitySkip=migration.id==="0034_spur_cli_history_tool_identity"&&!await tableExists2(adapter,"history_tool_call"),historyMeasureVectorSkip=migration.id==="0035_spur_cli_history_measure_vector"&&(!await tableExists2(adapter,"history_board_message_5m")||await columnExists(adapter,"history_board_message_5m","cache_write_tokens")),historyRollupWatermarkSkip=migration.id==="0036_spur_cli_history_rollup_watermark"&&(await tableExists2(adapter,"history_board_rollup_watermark")||!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","imported_at")),boundedRollupDerivationsSkip=migration.id==="0039_spur_cli_bounded_rollup_derivations"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","source_file")||!await tableExists2(adapter,"history_board_source_daily")),historyModelFallbackIndexSkip=migration.id==="0042_spur_cli_history_model_fallback_index"&&(!await tableExists2(adapter,"history_message")||!await columnExists(adapter,"history_message","model"));if(shouldApplySql&&!sequenceIndexSkip&&!argsRawSkip&&!runsStatusDoneSkip&&!nameOccurredIndexSkip&&!historyBoardQueryIndexesSkip&&!historyPerformanceIndexesSkip&&!historyToolCallIndexesSkip&&!historyBoardCoveringIndexesSkip&&!historyBoardToolStatsColumnsSkip&&!callIdSkip&&!tsNullableSkip&&!queueJobsActiveIndexSkip&&!schedulerCustomActiveIndexSkip&&!queueJobsDeadlineLeaseSkip&&!runsTerminalReasonSkip&&!skillCapabilityGrainSkip&&!inboxRequestKeySkip&&!coordinationReceiptColumnsSkip&&!historyToolIdentitySkip&&!historyMeasureVectorSkip&&!historyRollupWatermarkSkip&&!boundedRollupDerivationsSkip&&!historyModelFallbackIndexSkip)for(let statement of splitSqlStatements(migration.sql))await adapter.exec(statement);if(historyToolIdentitySkip&&!await tableExists2(adapter,"history_tool_alias_map"))await adapter.exec("CREATE TABLE IF NOT EXISTS history_tool_alias_map (source TEXT NOT NULL, effective_tool_name TEXT NOT NULL, alias TEXT NOT NULL, PRIMARY KEY (source, effective_tool_name));");await adapter.run('INSERT INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',migration.id,Date.now()),applied+=1}if(migrations.some((m)=>m.id==="0033_spur_cli_importer_schema_version")){let currentVersionLedgerId=IMPORTER_SCHEMA_LEDGER_PREFIX+HISTORY_IMPORT_SCHEMA_VERSION;if(!await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?',currentVersionLedgerId)){for(let statement of splitSqlStatements(HISTORY_IMPORT_SCHEMA_SQL))if(statement.startsWith("CREATE TABLE"))await adapter.exec(statement);await adapter.run('INSERT OR REPLACE INTO "__spur_cli_migrations" (id, applied_at) VALUES (?, ?)',[currentVersionLedgerId,Date.now()]),applied+=1}}return applied}async function columnExists(adapter,table3,column2){return(await adapter.queryAll(`PRAGMA table_info("${table3}")`)).some((row)=>row.name===column2)}async function columnNotNull(adapter,table3,column2){return(await adapter.queryAll(`PRAGMA table_info("${table3}")`)).some((row)=>row.name===column2&&row.notnull===1)}async function tableExists2(adapter,table3){return await adapter.queryFirst("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",table3)!=null}function splitSqlStatements(sql4){return sql4.split(";").map((statement)=>statement.trim()).filter(Boolean)}var SQLITE_BUSY_TIMEOUT_MS=30000;async function createMigratedDb(options){let{createDbAdapter:createDbAdapter3}=await Promise.resolve().then(() => (init_dist4(),exports_dist)),adapter=await createDbAdapter3({driver:"bun-sqlite",url:options.url});return await adapter.exec(`PRAGMA busy_timeout = ${SQLITE_BUSY_TIMEOUT_MS}`),await applyCliMigrations(adapter),adapter}init_zod();init_zod();var STAGE_REGISTRY_SCHEMA_VERSION={major:1,minor:3},stageSchemaVersionSchema=exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}).strict();var MUTATION_CLASSES=["none","corpus","code","tests","verdict","learnings","driver","irreversible"];var inlineExecutionSchema=exports_external.object({kind:exports_external.literal("inline"),current_agent_allowed:exports_external.literal(!0),may_reuse_captured_layers:exports_external.boolean().optional()}).strict(),subprocessExecutionSchema=exports_external.object({kind:exports_external.literal("subprocess"),current_agent_allowed:exports_external.literal(!1),via:exports_external.literal("spur-agent-run")}).strict(),deterministicExecutionSchema=exports_external.object({kind:exports_external.literal("deterministic"),current_agent_allowed:exports_external.literal(!1),executor:exports_external.enum(["cli","script"])}).strict(),hitlExecutionSchema=exports_external.object({kind:exports_external.literal("hitl"),current_agent_allowed:exports_external.literal(!0),gate_timing:exports_external.enum(["pre","post","both"])}).strict(),irreversibleExecutionSchema=exports_external.object({kind:exports_external.literal("irreversible"),requires_operator_intent:exports_external.literal(!0),current_agent_allowed:exports_external.boolean(),rollback_disclaimer:exports_external.string().min(1)}).strict(),executionKindSchema=exports_external.discriminatedUnion("kind",[inlineExecutionSchema,subprocessExecutionSchema,deterministicExecutionSchema,hitlExecutionSchema,irreversibleExecutionSchema]),ARTIFACT_DIRECTIONS=["input","output"],stageArtifactSchema=exports_external.object({kind:exports_external.string().min(1),direction:exports_external.enum(ARTIFACT_DIRECTIONS),identity:exports_external.string().optional(),description:exports_external.string().optional(),required:exports_external.boolean().optional().default(!0)}).strict(),stageGateSchema=exports_external.object({name:exports_external.string().min(1),timing:exports_external.enum(["pre","post","transition"]),min_verdict:exports_external.enum(["pass","partial","fail"]).optional(),description:exports_external.string().optional()}).strict(),stageRetryPolicySchema=exports_external.object({max_attempts:exports_external.number().int().min(1),terminal_stop:exports_external.enum(["block","escalate","fail"]),timeout_seconds:exports_external.number().int().positive().optional()}).strict(),CAPABILITY_TIERS=["cheap","standard","capable-1","capable-2","capable-3"],LEGACY_CAPABLE_ALIAS="capable";function normalizeCapabilityTier(value){return value===LEGACY_CAPABLE_ALIAS?"capable-1":value}var capabilityTierSchema=exports_external.preprocess(normalizeCapabilityTier,exports_external.enum(CAPABILITY_TIERS)),objectiveEscalationTriggerSchema=exports_external.enum(["gate-fail","timeout","insufficient-evidence","retry-exhausted","resource-exhaustion","auth"]),stageModelPolicySchema=exports_external.object({min_tier:capabilityTierSchema,fallback:exports_external.array(exports_external.object({tier:capabilityTierSchema,trigger:objectiveEscalationTriggerSchema}).strict()),override_key:exports_external.string().optional()}).strict();var CONTEXT_LAYER_NAMES=["harness-policy","project-authority","stage-contract","task-state","indexed-evidence","run-state","tool-observations"],stageContextLayerSchema=exports_external.object({layer:exports_external.enum(CONTEXT_LAYER_NAMES),required:exports_external.literal(!0)}).strict(),stageEventSchema=exports_external.object({name:exports_external.string().min(1),description:exports_external.string().optional()}).strict(),STAGE_ID_PATTERN=/^[a-z][a-z0-9-]*$/,stageRecordSchema=exports_external.object({schema_version:stageSchemaVersionSchema,id:exports_external.string().regex(STAGE_ID_PATTERN,{message:"stage id must be lowercase kebab-case"}),aliases:exports_external.array(exports_external.string().min(1)).optional().default([]),description:exports_external.string().min(1),artifacts:exports_external.array(stageArtifactSchema).min(1),reasoning_skill:exports_external.string().min(1),required_references:exports_external.array(exports_external.string().min(1)).optional().default([]),gates:exports_external.array(stageGateSchema).optional().default([]),mutation_class:exports_external.enum(MUTATION_CLASSES),retry:stageRetryPolicySchema,model_policy:stageModelPolicySchema,context_layers:exports_external.array(stageContextLayerSchema).optional().default([]),observability:exports_external.array(stageEventSchema).optional().default([]),execution:executionKindSchema}).strict();var REGISTERED_CANONICAL_STAGES=[{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"refine",aliases:["dev-refine"],description:"dev-refine: Q&A refinement, section filling, AC tightening",artifacts:[{kind:"task-section",direction:"input",required:!0,description:"Background/Requirements sections"},{kind:"task-section",direction:"output",required:!0,description:"Q&A/Design/Plan/AC sections"}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-2",trigger:"gate-fail"},{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"plan",aliases:["dev-plan"],description:"dev-plan: feature intake -> AC generation -> decomposition",artifacts:[{kind:"feature-frontmatter",direction:"input",required:!0},{kind:"task-batch",direction:"output",required:!0}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[{name:"feature-check",timing:"post",min_verdict:"pass"},{name:"batch-create",timing:"post",min_verdict:"pass"}],mutation_class:"corpus",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"capable-2",fallback:[{tier:"capable-3",trigger:"gate-fail"},{tier:"capable-3",trigger:"auth"},{tier:"capable-3",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"implement",aliases:["dev-run"],description:"dev-run --mode implement: code edits in worktree",artifacts:[{kind:"worktree-diff",direction:"output",required:!0},{kind:"task-section",direction:"output",required:!0,identity:"Solution"}],reasoning_skill:"sp:code-implementation",required_references:[],gates:[],mutation_class:"code",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"timeout"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"test",aliases:["dev-unit","dev-fixall"],description:"dev-unit: generate/extend tests to coverage target",artifacts:[{kind:"test-file",direction:"output",required:!0},{kind:"coverage-report",direction:"output",required:!1}],reasoning_skill:"sp:code-testing",required_references:[],gates:[],mutation_class:"tests",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}],min_tier:"standard"},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"verify",aliases:["dev-verify"],description:"dev-verify: SECUA review + requirements traceability",artifacts:[{kind:"worktree-diff",direction:"input",required:!0},{kind:"verdict-artifact",direction:"output",required:!0,identity:"<wbs>-verdict.json"}],reasoning_skill:"sp:code-verification",required_references:[],gates:[{name:"verdict-artifact",timing:"post",min_verdict:"pass"},{name:"strict-core",timing:"post",min_verdict:"pass"}],mutation_class:"verdict",retry:{max_attempts:2,terminal_stop:"escalate"},model_policy:{min_tier:"capable-1",fallback:[{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"},{tier:"capable-2",trigger:"gate-fail"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"wrap",aliases:["dev-wrap"],description:"dev-wrap: learnings/doc-sync/feature transition",artifacts:[{kind:"learning-entry",direction:"output",required:!0}],reasoning_skill:"sp:spur-dev",required_references:[],gates:[{name:"task-check",timing:"pre",min_verdict:"pass"}],mutation_class:"learnings",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"hitl",current_agent_allowed:!0,gate_timing:"both"}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"review",aliases:["dev-review"],description:"dev-review: multi-dimensional code review (coordinator writes the combined Review)",artifacts:[{kind:"review-findings",direction:"output",required:!0,identity:"Review"}],reasoning_skill:"sp:code-verification",required_references:[],gates:[],mutation_class:"verdict",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[{tier:"capable-1",trigger:"gate-fail"},{tier:"capable-1",trigger:"auth"},{tier:"capable-1",trigger:"resource-exhaustion"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"record",aliases:["dev-record"],description:"record: deterministic Testing write-back from the verdict artifact; bare-Review fallback only",artifacts:[{kind:"verdict-artifact",direction:"input",required:!0,identity:"<wbs>-verdict.json"},{kind:"task-section",direction:"output",required:!0,identity:"Testing"},{kind:"task-section",direction:"output",required:!1,identity:"Review",description:"fallback-only: backfills Review only when the section is bare; never overwrites authored Review"}],reasoning_skill:"inline",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:1,terminal_stop:"block"},model_policy:{min_tier:"cheap",fallback:[]},context_layers:[],observability:[],execution:{kind:"deterministic",current_agent_allowed:!1,executor:"cli"}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"dogfood",aliases:["dev-dogfood"],description:"dev-dogfood: end-to-end driver test",artifacts:[{kind:"dogfood-report",direction:"output",required:!0},{kind:"monitor-ledger",direction:"output",required:!1}],reasoning_skill:"sp:dogfood-testing",required_references:[],gates:[],mutation_class:"driver",retry:{max_attempts:3,terminal_stop:"block"},model_policy:{min_tier:"capable-1",fallback:[{tier:"capable-2",trigger:"auth"},{tier:"capable-2",trigger:"resource-exhaustion"},{tier:"capable-2",trigger:"gate-fail"}]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"brainstorm",aliases:["dev-brainstorm"],description:"dev-brainstorm: structured ideation",artifacts:[{kind:"brainstorm-outline",direction:"output",required:!0}],reasoning_skill:"sp:brainstorm",required_references:[],gates:[],mutation_class:"corpus",retry:{max_attempts:2,terminal_stop:"block"},model_policy:{min_tier:"standard",fallback:[]},context_layers:[],observability:[],execution:{kind:"inline",current_agent_allowed:!0}},{schema_version:STAGE_REGISTRY_SCHEMA_VERSION,id:"changelog",aliases:["dev-changelog"],description:"dev-changelog: generate changelog from git commits",artifacts:[{kind:"changelog-entry",direction:"output",required:!0}],reasoning_skill:"inline",required_references:[],gates:[],mutation_class:"none",retry:{max_attempts:1,terminal_stop:"block"},model_policy:{min_tier:"cheap",fallback:[]},context_layers:[],observability:[],execution:{kind:"deterministic",current_agent_allowed:!1,executor:"cli"}}],CANONICAL_STAGE_BY_KEY=new Map;for(let s2 of REGISTERED_CANONICAL_STAGES){CANONICAL_STAGE_BY_KEY.set(s2.id,s2);for(let a2 of s2.aliases??[])CANONICAL_STAGE_BY_KEY.set(a2,s2)}var CACHEABILITY_CLASSES=["stable-prefix-eligible","volatile"],SENSITIVITY_CLASSES=["public","internal","confidential"],envelopeProvenanceSchema=exports_external.object({owner:exports_external.string().min(1),schema_version:exports_external.string().min(1),source_revision:exports_external.string().nullable().optional(),generated_at:exports_external.string().datetime()}).strict(),envelopeSizeBudgetSchema=exports_external.object({max_bytes:exports_external.number().int().positive()}).strict(),envelopeLayerSchema=exports_external.object({layer:exports_external.enum(CONTEXT_LAYER_NAMES),content:exports_external.string(),size_bytes:exports_external.number().int().nonnegative(),content_hash:exports_external.string().length(64),provenance:envelopeProvenanceSchema,cacheability:exports_external.enum(CACHEABILITY_CLASSES),sensitivity:exports_external.enum(SENSITIVITY_CLASSES).default("internal"),size_budget:envelopeSizeBudgetSchema.optional(),disclosure_handle:exports_external.string().optional()}).strict(),STABLE_LAYER_NAMES=["harness-policy","project-authority","stage-contract","task-state","indexed-evidence"],VOLATILE_LAYER_NAMES=["run-state","tool-observations"];var envelopeSchema=exports_external.object({schema_version:exports_external.string().default("1.0"),layers:exports_external.array(envelopeLayerSchema).min(1),stage_id:exports_external.string().optional(),run_id:exports_external.string().optional(),assembled_at:exports_external.string().datetime(),total_size_bytes:exports_external.number().int().nonnegative()}).strict(),projectSnapshotSchema=exports_external.object({name:exports_external.string(),version:exports_external.string(),task_counts:exports_external.object({backlog:exports_external.number().int().nonnegative(),todo:exports_external.number().int().nonnegative(),wip:exports_external.number().int().nonnegative(),testing:exports_external.number().int().nonnegative(),done:exports_external.number().int().nonnegative(),blocked:exports_external.number().int().nonnegative(),cancelled:exports_external.number().int().nonnegative()}).strict(),feature_counts:exports_external.object({backlog:exports_external.number().int().nonnegative(),active:exports_external.number().int().nonnegative(),verifying:exports_external.number().int().nonnegative(),done:exports_external.number().int().nonnegative(),blocked:exports_external.number().int().nonnegative(),cancelled:exports_external.number().int().nonnegative()}).strict(),active_features:exports_external.array(exports_external.string()),content_hash:exports_external.string().length(64).optional()}).strict(),taskSnapshotSchema=exports_external.object({wbs:exports_external.string().regex(/^\d{4}$/),name:exports_external.string(),status:exports_external.string(),priority:exports_external.string().optional(),feature_id:exports_external.string().optional(),acceptance_criteria:exports_external.string().optional(),locked_qa:exports_external.array(exports_external.string()).optional(),solution:exports_external.string().optional(),content_hash:exports_external.string().length(64).optional()}).strict(),featureSnapshotSchema=exports_external.object({id:exports_external.string(),name:exports_external.string(),status:exports_external.string(),priority:exports_external.string().optional(),scenarios:exports_external.array(exports_external.string()).optional(),content_hash:exports_external.string().length(64).optional()}).strict();var ALL_LAYER_NAMES=[...STABLE_LAYER_NAMES,...VOLATILE_LAYER_NAMES],LAYER_ORDER={};ALL_LAYER_NAMES.forEach((name,idx)=>{LAYER_ORDER[name]=idx});init_dist2();var TASK_CANONICAL_SECTIONS=["Background","Requirements","Acceptance Criteria","Q&A","Design","Plan","Root Cause","Solution","Testing","Review","References","History"],FEATURE_CANONICAL_SECTIONS=["Goal","Scope","Acceptance Criteria","Tasks","Notes","History"],UNIVERSAL_SECTIONS=["History","References","Notes"],HEADING_LEVELS={task:3,feature:2},START_MARKER="<!-- AUTO-GENERATED by spur feature refresh -->",END_MARKER="<!-- END AUTO-GENERATED -->",MARKER_START_RE=/<!--[ \t]*AUTO-GENERATED.*?-->/,MARKER_END_RE=/<!--[ \t]*END[ \t]*AUTO-GENERATED.*?-->/;function findHeadings(body,hashes){let hits=[],prefix=`${hashes} `,inCodeBlock=!1,lineStart=0;for(let i2=0;i2<=body.length;i2++){if(i2!==body.length&&body[i2]!==`
|
|
1457
1490
|
`)continue;let line=body.slice(lineStart,i2);if(line.startsWith("```"))inCodeBlock=!inCodeBlock;else if(!inCodeBlock&&line.startsWith(prefix)){let name=line.slice(prefix.length).trim();hits.push({index:lineStart,headingLine:line,name})}lineStart=i2+1}return hits}function findUnclosedFenceLine(text3){let inCodeBlock=!1,openLine=0,lineNo=0,lineStart=0;for(let i2=0;i2<=text3.length;i2++){if(i2!==text3.length&&text3[i2]!==`
|
|
1458
1491
|
`)continue;let line=text3.slice(lineStart,i2);if(lineNo++,line.startsWith("```"))if(inCodeBlock)inCodeBlock=!1;else inCodeBlock=!0,openLine=lineNo;lineStart=i2+1}return inCodeBlock?openLine:null}function normalizeYamlScalars(data){let out={};for(let[key,value]of Object.entries(data))if(value instanceof Date)out[key]=value.toISOString();else if(value!==null&&typeof value==="object"&&!Array.isArray(value))out[key]=normalizeYamlScalars(value);else out[key]=value;return out}class MarkdownDocument{_domain;_frontmatterBlock;_frontmatter;_preamble;_sections;_demotedHeadings=[];_duplicateSectionNames=[];_unclosedFenceLine;constructor(domain2,frontmatterBlock,frontmatter,preamble,sections,unclosedFenceLine){this._domain=domain2,this._frontmatterBlock=frontmatterBlock,this._frontmatter=frontmatter,this._preamble=preamble,this._sections=sections,this._unclosedFenceLine=unclosedFenceLine}static parse(content,domain2){let level=HEADING_LEVELS[domain2],hashes="#".repeat(level),frontmatterBlock="",frontmatter=null,body=content,fmMatch=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(content);if(fmMatch&&fmMatch.index===0){let raw=fmMatch[1]??"",data={};try{let parsed=$parse(raw);if(parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed))data=normalizeYamlScalars(parsed)}catch{}frontmatter={raw,data},frontmatterBlock=fmMatch[0],body=content.slice(fmMatch[0].length)}let bodyUnclosedFenceLine=findUnclosedFenceLine(body),unclosedFenceLine=bodyUnclosedFenceLine===null?null:bodyUnclosedFenceLine+(frontmatterBlock.match(/\n/g)??[]).length,hits=findHeadings(body,hashes),first=hits[0],preamble=first!==void 0?body.slice(0,first.index):body,allSections=hits.map((hit,idx)=>{let next=hits[idx+1],end=next!==void 0?next.index:body.length;return{name:hit.name,headingLine:hit.headingLine,originalText:body.slice(hit.index,end),modifiedText:null}}),seen=new Set,sections=[],duplicateNames=[];for(let s2 of allSections)if(seen.has(s2.name))duplicateNames.push(s2.name);else seen.add(s2.name),sections.push(s2);let doc2=new MarkdownDocument(domain2,frontmatterBlock,frontmatter,preamble,sections,unclosedFenceLine);return doc2._duplicateSectionNames.push(...duplicateNames),doc2}get domain(){return this._domain}replacePreamble(newBody){this._preamble=newBody}get frontmatter(){return this._frontmatter}get frontmatterRaw(){return this._frontmatter?.raw??null}get frontmatterData(){return this._frontmatter?.data??null}get bodyWithoutFrontmatter(){let result=this._preamble;for(let section of this._sections)result+=section.modifiedText??section.originalText;return result}get sectionNames(){return this._sections.map((s2)=>s2.name)}get demotedHeadings(){return this._demotedHeadings}get duplicateSectionNames(){return this._duplicateSectionNames}unclosedFenceLine(){return this._unclosedFenceLine}assertFenceBalance(name,body){let docFenceLine=this._unclosedFenceLine;if(docFenceLine!==null)throw Error(`Cannot write section "${name}": the document has an unclosed code fence at line ${docFenceLine}; later sections are hidden and would be dropped by this write. Close the fence and re-parse.`);if(this._duplicateSectionNames.length>0){let names=this._duplicateSectionNames.map((n2)=>`"${n2}"`).join(", ");throw Error(`Cannot write section "${name}": the document has duplicate top-level sections (${names}); the serialized result would have fewer sections than the input and the duplicates would be dropped. Merge or remove the duplicates and re-parse.`)}let bodyFenceLine=findUnclosedFenceLine(body);if(bodyFenceLine!==null)throw Error(`Cannot write section "${name}": the new body has an unclosed code fence (opening at body line ${bodyFenceLine}); writing it would leave the document inside an open fence and hide later sections.`)}get canonicalSections(){let base2=this._domain==="task"?TASK_CANONICAL_SECTIONS:FEATURE_CANONICAL_SECTIONS,extra=UNIVERSAL_SECTIONS.filter((s2)=>!base2.includes(s2));return[...base2,...extra]}validateSectionName(name){if(!this.canonicalSections.includes(name))throw Error(`Unknown section "${name}" for domain "${this._domain}". Canonical sections: ${this.canonicalSections.join(", ")}.`)}findSection(name){return this._sections.find((s2)=>s2.name===name)}hasSection(name){return this.findSection(name)!==void 0}getSection(name){this.validateSectionName(name);let section=this.findSection(name);if(section===void 0)return null;let text3=section.modifiedText??section.originalText,newlineIdx=text3.indexOf(`
|
|
1459
1492
|
`);return newlineIdx===-1?"":text3.slice(newlineIdx+1)}replaceSection(name,body){this.validateSectionName(name),this.assertFenceBalance(name,body);let cleaned=this.stripSameLevelHeadings(body),section=this.findSection(name);if(section!==void 0){let trimmed=cleaned.trim();section.modifiedText=trimmed.length>0?`${section.headingLine}
|
|
@@ -1490,7 +1523,7 @@ ${raw}
|
|
|
1490
1523
|
---
|
|
1491
1524
|
`:this._frontmatterBlock.slice(0,rawStart)+raw+this._frontmatterBlock.slice(rawStart+oldRaw.length)}serialize(){let result=this._frontmatterBlock;result+=this._preamble;for(let section of this._sections)result+=section.modifiedText??section.originalText;return result}}function escapeYamlArrayElement(value){return`"${value.replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`}function escapeYamlValue(value){if(value.startsWith('"')&&value.endsWith('"'))return value;if(/[:{}[\],&*?|>!%@`#"'\\\n\r]/.test(value))return`"${value.replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}"`;if(/^(null|true|false|yes|no|on|off)$/i.test(value))return`"${value}"`;if(/^\d/.test(value)&&!/^\d{4}-\d{2}-\d{2}/.test(value))return`"${value}"`;return value}init_zod();var TASK_STATUSES=["backlog","todo","wip","testing","blocked","done","cancelled"],FEATURE_STATUSES=["backlog","active","verifying","blocked","done","cancelled"];var PRIORITIES=["P0","P1","P2","P3"],PROFILES=["simple","standard","complex","research","refine","plan","unit","review","docs"],TASK_TYPES=["task","issue","review","meta","brainstorm"],TASK_VARIANTS=["standard","feature-impl","issue","review","meta","brainstorm"];var FEATURE_ID_PATTERN=/^[A-Z][1-9]*$/;var TASK_STATUS_ALIASES={completed:"done",complete:"done","in-progress":"wip","in progress":"wip",in_progress:"wip",dropped:"cancelled",cancel:"cancelled",canceled:"cancelled",new:"backlog",pending:"backlog",blocked:"blocked",wip:"wip",testing:"testing",done:"done",cancelled:"cancelled",backlog:"backlog",todo:"todo"};function normalizeTaskStatus(raw){let key=raw.trim().toLowerCase(),resolved=TASK_STATUS_ALIASES[key];if(resolved===void 0)throw Error(`Unknown task status: ${JSON.stringify(raw)} (allowed: ${TASK_STATUSES.join(", ")})`);return resolved}var isoDateString=exports_external.string().min(1).refine((value)=>!Number.isNaN(Date.parse(value)),{message:"must be an ISO 8601 timestamp"}),featureId=exports_external.string().regex(FEATURE_ID_PATTERN,{message:"feature id must match ^[A-Z][1-9]*$ (DD-14)"}).nullable().optional(),wbsString=exports_external.string().regex(/^\d{4}$/,{message:"parent_wbs must be a 4-digit WBS string"}).nullable().optional(),taskFrontmatterSchema=exports_external.object({schema_version:exports_external.literal(1),name:exports_external.string().min(1),description:exports_external.string().optional(),status:exports_external.preprocess((val)=>{if(typeof val==="string")try{return normalizeTaskStatus(val)}catch{}return val},exports_external.enum(TASK_STATUSES)),type:exports_external.enum(TASK_TYPES).optional().default("task"),template:exports_external.enum(TASK_VARIANTS).optional(),profile:exports_external.enum(PROFILES).optional(),feature_id:featureId,parent_wbs:wbsString,priority:exports_external.enum(PRIORITIES).optional(),tags:exports_external.array(exports_external.string()).optional(),dependencies:exports_external.array(exports_external.string()).optional(),ac_numbering:exports_external.literal("task-local").optional(),ac_altitude:exports_external.enum(["graduating","task-local"]).optional(),done_forced:exports_external.preprocess((v)=>typeof v==="string"?v==="true":v,exports_external.boolean().optional()),done_reason:exports_external.string().optional(),feature_link_declined:exports_external.preprocess((v)=>typeof v==="string"?v==="true":v,exports_external.boolean().optional()),estimate_hours:exports_external.preprocess((v)=>typeof v==="string"&&v.trim()!==""?Number(v):v,exports_external.number().positive().optional()),created_at:isoDateString,updated_at:isoDateString}),featureFrontmatterSchema=exports_external.object({schema_version:exports_external.literal(1),id:exports_external.string().regex(FEATURE_ID_PATTERN,{message:"feature id must match ^[A-Z][1-9]*$ (DD-14)"}),name:exports_external.string().min(1),status:exports_external.enum(FEATURE_STATUSES),priority:exports_external.enum(PRIORITIES).optional(),tags:exports_external.array(exports_external.string()).optional(),created_at:isoDateString,updated_at:isoDateString});var taskBatchItemSchema=exports_external.object({name:exports_external.string().min(1,"name is required"),background:exports_external.string().optional(),requirements:exports_external.string().optional(),design:exports_external.string().optional(),plan:exports_external.string().optional(),acceptance_criteria:exports_external.string().optional(),feature_id:featureId,parent_wbs:wbsString,priority:exports_external.enum(PRIORITIES).optional(),tags:exports_external.array(exports_external.string()).optional(),template:exports_external.enum(TASK_VARIANTS).optional(),estimate_hours:exports_external.number().positive().optional()}).strict(),taskBatchSchema=exports_external.array(taskBatchItemSchema).min(1,"batch must contain at least one task");init_dist2();init_zod();var sectionNameSchema=exports_external.enum(TASK_CANONICAL_SECTIONS),matrixEntrySchema=exports_external.object({required:exports_external.array(sectionNameSchema).optional(),optional:exports_external.array(sectionNameSchema).optional(),forbidden:exports_external.array(sectionNameSchema).optional(),gate:exports_external.boolean().optional()}).strict(),matrixStatusSchema=exports_external.enum(["backlog","todo","wip","testing","blocked","done","cancelled"]),sectionMatrixSchema=exports_external.object({variants:exports_external.record(exports_external.string(),exports_external.partialRecord(matrixStatusSchema,matrixEntrySchema))}).strict();var CANONICAL_INDEX=new Map(TASK_CANONICAL_SECTIONS.map((s2,i2)=>[s2,i2]));init_dist6();import{appendFileSync as appendFileSync3,existsSync as existsSync2,linkSync,lstatSync,mkdirSync as mkdirSync2,readdirSync as readdirSync2,readFileSync as readFileSync4,renameSync as renameSync2,statSync as statSync3,unlinkSync,writeFileSync as writeFileSync3}from"node:fs";import{tmpdir as tmpdir2}from"node:os";import{basename as basename2,dirname as dirname5,isAbsolute,join as join4,relative as relative2,resolve as resolve3,sep as sep3}from"node:path";import{dirname as dirname2,join,normalize,relative,resolve,sep}from"node:path";class RunArtifactPathError extends Error{constructor(message){super(message);this.name="RunArtifactPathError"}}function within(child,ancestor){return child===ancestor||child.startsWith(`${ancestor}${sep}`)}async function resolveDurableArtifactPath(fileSystem,workdir,pathRaw,plane){return resolveConfinedArtifactPath(fileSystem,workdir,pathRaw,plane==="memory"?".spur/memory":`.spur/memory/${plane}`)}async function resolveConfinedArtifactPath(fileSystem,workdir,pathRaw,root){if(typeof fileSystem.realPath!=="function")throw new RunArtifactPathError("physical path confinement requires a FileSystem with realPath support — refusing to skip confinement (0785 R2)");let workdirAbs=resolve(workdir),canonicalWorkdir;try{canonicalWorkdir=fileSystem.realPath(workdirAbs)}catch(error51){throw new RunArtifactPathError(`project workdir could not be canonicalized: ${error51.message}`)}let lexicalTarget=normalize(resolve(workdir,pathRaw)),lexicalRunRoot=normalize(join(resolve(workdir),root)),canonicalAlias=join(canonicalWorkdir,root);if(lexicalTarget.startsWith(`${canonicalAlias}${sep}`))lexicalTarget=join(lexicalRunRoot,relative(canonicalAlias,lexicalTarget));if(!lexicalTarget.startsWith(`${lexicalRunRoot}${sep}`))throw new RunArtifactPathError(`must resolve beneath ${root}/ (got ${pathRaw})`);let canonicalRunRootCandidate=join(canonicalWorkdir,root),canonicalRunRoot=canonicalRunRootCandidate;if(await fileSystem.stat(canonicalRunRootCandidate)!==null){try{canonicalRunRoot=fileSystem.realPath(canonicalRunRootCandidate)}catch(error51){throw new RunArtifactPathError(`${root} could not be canonicalized: ${error51.message}`)}if(!within(canonicalRunRoot,canonicalWorkdir))throw new RunArtifactPathError(`${root} resolves outside the project workdir through a symlink`)}let probe=lexicalTarget;for(;;){if(await fileSystem.stat(probe)!==null)break;let parent=dirname2(probe),listed;try{listed=await fileSystem.readDir(parent)}catch(error51){if(String(error51.message).includes("ENOENT"))listed=null;else throw new RunArtifactPathError(`ancestor ${parent} is unreadable: ${error51.message}`)}let base2=probe.slice(parent.length+1);if(listed?.includes(base2))throw new RunArtifactPathError(`dangling symlink at ${probe} — refusing artifact path`);let parentNorm=normalize(parent);if(parentNorm===probe)throw new RunArtifactPathError(`no existing ancestor found for ${pathRaw}`);probe=parentNorm}let anchor;try{anchor=fileSystem.realPath(probe)}catch(error51){throw new RunArtifactPathError(`ancestor ${probe} could not be canonicalized: ${error51.message}`)}if(!within(anchor,canonicalWorkdir))throw new RunArtifactPathError(`ancestor ${probe} escapes the project workdir through a symlink`);let reconstructed=normalize(join(anchor,relative(probe,lexicalTarget)));if(!reconstructed.startsWith(`${canonicalRunRoot}${sep}`))throw new RunArtifactPathError(`path escapes ${root}/ through a symlink (got ${pathRaw})`);return reconstructed}import{basename,dirname as dirname4,join as join3}from"node:path";import crypto4 from"node:crypto";import{tmpdir}from"node:os";import{dirname as dirname3,join as join2,resolve as resolve2,sep as sep2}from"node:path";init_zod();init_zod();var BOARD_MODULE_ID_PATTERN=/^[a-z][a-z0-9-]*$/;function isSafeFrameUrl(value){let parsed;try{parsed=new URL(value)}catch{return!1}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")return!1;return parsed.username===""&&parsed.password===""}var sharedDeclarationFields={id:exports_external.string().regex(BOARD_MODULE_ID_PATTERN,"module id must match ^[a-z][a-z0-9-]*$"),name:exports_external.string().min(1,"module name must not be empty"),icon:exports_external.string().min(1,"module icon must not be empty"),sidebarLabel:exports_external.string().optional(),description:exports_external.string().optional(),order:exports_external.number().refine((value)=>Number.isFinite(value),{message:"module order must be a finite number"}).optional(),enabled:exports_external.boolean().optional().default(!0)},boardModuleDeclarationSchema=exports_external.discriminatedUnion("type",[exports_external.object({...sharedDeclarationFields,type:exports_external.literal("react"),directory:exports_external.string().min(1),entry:exports_external.string().min(1),styles:exports_external.array(exports_external.string().min(1)).optional().default(()=>[])}).strict(),exports_external.object({...sharedDeclarationFields,type:exports_external.literal("iframe"),url:exports_external.string().refine(isSafeFrameUrl,{message:"iframe url must be an absolute http(s) URL without embedded credentials (relative URLs and other schemes are rejected)"})}).strict()]),boardModuleDeclarationsSchema=exports_external.array(boardModuleDeclarationSchema);var RFC3339_PATTERN=/^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(\.\d+)?([Zz]|[+-]\d{2}:\d{2})$/;function isRfc3339Timestamp(value){return RFC3339_PATTERN.test(value)&&Number.isFinite(Date.parse(value))}var ALL_FINDING_CODES=["L1.markdown-parse","L1.schema-validation","L2.missing-required-section","L2.forbidden-section","L2.disallowed-section","L2.heading-level","L2.section-order","L2.unclosed-code-fence","L3.requirements-format","L3.requirements-checkbox","L3.requirements-empty","L3.ac-empty","L3.ac-requirement-coverage","L3.solution-file-line","L3.review-priority-table","L3.required-section-placeholder","L3.plan-format","L3.unchecked-checklist","L3.ac-checklist-text","L3.ac-bdd-error","L3.ac-bdd-warning","L3.ac-bdd-invalid","L3.scope-delineation","L3.one-active-goal","L3.children-limit","L3.review-testing-contradiction","L4.design-placeholder","L4.feature-not-found","L4.feature-terminal","L4.missing-feature-id","L4.parent-not-found","L4.dependency-not-found","L4.rollup-subtasks-open","L4.rollup-parent-open","L4.rollup-missing-roster","L4.rollup-roster-not-declared-dependency","L4.readiness-blocked","L4.prose-prerequisite-unlisted","L4.prerequisite-cycle","L4.prerequisite-not-done","L4.gate-language","L4.linked-task-parse-failed","L4.orphan-scenarios","L4.uncovered-task-scenario","L4.uncovered-feature-scenario","L4.verdict-rows-match-no-scenario","L4.verifying-incomplete-tasks","L4.dogfood-missing","L4.stale-line-anchor","L4.anchor-unresolved","L4.anchor-subject-mismatch","L4.malformed-verdict-artifact","L4.scenario-unverified","L4.testing-verdict-stub","L4.evidence-not-recoverable","L4.feature-receipt-missing","L4.feature-receipt-malformed","L4.feature-receipt-cross-feature","L4.feature-receipt-divergent","L4.feature-receipt-failed","L4.feature-receipt-run","L4.feature-receipt-stale","L4.feature-receipt-contract","precheck-size","precheck-evidence","inventory-coverage"];function isFindingCode(code){return ALL_FINDING_CODES.includes(code)}init_dist();init_zod();var projectEntrySchema=exports_external.object({name:exports_external.string().min(1),path:exports_external.string().min(1),port:exports_external.number().int().nonnegative().default(0)}),projectsFileSchema=exports_external.object({schema_version:exports_external.literal(1).default(1),projects:exports_external.array(projectEntrySchema).default([])});init_zod();var slashCommandCategorySchema=exports_external.enum(["git","dev","sys","harness"]),slashCommandItemSchema=exports_external.object({name:exports_external.string().min(1),description:exports_external.string().min(1),category:slashCommandCategorySchema.default("dev"),argumentHint:exports_external.string().optional(),tags:exports_external.array(exports_external.string()).default([]),role:exports_external.string().optional(),source:exports_external.string().optional()}),slashCommandsFileSchema=exports_external.object({version:exports_external.number().int().default(1),updatedAt:exports_external.string().optional(),commands:exports_external.array(slashCommandItemSchema).default([])});var SPUR_LOG_LEVELS=["debug","info","warn","error"],DEFAULT_TASKS_DIR="docs/tasks",DEFAULT_FEATURES_DIR="docs/features",DEFAULT_DATABASE_URL=".spur/spur.db";var folderConfigSchema=exports_external.object({baseCounter:exports_external.number().int().nonnegative().default(0),label:exports_external.string().optional()});function folderPathWithDefault(defaultPath){return exports_external.preprocess((v)=>v==null?void 0:v,exports_external.string().default(defaultPath))}var tasksConfigSchema=exports_external.object({folders:exports_external.record(exports_external.string(),folderConfigSchema).default({}),active:folderPathWithDefault(DEFAULT_TASKS_DIR),severity:exports_external.record(exports_external.string(),exports_external.enum(["error","warning","off"])).optional()}).superRefine((data,ctx)=>{if(data.severity){for(let code of Object.keys(data.severity))if(!isFindingCode(code))ctx.addIssue({code:exports_external.ZodIssueCode.custom,path:["severity",code],message:`Unknown finding code "${code}" in severity overrides map`})}}),featuresConfigSchema=exports_external.object({dir:folderPathWithDefault(DEFAULT_FEATURES_DIR)}),EXECUTOR_CAPABILITY_TIERS=["cheap","standard","capable-1","capable-2","capable-3"];function normalizeExecutorTier(value){return value==="capable"?"capable-1":value}var executorCapabilityTierSchema=exports_external.preprocess((value)=>{if(value===void 0||value===null)return;return typeof value==="string"?normalizeExecutorTier(value):value},exports_external.enum(EXECUTOR_CAPABILITY_TIERS).optional()),AGENT_ROLE_NAMES=["scribe","coder","reviewer","planner"];var EXECUTION_CAPABILITY_AXES=["fsRead","fsWrite","networkEgress","processSpawn","externalMutationApproval"],SESSION_CAPABILITY_AXES=["resumeById","sessionDir","persistentStdin","structuredOutput"],AGENT_RUN_CAPABILITY_AXES=[...EXECUTION_CAPABILITY_AXES,...SESSION_CAPABILITY_AXES],EXECUTION_CAPABILITY_STATES=["enforced","available","unavailable","unknown"],EXECUTION_CAPABILITY_PROVENANCES=["native-known","operator-configured","unattested"],ExecutionCapabilityAttestationSchema=exports_external.object({state:exports_external.enum(EXECUTION_CAPABILITY_STATES),provenance:exports_external.enum(EXECUTION_CAPABILITY_PROVENANCES)}),ExecutionCapabilitiesSchema=exports_external.object({version:exports_external.literal(1),axes:exports_external.partialRecord(exports_external.enum(EXECUTION_CAPABILITY_AXES),ExecutionCapabilityAttestationSchema)}),EXECUTION_CAPABILITY_REQUIREMENTS=["available","enforced"],RequiresCapabilitiesSchema=exports_external.partialRecord(exports_external.enum(AGENT_RUN_CAPABILITY_AXES),exports_external.enum(EXECUTION_CAPABILITY_REQUIREMENTS)),executorAvailabilityOwnerSchema=exports_external.enum(["operator","quota","probe"]),executorDisabledObjectSchema=exports_external.object({owner:executorAvailabilityOwnerSchema,since:exports_external.string().refine(isRfc3339Timestamp,{message:"since must be an RFC 3339 timestamp"}),reason:exports_external.string().min(1)}),AgentExecutorConfigSchema=exports_external.object({name:exports_external.string().min(1),agent:exports_external.string().min(1),model:exports_external.string().min(1).optional(),tier:executorCapabilityTierSchema.optional(),executionCapabilities:ExecutionCapabilitiesSchema.optional(),disabled:exports_external.union([exports_external.boolean(),executorDisabledObjectSchema]).default(!1)});var AgentRoleConfigSchema=exports_external.object({tier:exports_external.enum(EXECUTOR_CAPABILITY_TIERS).optional(),stages:exports_external.array(exports_external.string().min(1)).min(1).optional()});var FleetMemberSchema=exports_external.object({id:exports_external.string().min(1).optional(),role:exports_external.enum(AGENT_ROLE_NAMES,{error:(issue2)=>Error(`Unknown role "${issue2.input}" — expected one of: ${AGENT_ROLE_NAMES.join(", ")}`)}).optional(),executor:exports_external.string().min(1).optional(),purpose:exports_external.string().optional(),enabled:exports_external.boolean().optional()}),FLEET_STRATEGIES=["rest","gtd"],FleetMemberEntrySchema=FleetMemberSchema.superRefine((member,ctx)=>{if(member.role===void 0&&member.executor===void 0)ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:"must declare a role or an executor — at least one is required"})}),AgentFleetSchema=exports_external.object({enabled:exports_external.boolean().default(!1),strategy:exports_external.enum(FLEET_STRATEGIES).default("rest"),orchestrator:exports_external.string().min(1).optional(),members:exports_external.array(FleetMemberEntrySchema).default([])});var AgentOutputConfigSchema=exports_external.object({"max-bytes":exports_external.number().int().positive().optional(),"max-lines":exports_external.number().int().positive().optional()}),AgentConfigSchema=exports_external.object({default:exports_external.string().optional(),executors:exports_external.array(AgentExecutorConfigSchema).optional(),roles:exports_external.record(exports_external.string(),AgentRoleConfigSchema).optional(),output:AgentOutputConfigSchema.optional(),sessionAffinity:exports_external.boolean().optional(),fleet:AgentFleetSchema.optional()}).superRefine((value,ctx)=>{for(let key of Object.keys(value.roles??{}))if(!AGENT_ROLE_NAMES.includes(key))ctx.addIssue({code:exports_external.ZodIssueCode.custom,path:["roles",key],message:`Unknown role "${key}" — expected one of: ${AGENT_ROLE_NAMES.join(", ")}`});let executors=value.executors,executorNames=new Set;if(executors!==void 0){let seen=new Set;for(let[index2,executor]of executors.entries()){if(seen.has(executor.name))ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:`Duplicate executor name: ${executor.name}`,path:["executors",index2,"name"]});if(executor.name==="inline"||executor.name==="auto")ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:`Executor name "${executor.name}" is reserved (the --agent selector value '${executor.name}' has fixed semantics); rename executor at index ${index2}.`,path:["executors",index2,"name"]});if(AGENT_ROLE_NAMES.includes(executor.name))ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:`Executor name "${executor.name}" collides with the role selector namespace ("${executor.name}"); rename executor at index ${index2}.`,path:["executors",index2,"name"]});seen.add(executor.name),executorNames.add(executor.name)}}}),RulesConfigSchema=exports_external.object({paths:exports_external.array(exports_external.string()).optional()}),WorkflowsConfigSchema=exports_external.object({paths:exports_external.array(exports_external.string()).optional()}),WorkflowConfigSchema=exports_external.object({hitlDecisionMaker:exports_external.boolean().optional(),decideDecisionMaker:exports_external.boolean().optional(),logRetentionDays:exports_external.number().int().positive().default(30)}),RedactionConfigSchema=exports_external.object({enabled:exports_external.boolean().optional()}),HistoryRefreshConfigSchema=exports_external.object({on_completion:exports_external.boolean().default(!1),debounce_ms:exports_external.number().int().min(1000).default(600000)}),HistoryConfigSchema=exports_external.object({refresh:HistoryRefreshConfigSchema.optional()}),VersionCarrierEntrySchema=exports_external.looseObject({type:exports_external.string().min(1)}),BuilderBumpVerConfigSchema=exports_external.object({tagVersionSeparator:exports_external.string().min(1).default("-v"),aggregatePackage:exports_external.string().min(1).optional(),publishWorkflow:exports_external.string().min(1).default("publish.yml"),releaseCommitType:exports_external.string().min(1).default("chore"),releaseCommitScope:exports_external.string().min(1).default("release"),ghRunListLimit:exports_external.number().int().positive().default(5),versionCarriers:exports_external.array(VersionCarrierEntrySchema).default([])}),BuilderConfigSchema=exports_external.object({"bump-ver":BuilderBumpVerConfigSchema.optional()});var bootstrapOptionsSchema=exports_external.object({options:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}),bootstrapSectionSchema=bootstrapOptionsSchema.extend({modules:boardModuleDeclarationsSchema.optional()}),spurConfigSchema=exports_external.object({version:exports_external.string().optional(),name:exports_external.string().optional(),bootstrap:bootstrapSectionSchema.optional(),agent:AgentConfigSchema.optional(),rules:RulesConfigSchema.optional(),workflows:WorkflowsConfigSchema.optional(),workflow:WorkflowConfigSchema.optional(),redaction:RedactionConfigSchema.optional(),history:HistoryConfigSchema.optional(),builder:BuilderConfigSchema.optional(),tasks:tasksConfigSchema.optional(),features:featuresConfigSchema.optional()});var configSchema3=exports_external.object({database:exports_external.object({url:exports_external.string().default(DEFAULT_DATABASE_URL)}).default({url:DEFAULT_DATABASE_URL}),server:exports_external.object({port:exports_external.coerce.number().int().positive().default(3000),host:exports_external.string().default("localhost"),openBrowser:exports_external.boolean().default(!0),webDistPath:exports_external.string().nullable().default(null)}).default({port:3000,host:"localhost",openBrowser:!0,webDistPath:null}),telemetry:exports_external.object({enabled:exports_external.boolean().default(!1),endpoint:exports_external.string().optional()}).default({enabled:!1}),logging:exports_external.object({level:exports_external.enum(SPUR_LOG_LEVELS).default("info")}).default({level:"info"})});init_dist6();import crypto3 from"node:crypto";function canonicalJsonStringify(obj){if(obj===null||typeof obj!=="object")return JSON.stringify(obj);if(Array.isArray(obj))return`[${obj.map(canonicalJsonStringify).join(",")}]`;return`{${Object.keys(obj).sort().map((key)=>`${JSON.stringify(key)}:${canonicalJsonStringify(obj[key])}`).join(",")}}`}function computeDefinitionDigest(workflow){let canonical=canonicalJsonStringify(workflow);return`sha256:${crypto3.createHash("sha256").update(canonical,"utf8").digest("hex")}`}class ProofCaptureError extends Error{stderr;constructor(message,stderr){super(message);this.stderr=stderr;this.name="ProofCaptureError"}}var TASK_SPEC_SECTIONS=["Background","Requirements","Acceptance Criteria","Design","Plan"],CANONICAL_TASK_HEADING_RE=/^##[ \t]+(\d+)\.[ \t]+(\S.*)$/m;function taskDocumentShapeError(content){let doc2=MarkdownDocument.parse(content,"task"),heading=CANONICAL_TASK_HEADING_RE.exec(doc2.bodyWithoutFrontmatter);if(heading===null)return"no canonical task heading (`## <WBS>. <title>`) was found";if((heading[2]??"").trim()==="")return`the canonical task heading for WBS ${heading[1]} has an empty title`;if(TASK_SPEC_SECTIONS.filter((section)=>doc2.hasSection(section)).length===0)return`no task specification section (${TASK_SPEC_SECTIONS.join(", ")}) was found`;return null}async function readProofInputContents(fileSystem=createNodeFileSystem2(),workdir,options){for(let name of["taskFile","featureFile"]){let value=options[name];if(value!==void 0&&typeof value!=="string")return{ok:!1,error:`${name} must be a string when supplied (got ${typeof value})`}}let readOne=async(name)=>{let raw=name==="taskFile"?options.taskFile:options.featureFile;if(raw===void 0||raw==="")return{};let workdirAbs=resolve2(workdir),resolved=resolve2(workdirAbs,raw);if(!(resolved===workdirAbs||resolved.startsWith(`${workdirAbs}${sep2}`)))return{error:`${name} must resolve under the workflow workdir (${workdirAbs}): ${raw}`};let stat;try{stat=await fileSystem.stat(resolved)}catch(error51){return{error:`${name} could not be inspected: ${error51.message}`}}if(stat===null)return{error:`${name} does not exist: ${raw} (resolved ${resolved}) — an explicitly supplied spec must be readable, not silently omitted`};if(!stat.isFile())return{error:`${name} is not a regular file: ${resolved}`};let content;try{content=await fileSystem.readFile(resolved)}catch(error51){return{error:`${name} is not readable: ${error51.message}`}}if(name==="taskFile"){let shapeError=taskDocumentShapeError(content);if(shapeError!==null)return{error:`taskFile is not a task document: ${raw} (resolved ${resolved}) — ${shapeError}. Supply the task specification markdown itself: a \`## <WBS>. <title>\` heading plus at least one of ${TASK_SPEC_SECTIONS.join(", ")}. A file containing only a path is not dereferenced.`}}return{content}},task=await readOne("taskFile");if(task.error!==void 0)return{ok:!1,error:task.error};let feature=await readOne("featureFile");if(feature.error!==void 0)return{ok:!1,error:feature.error};return{ok:!0,...task.content!==void 0?{taskContent:task.content}:{},...feature.content!==void 0?{featureContent:feature.content}:{}}}var DEFAULT_EXCLUDE_GLOBS=["docs/tasks*","docs/features*"];async function createGitAlternateTree(cwd,excludeGlobs=DEFAULT_EXCLUDE_GLOBS,executor=new NodeProcessExecutor2,fs2=createNodeFileSystem2()){let indexFile=join2(tmpdir(),`spur-proof-fingerprint-${crypto4.randomUUID()}.index`);try{await fs2.ensureDir(dirname3(indexFile));let env2=Object.fromEntries(Object.entries(getEnvVars()).filter((entry)=>entry[1]!==void 0));env2.GIT_INDEX_FILE=indexFile;let common4={cwd,env:env2,forceBuffered:!0,rejectOnError:!1},read=await executor.run({command:"git",args:["read-tree","HEAD"],...common4});if(read.exitCode!==0)throw new ProofCaptureError(`git read-tree HEAD failed with exit code ${read.exitCode}`,read.stderr);let excludes=excludeGlobs.map((glob)=>`:(exclude)${glob}`),add=await executor.run({command:"git",args:["add","-A","--",".",...excludes],...common4});if(add.exitCode!==0)throw new ProofCaptureError(`git add -A failed with exit code ${add.exitCode}`,add.stderr);let tree=await executor.run({command:"git",args:["write-tree"],...common4});if(tree.exitCode!==0)throw new ProofCaptureError(`git write-tree failed with exit code ${tree.exitCode}`,tree.stderr);return tree.stdout.trim()}catch(error51){if(error51 instanceof ProofCaptureError)throw error51;throw new ProofCaptureError(`git alternate-tree capture threw: ${error51.message}`)}finally{if(await fs2.exists(indexFile))try{await fs2.deleteFile(indexFile)}catch{}}}function canonicalizeCheckboxMarkers(body){return body.replace(/^([ \t]*)[-*+][ \t]+\[[ xX]\]/gm,"$1- [x]")}function extractTaskProofData(content){let doc2=MarkdownDocument.parse(content,"task"),fm=doc2.frontmatterData??{},wbs=typeof fm.wbs==="string"?fm.wbs:void 0,name=typeof fm.name==="string"?fm.name:void 0,feature_id=typeof fm.feature_id==="string"?fm.feature_id:void 0,depends_on;if(Array.isArray(fm.depends_on))depends_on=fm.depends_on.filter((d)=>typeof d==="string");else if(Array.isArray(fm.dependencies))depends_on=fm.dependencies.filter((d)=>typeof d==="string");let sections={},taskSections=["Background","Requirements","Acceptance Criteria","Design","Plan"];for(let sec of taskSections)if(doc2.hasSection(sec)){let body=doc2.getSection(sec);if(body!==null)sections[sec]=canonicalizeCheckboxMarkers(body.trim())}return{...wbs!==void 0?{wbs}:{},...name!==void 0?{name}:{},...feature_id!==void 0?{feature_id}:{},...depends_on!==void 0?{depends_on}:{},sections}}function extractFeatureProofData(content){let doc2=MarkdownDocument.parse(content,"feature"),fm=doc2.frontmatterData??{},id=typeof fm.id==="string"?fm.id:void 0,name=typeof fm.name==="string"?fm.name:void 0,sections={},featureSections=["Goal","Scope","Acceptance Criteria"];for(let sec of featureSections)if(doc2.hasSection(sec)){let body=doc2.getSection(sec);if(body!==null)sections[sec]=canonicalizeCheckboxMarkers(body.trim())}return{...id!==void 0?{id}:{},...name!==void 0?{name}:{},sections}}async function computeProofInputFingerprint(options={}){let cwd=options.cwd??process.cwd(),gitTree=await createGitAlternateTree(cwd,options.excludeGlobs??DEFAULT_EXCLUDE_GLOBS,options.processExecutor,options.fileSystem),task;if(options.taskContent!==void 0)task=extractTaskProofData(options.taskContent);let feature;if(options.featureContent!==void 0)feature=extractFeatureProofData(options.featureContent);let canonical=canonicalJsonStringify({gitTree,...task!==void 0?{task}:{},...feature!==void 0?{feature}:{},...options.learningsContent!==void 0?{learnings:options.learningsContent}:{}});return`sha256:${crypto4.createHash("sha256").update(canonical,"utf8").digest("hex")}`}var ProofInputFingerprint={compute:computeProofInputFingerprint};var FEATURE_RECEIPT_SCHEMA_VERSION=1,DEFAULT_FEATURE_VERIFICATION_CMD="bun run spur-check-feature",RECEIPT_ID_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function assertReceiptId(kind,id){if(!RECEIPT_ID_PATTERN.test(id)||id.includes(".."))throw Error(`invalid ${kind} for receipt path: ${JSON.stringify(id)}`)}function featureReceiptPaths(runDir,featureId2,runId){return assertReceiptId("featureId",featureId2),assertReceiptId("runId",runId),{runScoped:join3(dirname4(runDir),"memory","evidence",`${runId}-feature-verification.json`),featureScoped:join3(dirname4(runDir),"memory","evidence",`${featureId2}-feature-verification.json`),log:join3(runDir,`${runId}-feature-verification.log`),status:join3(runDir,`${runId}-feature-verification.status`)}}async function atomicWriteReceipt(fs2,path8,receipt){path8=await resolveDurableArtifactPath(fs2,receipt.workdir,path8,"evidence"),ensureDurablePlaneIgnored(receipt.workdir),await fs2.ensureDir(dirname4(path8));let body=`${JSON.stringify(receipt,null,4)}
|
|
1492
1525
|
`,tmp=`${path8}.tmp`;await fs2.writeFile(tmp,body),await fs2.rename(tmp,path8)}async function startFeatureVerificationReceipt(fs2,runDir,options){let receipt={schemaVersion:FEATURE_RECEIPT_SCHEMA_VERSION,featureId:options.featureId,runId:options.runId,workdir:options.workdir,verifier:options.verifier,verificationCmd:options.verificationCmd,inputDigest:options.inputDigest,status:"RUNNING",startedAt:options.startedAt??new Date().toISOString().replace(/\.\d{3}Z$/,"Z"),completedAt:null},paths=featureReceiptPaths(runDir,options.featureId,options.runId);return await fs2.ensureDir(runDir),await atomicWriteReceipt(fs2,paths.featureScoped,receipt),await atomicWriteReceipt(fs2,paths.runScoped,receipt),receipt}async function completeFeatureVerificationReceipt(fs2,runDir,running,options){if(running.status!=="RUNNING")throw Error(`receipt for run ${running.runId} is already ${running.status}`);let receipt={...running,status:options.status,inputDigest:options.inputDigest??running.inputDigest,completedAt:options.completedAt??new Date().toISOString().replace(/\.\d{3}Z$/,"Z")},paths=featureReceiptPaths(runDir,receipt.featureId,receipt.runId);return await fs2.ensureDir(runDir),await atomicWriteReceipt(fs2,paths.runScoped,receipt),await atomicWriteReceipt(fs2,paths.featureScoped,receipt),await fs2.writeFile(paths.status,`${receipt.status}
|
|
1493
|
-
`),receipt}function parseFeatureVerificationReceipt(raw){let parsed;try{parsed=JSON.parse(raw)}catch(err){throw Error(`not JSON (${String(err)})`)}if(parsed===null||typeof parsed!=="object")throw Error("not an object");let r=parsed;if(r.schemaVersion!==FEATURE_RECEIPT_SCHEMA_VERSION)throw Error(`schemaVersion must be ${FEATURE_RECEIPT_SCHEMA_VERSION}`);let v=r.verifier;if(typeof r.featureId!=="string"||typeof r.runId!=="string"||typeof r.workdir!=="string"||typeof v?.name!=="string"||typeof v?.sourcePath!=="string"||typeof v?.layer!=="string"||typeof v?.definitionDigest!=="string"||typeof r.verificationCmd!=="string"||typeof r.inputDigest!=="string"||r.status!=="RUNNING"&&r.status!=="PASS"&&r.status!=="FAIL"||typeof r.startedAt!=="string"||r.completedAt!==null&&typeof r.completedAt!=="string")throw Error("required fields missing or mistyped");return parsed}async function readReceiptCopy(fs2,path8,label){let raw;try{raw=await fs2.readFile(path8)}catch{throw Error(`no ${label} receipt at ${path8}; run the feature-scoped verification pass`)}try{return parseFeatureVerificationReceipt(raw)}catch(err){throw Error(`${label} receipt at ${basename(path8)} is not a valid schema-v1 artifact (${String(err)})`)}}async function validateFeatureVerificationReceipt(fs2,options){let latest;try{latest=await readReceiptCopy(fs2,featureReceiptPaths(options.runDir,options.featureId,options.featureId).featureScoped,"feature-latest")}catch(err){let message=String(err);return{ok:!1,reason:message.includes("not a valid")?"malformed":"missing",detail:message}}let paths=featureReceiptPaths(options.runDir,options.featureId,latest.runId);try{let runScoped=await readReceiptCopy(fs2,paths.runScoped,"run-scoped");if(JSON.stringify(runScoped)!==JSON.stringify(latest))return{ok:!1,reason:"divergent",detail:`run-scoped ${paths.runScoped} and feature-latest receipts disagree — a newer attempt started or the evidence was tampered with`}}catch(err){let message=String(err);return{ok:!1,reason:message.includes("not a valid")?"malformed":"missing",detail:message}}if(latest.featureId!==options.featureId)return{ok:!1,reason:"cross-feature",detail:`receipt belongs to feature "${latest.featureId}", not "${options.featureId}"`};if(latest.status==="FAIL")return{ok:!1,reason:"failed",detail:`verification pass recorded FAIL (started ${latest.startedAt}, ended ${latest.completedAt})`};if(latest.status==="RUNNING")return{ok:!1,reason:"run",detail:`verification pass is still RUNNING (started ${latest.startedAt}); no completion evidence exists`};if(options.runPort?.readRunRow){let row=await options.runPort.readRunRow(latest.runId);if(!row)return{ok:!1,reason:"run",detail:`run ${latest.runId} that recorded the receipt does not exist in the run store`};if(row.status!=="done")return{ok:!1,reason:"run",detail:`run ${latest.runId} is "${row.status}", not terminal done — the recording run never finished`};if(row.definitionDigest&&row.definitionDigest!==latest.verifier.definitionDigest)return{ok:!1,reason:"run",detail:`run ${latest.runId} attached with definition digest ${row.definitionDigest}, receipt records ${latest.verifier.definitionDigest} (receipt sourcePath=${latest.verifier.sourcePath}) — a different spur install may have attached the run; re-run the verification pass and the transition with the same spur binary`};let recordedCmd;try{let vars=row.varsJson?JSON.parse(row.varsJson):void 0;if(vars&&typeof vars==="object"&&typeof vars.verificationCmd==="string")recordedCmd=vars.verificationCmd}catch{recordedCmd=void 0}if(recordedCmd!==void 0&&recordedCmd!==latest.verificationCmd)return{ok:!1,reason:"run",detail:`run ${latest.runId} recorded effective command "${recordedCmd}", receipt records "${latest.verificationCmd}"`};if(options.runPort.hasArtifact&&!await options.runPort.hasArtifact(latest.runId,paths.runScoped))return{ok:!1,reason:"run",detail:`receipt ${basename(paths.runScoped)} is not registered as an artifact of run ${latest.runId}`}}let verifier=latest.verifier,current=options.currentVerifier,drifted=["name","layer","definitionDigest"].filter((k)=>verifier[k]!==current[k]);if(drifted.length>0)return{ok:!1,reason:"contract-mismatch",detail:`receipt recorded verifier ${verifier.name}@${verifier.layer} (${verifier.definitionDigest}), completion evaluates ${current.name}@${current.layer} (${current.definitionDigest}) — the selected definition changed after the pass (${drifted.join(", ")}); receipt sourcePath=${verifier.sourcePath}, current sourcePath=${current.sourcePath}${verifier.sourcePath!==current.sourcePath?" — a different spur install resolved a different definition; re-run the verification pass and the transition with the same spur binary":""}`};if(latest.verificationCmd!==options.currentVerificationCmd)return{ok:!1,reason:"contract-mismatch",detail:`receipt recorded with verifier "${latest.verificationCmd}", completion evaluates the configured command "${options.currentVerificationCmd}"`};if(latest.inputDigest!==options.currentDigest)return{ok:!1,reason:"stale",detail:`receipt digest ${latest.inputDigest} ≠ current inputs ${options.currentDigest} — tree, spec, learnings or check contract changed after the pass`};return{ok:!0,receipt:latest}}async function captureFeatureReceiptDigest(repoRoot,featureContent,learningsContent){return ProofInputFingerprint.compute({cwd:repoRoot,featureContent,learningsContent})}var SECRET_PATTERN=/(?:sk-[a-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*\S+|bearer\s+\S+)/gi;function redactAndBound(value,secrets,maxChars){let redacted=value.replace(SECRET_PATTERN,"[REDACTED]");for(let secret of secrets)if(secret!=="")redacted=redacted.split(secret).join("[REDACTED]");return redacted.length<=maxChars?redacted:`${redacted.slice(0,maxChars)}…`}class InvalidWorkflowRunIdError extends Error{code="invalid-run-id";constructor(runId){super(`Invalid workflow run id: ${JSON.stringify(runId)}`);this.name="InvalidWorkflowRunIdError"}}init_zod();var VERDICT_AGGREGATES=["PASS","PARTIAL","FAIL","UNKNOWN"],ROW_STATUSES=["MET","PARTIAL","UNMET","N/A"],CHECK_SEVERITIES=["blocker","major","minor","advisory"],verdictSchema=exports_external.string().transform((v,ctx)=>{let up=v.toUpperCase();if(!VERDICT_AGGREGATES.includes(up))return ctx.addIssue({code:"custom",message:`invalid verdict "${v}" (expected PASS|PARTIAL|FAIL|UNKNOWN)`}),"UNKNOWN";return up}),coverageRowSchema=exports_external.object({id:exports_external.string().optional(),scenario:exports_external.string().optional(),status:exports_external.string(),evidenceType:exports_external.string().optional(),evidence:exports_external.string().optional()}).superRefine((r,ctx)=>{if(r.id!==void 0&&r.scenario!==void 0&&r.id!==r.scenario)ctx.addIssue({code:"custom",message:`id/scenario conflict ("${r.id}" vs "${r.scenario}")`,path:["scenario"]});if(!ROW_STATUSES.includes(r.status.toUpperCase()))ctx.addIssue({code:"custom",message:`invalid row status "${r.status}"`,path:["status"]})}).transform((r)=>({id:r.id??r.scenario??"",status:r.status.toUpperCase(),evidenceType:r.evidenceType??"",evidence:r.evidence??""})),checkSchema=exports_external.object({name:exports_external.string().optional(),check:exports_external.string().optional(),id:exports_external.string().optional(),status:exports_external.string(),evidence:exports_external.string().optional().default(""),severity:exports_external.enum(CHECK_SEVERITIES).optional()}).superRefine((c3,ctx)=>{if(c3.name===void 0&&c3.check===void 0&&c3.id===void 0)ctx.addIssue({code:"custom",message:"check row needs one of name/check/id",path:["name"]})}).transform((c3)=>({name:c3.name??c3.check??c3.id??"",status:c3.status,evidence:c3.evidence,severity:c3.severity})),verifyVerdictSchema=exports_external.object({wbs:exports_external.string().optional().default(""),verdict:verdictSchema,requirements:exports_external.array(coverageRowSchema).optional().default([]),acceptanceCriteria:exports_external.array(coverageRowSchema).optional().default([]),checks:exports_external.array(checkSchema).optional().default([]),source:exports_external.string().optional(),pipelineRunId:exports_external.string().optional(),recordedAt:exports_external.string().optional()});function parseVerifyVerdict(raw,fallbackWbs){let wbs=fallbackWbs??"";if(raw.trim()==="")return{kind:"missing",wbs};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{kind:"malformed",wbs,message:err.message}}if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return{kind:"invalid",wbs,reason:"root must be a JSON object"};let result=verifyVerdictSchema.safeParse(parsed);if(!result.success){let issues=result.error.issues.map((i2)=>`${i2.path.join(".")}: ${i2.message}`);return{kind:"invalid",wbs,reason:issues.join("; "),issues}}let verdict={...result.data,wbs:result.data.wbs!==""?result.data.wbs:wbs};return{kind:"valid",wbs,verdict}}function runStoragePaths(cwd){let projectRoot=resolveRunStorageRoot(cwd);return{projectRoot,scratchDir:join4(projectRoot,".spur","run"),evidenceDir:join4(projectRoot,".spur","memory","evidence"),recordsDir:join4(projectRoot,".spur","memory","runs")}}function resolveRunStorageRoot(cwd){let start=resolve3(cwd),sharedTmp=resolve3(tmpdir2()),current=start;for(;;){if(current!==sharedTmp&&(existsSync2(join4(current,".spur"))||existsSync2(join4(current,"package.json"))))return current;let parent=resolve3(current,"..");if(parent===current)return start;current=parent}}var DURABLE_PLANE_EXCLUDE=".spur/memory/";function ensureDurablePlaneIgnored(workdir){try{let gitPath=join4(workdir,".git");if(!existsSync2(gitPath))return;let excludePath=join4(gitPath,"info","exclude");try{if(statSync3(gitPath).isFile()){let gitdir=readFileSync4(gitPath,"utf8").split(/\r?\n/).find((line)=>line.startsWith("gitdir:"))?.slice(7).trim();if(gitdir){let resolved=isAbsolute(gitdir)?gitdir:resolve3(workdir,gitdir),common4=/[/\\]worktrees[/\\][^/\\]+$/.test(resolved)?resolve3(resolved,"..",".."):resolved;excludePath=join4(common4,"info","exclude")}}}catch{}let current="";try{current=readFileSync4(excludePath,"utf8")}catch{current=""}if(current.includes(DURABLE_PLANE_EXCLUDE))return;mkdirSync2(dirname5(excludePath),{recursive:!0});let sep4=current===""||current.endsWith(`
|
|
1526
|
+
`),receipt}function parseFeatureVerificationReceipt(raw){let parsed;try{parsed=JSON.parse(raw)}catch(err){throw Error(`not JSON (${String(err)})`)}if(parsed===null||typeof parsed!=="object")throw Error("not an object");let r=parsed;if(r.schemaVersion!==FEATURE_RECEIPT_SCHEMA_VERSION)throw Error(`schemaVersion must be ${FEATURE_RECEIPT_SCHEMA_VERSION}`);let v=r.verifier;if(typeof r.featureId!=="string"||typeof r.runId!=="string"||typeof r.workdir!=="string"||typeof v?.name!=="string"||typeof v?.sourcePath!=="string"||typeof v?.layer!=="string"||typeof v?.definitionDigest!=="string"||typeof r.verificationCmd!=="string"||typeof r.inputDigest!=="string"||r.status!=="RUNNING"&&r.status!=="PASS"&&r.status!=="FAIL"||typeof r.startedAt!=="string"||r.completedAt!==null&&typeof r.completedAt!=="string")throw Error("required fields missing or mistyped");return parsed}async function readReceiptCopy(fs2,path8,label){let raw;try{raw=await fs2.readFile(path8)}catch{throw Error(`no ${label} receipt at ${path8}; run the feature-scoped verification pass`)}try{return parseFeatureVerificationReceipt(raw)}catch(err){throw Error(`${label} receipt at ${basename(path8)} is not a valid schema-v1 artifact (${String(err)})`)}}async function validateFeatureVerificationReceipt(fs2,options){let latest;try{latest=await readReceiptCopy(fs2,featureReceiptPaths(options.runDir,options.featureId,options.featureId).featureScoped,"feature-latest")}catch(err){let message=String(err);return{ok:!1,reason:message.includes("not a valid")?"malformed":"missing",detail:message}}let paths=featureReceiptPaths(options.runDir,options.featureId,latest.runId);try{let runScoped=await readReceiptCopy(fs2,paths.runScoped,"run-scoped");if(JSON.stringify(runScoped)!==JSON.stringify(latest))return{ok:!1,reason:"divergent",detail:`run-scoped ${paths.runScoped} and feature-latest receipts disagree — a newer attempt started or the evidence was tampered with`}}catch(err){let message=String(err);return{ok:!1,reason:message.includes("not a valid")?"malformed":"missing",detail:message}}if(latest.featureId!==options.featureId)return{ok:!1,reason:"cross-feature",detail:`receipt belongs to feature "${latest.featureId}", not "${options.featureId}"`};if(latest.status==="FAIL")return{ok:!1,reason:"failed",detail:`verification pass recorded FAIL (started ${latest.startedAt}, ended ${latest.completedAt})`};if(latest.status==="RUNNING")return{ok:!1,reason:"run",detail:`verification pass is still RUNNING (started ${latest.startedAt}); no completion evidence exists`};if(options.runPort?.readRunRow){let row=await options.runPort.readRunRow(latest.runId);if(!row)return{ok:!1,reason:"run",detail:`run ${latest.runId} that recorded the receipt does not exist in the run store`};if(row.status!=="done")return{ok:!1,reason:"run",detail:`run ${latest.runId} is "${row.status}", not terminal done — the recording run never finished`};if(row.definitionDigest&&row.definitionDigest!==latest.verifier.definitionDigest)return{ok:!1,reason:"run",detail:`run ${latest.runId} attached with definition digest ${row.definitionDigest}, receipt records ${latest.verifier.definitionDigest} (receipt sourcePath=${latest.verifier.sourcePath}) — a different spur install may have attached the run; re-run the verification pass and the transition with the same spur binary`};let recordedCmd;try{let vars=row.varsJson?JSON.parse(row.varsJson):void 0;if(vars&&typeof vars==="object"&&typeof vars.verificationCmd==="string")recordedCmd=vars.verificationCmd}catch{recordedCmd=void 0}if(recordedCmd!==void 0&&recordedCmd!==latest.verificationCmd)return{ok:!1,reason:"run",detail:`run ${latest.runId} recorded effective command "${recordedCmd}", receipt records "${latest.verificationCmd}"`};if(options.runPort.hasArtifact&&!await options.runPort.hasArtifact(latest.runId,paths.runScoped))return{ok:!1,reason:"run",detail:`receipt ${basename(paths.runScoped)} is not registered as an artifact of run ${latest.runId}`}}let verifier=latest.verifier,current=options.currentVerifier,drifted=["name","layer","definitionDigest"].filter((k)=>verifier[k]!==current[k]);if(drifted.length>0)return{ok:!1,reason:"contract-mismatch",detail:`receipt recorded verifier ${verifier.name}@${verifier.layer} (${verifier.definitionDigest}), completion evaluates ${current.name}@${current.layer} (${current.definitionDigest}) — the selected definition changed after the pass (${drifted.join(", ")}); receipt sourcePath=${verifier.sourcePath}, current sourcePath=${current.sourcePath}${verifier.sourcePath!==current.sourcePath?" — a different spur install resolved a different definition; re-run the verification pass and the transition with the same spur binary":""}`};if(latest.verificationCmd!==options.currentVerificationCmd)return{ok:!1,reason:"contract-mismatch",detail:`receipt recorded with verifier "${latest.verificationCmd}", completion evaluates the configured command "${options.currentVerificationCmd}"`};if(latest.inputDigest!==options.currentDigest)return{ok:!1,reason:"stale",detail:`receipt digest ${latest.inputDigest} ≠ current inputs ${options.currentDigest} — tree, spec, learnings or check contract changed after the pass`};return{ok:!0,receipt:latest}}async function captureFeatureReceiptDigest(repoRoot,featureContent,learningsContent){return ProofInputFingerprint.compute({cwd:repoRoot,featureContent,learningsContent})}var SECRET_PATTERN=/(?:sk-[a-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*\S+|bearer\s+\S+)/gi;function redactAndBound(value,secrets,maxChars){let redacted=value.replace(SECRET_PATTERN,"[REDACTED]");for(let secret of secrets)if(secret!=="")redacted=redacted.split(secret).join("[REDACTED]");return redacted.length<=maxChars?redacted:`${redacted.slice(0,maxChars)}…`}class InvalidWorkflowRunIdError extends Error{code="invalid-run-id";constructor(runId){super(`Invalid workflow run id: ${JSON.stringify(runId)}`);this.name="InvalidWorkflowRunIdError"}}init_zod();var VERDICT_AGGREGATES=["PASS","PARTIAL","FAIL","UNKNOWN"],ROW_STATUSES=["MET","PARTIAL","UNMET","N/A"],CHECK_SEVERITIES=["blocker","major","minor","advisory"],verdictSchema=exports_external.string().transform((v,ctx)=>{let up=v.toUpperCase();if(!VERDICT_AGGREGATES.includes(up))return ctx.addIssue({code:"custom",message:`invalid verdict "${v}" (expected PASS|PARTIAL|FAIL|UNKNOWN)`}),"UNKNOWN";return up}),coverageRowSchema=exports_external.object({id:exports_external.string().optional(),scenario:exports_external.string().optional(),status:exports_external.string(),evidenceType:exports_external.string().optional(),evidence:exports_external.string().optional()}).superRefine((r,ctx)=>{if(r.id!==void 0&&r.scenario!==void 0&&r.id!==r.scenario)ctx.addIssue({code:"custom",message:`id/scenario conflict ("${r.id}" vs "${r.scenario}")`,path:["scenario"]});if(!ROW_STATUSES.includes(r.status.toUpperCase()))ctx.addIssue({code:"custom",message:`invalid row status "${r.status}"`,path:["status"]})}).transform((r)=>({id:r.id??r.scenario??"",status:r.status.toUpperCase(),evidenceType:r.evidenceType??"",evidence:r.evidence??""})),checkSchema=exports_external.object({name:exports_external.string().optional(),check:exports_external.string().optional(),id:exports_external.string().optional(),status:exports_external.string(),evidence:exports_external.string().optional().default(""),severity:exports_external.enum(CHECK_SEVERITIES).optional()}).superRefine((c3,ctx)=>{if(c3.name===void 0&&c3.check===void 0&&c3.id===void 0)ctx.addIssue({code:"custom",message:"check row needs one of name/check/id",path:["name"]})}).transform((c3)=>({name:c3.name??c3.check??c3.id??"",status:c3.status,evidence:c3.evidence,severity:c3.severity})),verifyVerdictSchema=exports_external.object({wbs:exports_external.string().optional().default(""),verdict:verdictSchema,requirements:exports_external.array(coverageRowSchema).optional().default([]),acceptanceCriteria:exports_external.array(coverageRowSchema).optional().default([]),checks:exports_external.array(checkSchema).optional().default([]),source:exports_external.string().optional(),confidence:exports_external.enum(["HIGH","MEDIUM","LOW"]).optional(),pipelineRunId:exports_external.string().optional(),recordedAt:exports_external.string().optional()});function parseVerifyVerdict(raw,fallbackWbs){let wbs=fallbackWbs??"";if(raw.trim()==="")return{kind:"missing",wbs};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{kind:"malformed",wbs,message:err.message}}if(parsed===null||typeof parsed!=="object"||Array.isArray(parsed))return{kind:"invalid",wbs,reason:"root must be a JSON object"};let result=verifyVerdictSchema.safeParse(parsed);if(!result.success){let issues=result.error.issues.map((i2)=>`${i2.path.join(".")}: ${i2.message}`);return{kind:"invalid",wbs,reason:issues.join("; "),issues}}let verdict={...result.data,wbs:result.data.wbs!==""?result.data.wbs:wbs};return{kind:"valid",wbs,verdict}}function runStoragePaths(cwd){let projectRoot=resolveRunStorageRoot(cwd);return{projectRoot,scratchDir:join4(projectRoot,".spur","run"),evidenceDir:join4(projectRoot,".spur","memory","evidence"),recordsDir:join4(projectRoot,".spur","memory","runs")}}function resolveRunStorageRoot(cwd){let start=resolve3(cwd),sharedTmp=resolve3(tmpdir2()),current=start;for(;;){if(current!==sharedTmp&&(existsSync2(join4(current,".spur"))||existsSync2(join4(current,"package.json"))))return current;let parent=resolve3(current,"..");if(parent===current)return start;current=parent}}var DURABLE_PLANE_EXCLUDE=".spur/memory/";function ensureDurablePlaneIgnored(workdir){try{let gitPath=join4(workdir,".git");if(!existsSync2(gitPath))return;let excludePath=join4(gitPath,"info","exclude");try{if(statSync3(gitPath).isFile()){let gitdir=readFileSync4(gitPath,"utf8").split(/\r?\n/).find((line)=>line.startsWith("gitdir:"))?.slice(7).trim();if(gitdir){let resolved=isAbsolute(gitdir)?gitdir:resolve3(workdir,gitdir),common4=/[/\\]worktrees[/\\][^/\\]+$/.test(resolved)?resolve3(resolved,"..",".."):resolved;excludePath=join4(common4,"info","exclude")}}}catch{}let current="";try{current=readFileSync4(excludePath,"utf8")}catch{current=""}if(current.includes(DURABLE_PLANE_EXCLUDE))return;mkdirSync2(dirname5(excludePath),{recursive:!0});let sep4=current===""||current.endsWith(`
|
|
1494
1527
|
`)?"":`
|
|
1495
1528
|
`;appendFileSync3(excludePath,`${sep4}# spur durable run-record plane (E71/1026): must stay proof-fingerprint-inert
|
|
1496
1529
|
${DURABLE_PLANE_EXCLUDE}
|