stable-harness 0.0.25 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tools.d.ts CHANGED
@@ -1,12 +1,22 @@
1
- export declare function tool(input: {
2
- name?: string;
1
+ type ToolHandler = (args: unknown, context?: unknown) => unknown | Promise<unknown>;
2
+ type ToolBase = {
3
+ name: string;
3
4
  description?: string;
4
5
  schema?: unknown;
5
- func?: (args: unknown, context?: unknown) => unknown | Promise<unknown>;
6
- invoke?: (args: unknown, context?: unknown) => unknown | Promise<unknown>;
7
- }): {
8
- name: string | undefined;
6
+ };
7
+ type ToolWithInvoke = {
8
+ invoke: ToolHandler;
9
+ func?: never;
10
+ };
11
+ type ToolWithFunc = {
12
+ func: ToolHandler;
13
+ invoke?: never;
14
+ };
15
+ type ToolInput = ToolBase & (ToolWithInvoke | ToolWithFunc);
16
+ export declare function tool(input: ToolInput): {
17
+ name: string;
9
18
  description: string | undefined;
10
19
  schema: unknown;
11
20
  invoke(args: unknown, context?: unknown): Promise<unknown>;
12
21
  };
22
+ export {};
package/dist/tools.js CHANGED
@@ -1 +1 @@
1
- export function tool(n){return{name:n.name,description:n.description,schema:n.schema,async invoke(o,e){if(n.invoke)return n.invoke(o,e);if(n.func)return n.func(o,e);throw new Error(`Tool ${n.name??"unknown"} has no function`)}}}
1
+ export function tool(n){!function assertRunnableTool(n){const o="function"==typeof n.invoke,e="function"==typeof n.func;if(o&&e)throw new Error(`Tool ${n.name} cannot define both "invoke" and "func". Use only one.`);if(!o&&!e)throw new Error(`Tool ${n.name??"unknown"} has no function`)}(n);const o=n.invoke??n.func;return{name:n.name,description:n.description,schema:n.schema,invoke:async(n,e)=>o(n,e)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "type": "module",
5
5
  "description": "Stable application runtime and operator control plane for agent workspaces.",
6
6
  "license": "Apache-2.0",
@@ -1 +1 @@
1
- import{controlBlockers as e,controlGaps as t,successfulEvidenceItems as n}from"./event-evidence.js";export function synthesizeEvidenceOnlyReport(s,r,c){if(!c.enabled||!c.synthesis.enabled||"evidence_only"!==c.synthesis.mode)return;if("pass"===r.verdict||!function hasRecoverableSynthesisIssue(e){return e.issues.some(e=>"control_blocker"!==e.code)}(r))return;const i=n(s.events).slice(-c.synthesis.maxEvidenceItems),o=e(s.events),u=t(s.events);if(0===i.length&&0===o.length&&0===u.length)return;const a=function detectSynthesisLanguage(e){const t=e.workspace.runtime.responseLanguage;if(isRecord(t)){const e=readString(t.language)??readString(t.locale)??readString(t.target);if(e&&/^(?:zh|zh-|chinese|中文|汉语|漢語)/iu.test(e))return"zh";if(e&&/^(?:en|en-|english)$/iu.test(e))return"en"}return/\p{Script=Han}/u.test(e.request.input)?"zh":"en"}(s);return"zh"===a?function buildChineseReport(e,t,n){const s=evidenceFacts(e);return["# 有依据的报告","","本报告只使用本次运行中已完成的工具或委托任务证据;未被证据支持的最终回答内容已被丢弃。","","## 证据摘要",...summaryLines(e,t,n,"zh"),"",...structuredFactSections(s,"zh"),"","## 证据缺口与阻塞",...gapLines(t,n,"zh"),"","## 使用的证据来源",...sourceLines(sourceSummary(e),"zh")].join("\n")}(i,o,u):function buildEnglishReport(e,t,n){const s=evidenceFacts(e);return["# Grounded report","","This report uses only completed tool or delegated-task evidence observed in this run. Unsupported final-answer claims were discarded.","","## Evidence summary",...summaryLines(e,t,n,"en"),"",...structuredFactSections(s,"en"),"","## Evidence gaps and blockers",...gapLines(t,n,"en"),"","## Sources used",...sourceLines(sourceSummary(e),"en")].join("\n")}(i,o,u)}function sourceSummary(e){const t=new Map;for(const n of e){const e=t.get(n.source)??{source:n.source,count:0,facts:[]};e.count+=1,e.facts.push(...factLines(n.output)),t.set(n.source,e)}return[...t.values()].map(t=>({...t,facts:t.facts.length>0?t.facts.slice(0,8):[fallbackEvidenceText(evidenceTextForSource(e,t.source))]}))}function evidenceFacts(e){return e.flatMap(e=>{const t=factLines(e.output);return(t.length>0?t:[fallbackEvidenceText(e.output)]).map(t=>({source:e.source,text:t,kind:classifyFact(t)}))}).slice(0,40)}function summaryLines(e,t,n,s){if(0===e.length)return["zh"===s?"- 未观察到成功的工具或委托任务证据。":"- No successful tool or delegated-task evidence was observed."];const r=new Set(e.map(e=>e.source)).size,c=0===t.length&&0===n.length?"zh"===s?"未观察到未解决的运行时证据缺口或阻塞。":"No unresolved runtime evidence gaps or blockers were observed.":"zh"===s?`仍有 ${t.length+n.length} 个运行时证据缺口或阻塞。`:`${t.length+n.length} runtime evidence gaps or blockers remain.`;return["zh"===s?`- 已使用 ${e.length} 条完成证据,来自 ${r} 个来源。`:`- Used ${e.length} completed evidence item(s) from ${r} source(s).`,`- ${c}`]}function structuredFactSections(e,t){return 0===e.length?["zh"===t?"- 证据缺口:没有可用于生成事实性结论的成功证据。":"- Evidence gap: no successful tool or delegated-task evidence was available."]:[{kind:"context",title:"zh"===t?"## 已确认背景":"## Confirmed context"},{kind:"data",title:"zh"===t?"## 观察到的数据":"## Observed data points"},{kind:"timeBound",title:"zh"===t?"## 近期或时间相关证据":"## Recent or time-bound evidence"},{kind:"limit",title:"zh"===t?"## 证据限制":"## Evidence limits"},{kind:"other",title:"zh"===t?"## 其他观察":"## Additional observations"}].flatMap(n=>{const s=e.filter(e=>e.kind===n.kind).slice(0,8);return s.length>0?[n.title,...s.map(e=>function factLine(e,t){const n=humanSourceLabel(e.source);return"zh"===t?`- ${e.text}(来源:${n})`:`- ${e.text} (source: ${n})`}(e,t)),""]:[]}).filter((e,t,n)=>""!==e||t<n.length-1)}function sourceLines(e,t){return 0===e.length?["zh"===t?"- 未使用成功证据来源。":"- No successful evidence source was used."]:e.map(e=>`- ${humanSourceLabel(e.source)}${e.count>1?` (${e.count})`:""}: ${e.source}`)}function gapLines(e,t,n){return 0===e.length&&0===t.length?["zh"===n?"- 未观察到未解决的运行时证据缺口或阻塞。":"- No unresolved runtime evidence gaps or blockers were observed."]:"zh"===n?[...e.map(e=>`- 阻塞:${e}`),...t.map(e=>`- 证据缺口:${e}`)]:[...e.map(e=>`- Blocked: ${e}`),...t.map(e=>`- Evidence gap: ${e}`)]}function formatEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1200?`${t.slice(0,1197)}...`:t}function factLines(e){const t=function factLinesFromJson(e){try{const t=JSON.parse(e);return isRecord(t)?Object.entries(t).filter(([e])=>!/^(?:status|controlStatus)$/iu.test(e)).slice(0,8).map(([e,t])=>`${e}: ${formatEvidence(function stringifyJsonValue(e){return"string"==typeof e?e:JSON.stringify(e)}(t))}`):[]}catch{return[]}}(e);return t.length>0?t:function splitPlainTextFacts(e){const t=function stripControlPreamble(e){return e.replace(/^(?:Status:\s*(?:completed|success|ok|recorded)\b\.?\s*)+/iu,"").replace(/^(?:Evidence tool:\s*[A-Za-z0-9_.-]+\b\.?\s*)+/iu,"").trim()}(e);return t.split(/\r?\n|;\s*/u).map(e=>e.trim()).map(stripControlFragments).filter(e=>e&&!function isControlFact(e){return/^Status:\s*(?:completed|success|ok|recorded)$/iu.test(e)||/^Evidence tool:\s*[A-Za-z0-9_.-]+$/iu.test(e)}(e))}(e).slice(0,8).map(formatEvidence)}function stripControlFragments(e){return e.replace(/\bStatus:\s*(?:completed|success|ok|recorded)\b\.?\s*/giu,"").replace(/\bEvidence tool:\s*[A-Za-z0-9_.-]+\b\.?\s*/giu,"").trim()}function evidenceTextForSource(e,t){return e.find(e=>e.source===t)?.output??""}function fallbackEvidenceText(e){return formatEvidence(e)}function classifyFact(e){return/(?:gap|blocked|missing|unavailable|unsupported|缺口|阻塞|缺失|不支持|无法|未提供)/iu.test(e)?"limit":/(?:news|headline|recent|latest|filing|event|公告|新闻|近期|最新|披露|\b20\d{2}[-/年])/iu.test(e)?"timeBound":/(?:[$€£¥%]|\b\d[\d,]*(?:\.\d+)?\b)/u.test(e)?"data":/(?:name|company|symbol|resolved|overview|query|名称|公司|代码|概览|识别)/iu.test(e)?"context":"other"}function humanSourceLabel(e){const t=e.replace(/([a-z])([A-Z])/gu,"$1 $2").split(/[_:.\-\s]+/u).map(e=>e.trim()).filter(Boolean);return 0===t.length?e:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}
1
+ import{controlBlockers as e,controlGaps as t,successfulEvidenceItems as n}from"./event-evidence.js";export function synthesizeEvidenceOnlyReport(r,s,i){if(!i.enabled||!i.synthesis.enabled||"evidence_only"!==i.synthesis.mode)return;if("pass"===s.verdict||!function hasRecoverableSynthesisIssue(e){return e.issues.some(e=>"control_blocker"!==e.code)}(s))return;const c=n(r.events).slice(-i.synthesis.maxEvidenceItems),o=e(r.events),l=t(r.events);if(0===c.length&&0===o.length&&0===l.length)return;const a=function detectSynthesisLanguage(e){const t=e.workspace.runtime.responseLanguage;if(isRecord(t)){const e=readString(t.language)??readString(t.locale)??readString(t.target);if(e&&/^(?:zh|zh-|chinese|中文|汉语|漢語)/iu.test(e))return"zh";if(e&&/^(?:en|en-|english)$/iu.test(e))return"en"}return/\p{Script=Han}/u.test(e.request.input)?"zh":"en"}(r);return"zh"===a?function buildChineseReport(e,t,n){const r=evidenceFacts(e);return["# 有依据的报告","","本报告只使用本次运行中已完成的工具或委托任务证据;未被证据支持的最终回答内容已被丢弃。","","## 证据摘要",...summaryLines(e,t,n,"zh"),"",...structuredFactSections(r,"zh"),"","## 证据缺口与阻塞",...gapLines(t,n,"zh"),"","## 使用的证据来源",...sourceLines(sourceSummary(e),"zh")].join("\n")}(c,o,l):function buildEnglishReport(e,t,n){const r=evidenceFacts(e);return["# Grounded report","","This report uses only completed tool or delegated-task evidence observed in this run. Unsupported final-answer claims were discarded.","","## Evidence summary",...summaryLines(e,t,n,"en"),"",...structuredFactSections(r,"en"),"","## Evidence gaps and blockers",...gapLines(t,n,"en"),"","## Sources used",...sourceLines(sourceSummary(e),"en")].join("\n")}(c,o,l)}function sourceSummary(e){const t=new Map;for(const n of e){const e=t.get(n.source)??{source:n.source,count:0,facts:[]};e.count+=1,e.facts.push(...factLines(n.output)),t.set(n.source,e)}return[...t.values()].map(t=>({...t,facts:t.facts.length>0?t.facts.slice(0,8):[fallbackEvidenceText(evidenceTextForSource(e,t.source))]}))}function evidenceFacts(e){return e.flatMap(e=>{const t=factLines(e.output);return(t.length>0?t:[fallbackEvidenceText(e.output)]).map(t=>({source:e.source,text:t,kind:classifyFact(t)}))}).slice(0,40)}function summaryLines(e,t,n,r){if(0===e.length)return["zh"===r?"- 未观察到成功的工具或委托任务证据。":"- No successful tool or delegated-task evidence was observed."];const s=new Set(e.map(e=>e.source)).size,i=0===t.length&&0===n.length?"zh"===r?"未观察到未解决的运行时证据缺口或阻塞。":"No unresolved runtime evidence gaps or blockers were observed.":"zh"===r?`仍有 ${t.length+n.length} 个运行时证据缺口或阻塞。`:`${t.length+n.length} runtime evidence gaps or blockers remain.`;return["zh"===r?`- 已使用 ${e.length} 条完成证据,来自 ${s} 个来源。`:`- Used ${e.length} completed evidence item(s) from ${s} source(s).`,`- ${i}`]}function structuredFactSections(e,t){if(0===e.length)return["zh"===t?"- 证据缺口:没有可用于生成事实性结论的成功证据。":"- Evidence gap: no successful tool or delegated-task evidence was available."];const n=function evidenceFields(e){const t=new Set,n=[];for(const r of e)for(const e of parseEvidenceFields(r)){const r=`${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`;t.has(r)||(t.add(r),n.push(e))}return n}(e);return[{kind:"context",title:"zh"===t?"## 已确认背景":"## Confirmed context"},{kind:"data",title:"zh"===t?"## 观察到的数据":"## Observed data points"},{kind:"timeBound",title:"zh"===t?"## 近期或时间相关证据":"## Recent or time-bound evidence"},{kind:"limit",title:"zh"===t?"## 证据限制":"## Evidence limits"},{kind:"other",title:"zh"===t?"## 其他观察":"## Additional observations"}].flatMap(r=>{const s=n.filter(e=>e.kind===r.kind).slice(0,12),i=e.filter(e=>e.kind===r.kind&&!function hasExtractableFields(e){return extractKeyValueFields(e).some(e=>!isBoilerplateField(e.label)&&e.value.length>0)}(e.text)).slice(0,5);return 0===s.length&&0===i.length?[]:[r.title,...fieldTableLines(s,t),...i.map(e=>function factLine(e,t){const n=humanSourceLabel(e.source);return"zh"===t?`- ${e.text}(来源:${n})`:`- ${e.text} (source: ${n})`}(e,t)),""]}).filter((e,t,n)=>""!==e||t<n.length-1)}function parseEvidenceFields(e){return extractKeyValueFields(e.text).filter(e=>e.value.length>0&&!isBoilerplateField(e.label)).map(t=>{return{source:e.source,label:(n=t.label,/\p{Script=Han}/u.test(n)?n:normalizeFieldLabel(n).split(" ").filter(Boolean).map(e=>/^[A-Z0-9]+$/u.test(e)?e:e.charAt(0).toUpperCase()+e.slice(1)).join(" ")),value:formatEvidence(t.value),kind:"other"===classifyFact(`${t.label}: ${t.value}`)?e.kind:classifyFact(`${t.label}: ${t.value}`)};var n})}function fieldTableLines(e,t){return 0===e.length?[]:[..."zh"===t?["| 项目 | 数值 | 来源 |","|---|---:|---|"]:["| Field | Value | Source |","|---|---:|---|"],...e.map(e=>`| ${escapeTableCell(e.label)} | ${escapeTableCell(e.value)} | ${escapeTableCell(humanSourceLabel(e.source))} |`)]}function sourceLines(e,t){return 0===e.length?["zh"===t?"- 未使用成功证据来源。":"- No successful evidence source was used."]:e.map(e=>`- ${humanSourceLabel(e.source)}${e.count>1?` (${e.count})`:""}: ${e.source}`)}function gapLines(e,t,n){return 0===e.length&&0===t.length?["zh"===n?"- 未观察到未解决的运行时证据缺口或阻塞。":"- No unresolved runtime evidence gaps or blockers were observed."]:"zh"===n?[...e.map(e=>`- 阻塞:${e}`),...t.map(e=>`- 证据缺口:${e}`)]:[...e.map(e=>`- Blocked: ${e}`),...t.map(e=>`- Evidence gap: ${e}`)]}function formatEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1200?`${t.slice(0,1197)}...`:t}function factLines(e){const t=function factLinesFromJson(e){try{const t=JSON.parse(e);return isRecord(t)?Object.entries(t).filter(([e])=>!/^(?:status|controlStatus)$/iu.test(e)).slice(0,8).map(([e,t])=>`${e}: ${formatEvidence(function stringifyJsonValue(e){return"string"==typeof e?e:JSON.stringify(e)}(t))}`):[]}catch{return[]}}(e);return t.length>0?t:function splitPlainTextFacts(e){const t=function stripControlPreamble(e){return e.replace(/^(?:Status:\s*(?:completed|success|ok|recorded)\b\.?\s*)+/iu,"").replace(/^(?:Evidence tool:\s*[A-Za-z0-9_.-]+\b\.?\s*)+/iu,"").trim()}(e);return t.split(/\r?\n|;\s*/u).map(e=>e.trim()).map(stripControlFragments).filter(e=>e&&!function isControlFact(e){return/^Status:\s*(?:completed|success|ok|recorded)$/iu.test(e)||/^Evidence tool:\s*[A-Za-z0-9_.-]+$/iu.test(e)}(e))}(e).slice(0,8).map(formatEvidence)}function extractKeyValueFields(e){const t=[...e.matchAll(/(^|[\s,;|])([\p{L}][\p{L}\p{N} _./()%&+\-]{0,48})[::]\s*/gu)].filter(e=>void 0!==e.index);return t.map((n,r)=>{const s=(n.index??0)+n[0].length,i=t[r+1]?.index??e.length,c=t[r-1]?.[2]??"";return{label:cleanFieldLabel(n[2]??"",c),value:(o=e.slice(s,i),o.replace(/^[\s,;|.-]+/u,"").replace(/[\s,;|.-]+$/u,"").replace(/\s+/gu," ").trim())};var o}).filter(e=>e.label.length>0)}function cleanFieldLabel(e,t=""){const n=e.replace(/^(?:[-*]\s*)+/u,"").replace(/\s+/gu," ").trim(),r=n.split(" ").filter(Boolean);return r.length>1&&isBoilerplateField(t)||r.length>1&&/^[A-Z]$/u.test(r[0]??"")?r.slice(1).join(" "):n}function isBoilerplateField(e){return/^(?:status|control status|evidence tool|tool|source|来源)$/iu.test(e.trim())}function normalizeFieldLabel(e){return e.toLowerCase().replace(/[^a-z0-9\p{L}\p{N}]+/giu," ").trim()}function escapeTableCell(e){return e.replace(/\|/gu,"\\|").replace(/\r?\n/gu," ")}function stripControlFragments(e){return e.replace(/\bStatus:\s*(?:completed|success|ok|recorded)\b\.?\s*/giu,"").replace(/\bEvidence tool:\s*[A-Za-z0-9_.-]+\b\.?\s*/giu,"").trim()}function evidenceTextForSource(e,t){return e.find(e=>e.source===t)?.output??""}function fallbackEvidenceText(e){return formatEvidence(e)}function classifyFact(e){return/(?:gap|blocked|missing|unavailable|unsupported|缺口|阻塞|缺失|不支持|无法|未提供)/iu.test(e)?"limit":/(?:news|headline|recent|latest|filing|event|公告|新闻|近期|最新|披露|\b20\d{2}[-/年])/iu.test(e)?"timeBound":/(?:[$€£¥%]|\b\d[\d,]*(?:\.\d+)?\b)/u.test(e)?"data":/(?:name|company|symbol|resolved|overview|query|名称|公司|代码|概览|识别)/iu.test(e)?"context":"other"}function humanSourceLabel(e){const t=e.replace(/([a-z])([A-Z])/gu,"$1 $2").split(/[_:.\-\s]+/u).map(e=>e.trim()).filter(Boolean);return 0===t.length?e:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}