stable-harness 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/docs/architecture/runtime-events.md +5 -0
  2. package/docs/compatibility-matrix.md +11 -0
  3. package/docs/protocols/http-runtime.md +8 -0
  4. package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.js +1 -1
  5. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
  6. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
  7. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
  8. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
  9. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +2 -13
  10. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
  11. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +1 -23
  12. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -1
  13. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +1 -1
  14. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
  15. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -16
  16. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
  17. package/node_modules/@stable-harness/core/dist/index.d.ts +2 -0
  18. package/node_modules/@stable-harness/core/dist/index.js +1 -1
  19. package/node_modules/@stable-harness/core/dist/quality/profile.js +1 -1
  20. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.d.ts +3 -2
  21. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.js +1 -1
  22. package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.js +1 -1
  23. package/node_modules/@stable-harness/core/dist/quality/synthesis.js +1 -1
  24. package/node_modules/@stable-harness/core/dist/quality/types.d.ts +2 -0
  25. package/node_modules/@stable-harness/core/dist/runtime/capabilities.d.ts +1 -0
  26. package/node_modules/@stable-harness/core/dist/runtime/capabilities.js +1 -1
  27. package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +6 -2
  28. package/node_modules/@stable-harness/core/dist/runtime/policy/projection.d.ts +11 -0
  29. package/node_modules/@stable-harness/core/dist/runtime/policy/projection.js +1 -0
  30. package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
  31. package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.js +1 -0
  32. package/node_modules/@stable-harness/core/dist/runtime/progress-narration.js +1 -1
  33. package/node_modules/@stable-harness/core/dist/runtime.js +1 -1
  34. package/node_modules/@stable-harness/core/dist/trace.d.ts +32 -0
  35. package/node_modules/@stable-harness/core/dist/trace.js +1 -1
  36. package/node_modules/@stable-harness/core/dist/types.d.ts +1 -0
  37. package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -1
  38. package/package.json +2 -2
  39. package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
  40. package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
  41. package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
  42. package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
  43. package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
  44. package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +2 -13
  45. package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
  46. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +1 -23
  47. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -1
  48. package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +1 -1
  49. package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
  50. package/packages/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -16
  51. package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
  52. package/packages/core/dist/index.d.ts +2 -0
  53. package/packages/core/dist/index.js +1 -1
  54. package/packages/core/dist/quality/profile.js +1 -1
  55. package/packages/core/dist/quality/synthesis/fields.d.ts +3 -2
  56. package/packages/core/dist/quality/synthesis/fields.js +1 -1
  57. package/packages/core/dist/quality/synthesis/observed.js +1 -1
  58. package/packages/core/dist/quality/synthesis.js +1 -1
  59. package/packages/core/dist/quality/types.d.ts +2 -0
  60. package/packages/core/dist/runtime/capabilities.d.ts +1 -0
  61. package/packages/core/dist/runtime/capabilities.js +1 -1
  62. package/packages/core/dist/runtime/events.d.ts +6 -2
  63. package/packages/core/dist/runtime/policy/projection.d.ts +11 -0
  64. package/packages/core/dist/runtime/policy/projection.js +1 -0
  65. package/packages/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
  66. package/packages/core/dist/runtime/policy/tool-invocation.js +1 -0
  67. package/packages/core/dist/runtime/progress-narration.js +1 -1
  68. package/packages/core/dist/runtime.js +1 -1
  69. package/packages/core/dist/trace.d.ts +32 -0
  70. package/packages/core/dist/trace.js +1 -1
  71. package/packages/core/dist/types.d.ts +1 -0
  72. package/packages/protocols/dist/src/http-server.js +1 -1
@@ -1,16 +1 @@
1
- export declare function traceProjectionForBuiltinTool(toolId: string, phase: "agent.tool.start" | "agent.tool.result", args: unknown): {
2
- traceType: string;
3
- traceLabel: string;
4
- subagentType: string | undefined;
5
- todos?: undefined;
6
- } | {
7
- traceType: string;
8
- traceLabel: string;
9
- todos: any[];
10
- subagentType?: undefined;
11
- } | {
12
- traceType?: undefined;
13
- traceLabel?: undefined;
14
- subagentType?: undefined;
15
- todos?: undefined;
16
- };
1
+ export declare function traceProjectionForBuiltinTool(toolId: string, phase: "agent.tool.start" | "agent.tool.result", args: unknown): {};
@@ -1 +1 @@
1
- export function traceProjectionForBuiltinTool(t,e,r){return"task"===t?{traceType:"delegation",traceLabel:"agent.tool.start"===e?"delegation.start":"delegation.completed",subagentType:readTaskSubagentType(r)}:"write_todos"===t&&"agent.tool.result"===e?{traceType:"plan",traceLabel:"plan.updated",todos:readTodoArgs(r)}:{}}function readTaskSubagentType(t){const e=isRecord(t)?t:{};return readString(e.subagent_type)??readString(e.subagentType)}function readTodoArgs(t){const e=isRecord(t)?t:{};return Array.isArray(e.todos)?e.todos:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
1
+ import{createDelegationTraceProjection as t,createPlanTraceProjection as e}from"@stable-harness/core";export function traceProjectionForBuiltinTool(r,o,n){return"task"===r?t("agent.tool.start"===o?"delegation.start":"delegation.completed",{subagentType:readTaskSubagentType(n)}):"write_todos"===r&&"agent.tool.result"===o?e("plan.updated",{todos:readTodoArgs(n)}):{}}function readTaskSubagentType(t){const e=isRecord(t)?t:{};return readString(e.subagent_type)??readString(e.subagentType)}function readTodoArgs(t){const e=isRecord(t)?t:{};return Array.isArray(e.todos)?e.todos:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
@@ -7,9 +7,11 @@ export * from "./runtime/persistence/inspection.js";
7
7
  export { createWorkspaceSandboxPolicy } from "./runtime/governance/sandbox.js";
8
8
  export * from "./memory-plugins.js";
9
9
  export * from "./runtime/persistence/queue.js";
10
+ export * from "./runtime/policy/projection.js";
10
11
  export * from "./runtime.js";
11
12
  export * from "./runtime/selection-repair.js";
12
13
  export * from "./runtime/tool-failure.js";
14
+ export * from "./runtime/policy/tool-invocation.js";
13
15
  export * from "./runtime/persistence/stores.js";
14
16
  export * from "./trace.js";
15
17
  export * from "./types.js";
@@ -1 +1 @@
1
- export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export*from"./runtime/persistence/queue.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/persistence/stores.js";export*from"./trace.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
1
+ export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export*from"./runtime/persistence/queue.js";export*from"./runtime/policy/projection.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/policy/tool-invocation.js";export*from"./runtime/persistence/stores.js";export*from"./trace.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
@@ -1 +1 @@
1
- export function resolveQualityPolicy(e,n){const r=n.config.quality??e.quality,i=function readProfile(e){const n="string"==typeof e?e:isRecord(e)?e.profile:void 0;return"fast"===n||"balanced"===n||"strict"===n?n:"off"}(r),o=function profileDefaults(e,n){const r=n.tools.length>0||n.subagents.length>0||(n.skills?.length??0)>0;return"off"===e?function disabledPolicy(e){return{enabled:!1,profile:e,reviewer:{mode:"deterministic"},planningReview:{enabled:!1,requirePlan:!1},executionReview:{enabled:!1,requireToolEvidence:!1,rejectEmptyFinal:!1,stopOnBlocker:!1,rejectUngroundedNumbers:!1},synthesis:{enabled:!1,mode:"evidence_only",maxEvidenceItems:5},recovery:{enabled:!1,maxLoops:0}}}(e):{enabled:!0,profile:e,planningReview:{enabled:"fast"!==e,requirePlan:"fast"!==e&&r},executionReview:{enabled:!0,requireToolEvidence:"strict"===e&&r,rejectEmptyFinal:!0,stopOnBlocker:!0,rejectUngroundedNumbers:"strict"===e},synthesis:{enabled:!1,mode:"evidence_only",maxEvidenceItems:5},recovery:{enabled:"fast"!==e,maxLoops:"strict"===e?3:2}}}(i,n),t=isRecord(r)?r:{},a=function readReviewer(e){const n=isRecord(e.reviewer)?e.reviewer:e,r="llm"===n.mode||"string"==typeof n.modelRef?"llm":"deterministic",i=isRecord(n.prompts)?n.prompts:{},o=readString(n.modelRef);return{mode:r,...o?{modelRef:o}:{},...readString(n.planningPrompt)??readString(i.planning)?{planningPrompt:readString(n.planningPrompt)??readString(i.planning)}:{},...readString(n.executionPrompt)??readString(i.execution)?{executionPrompt:readString(n.executionPrompt)??readString(i.execution)}:{}}}(t);return{enabled:o.enabled,profile:i,...a?{reviewer:a}:{},planningReview:{enabled:readBoolean(t.planningReview,"enabled")??o.planningReview.enabled,requirePlan:readBoolean(t.planningReview,"requirePlan")??o.planningReview.requirePlan},executionReview:{enabled:readBoolean(t.executionReview,"enabled")??o.executionReview.enabled,requireToolEvidence:readBoolean(t.executionReview,"requireToolEvidence")??o.executionReview.requireToolEvidence,rejectEmptyFinal:readBoolean(t.executionReview,"rejectEmptyFinal")??o.executionReview.rejectEmptyFinal,stopOnBlocker:readBoolean(t.executionReview,"stopOnBlocker")??o.executionReview.stopOnBlocker,rejectUngroundedNumbers:readBoolean(t.executionReview,"rejectUngroundedNumbers")??o.executionReview.rejectUngroundedNumbers},synthesis:{enabled:readBoolean(t.synthesis,"enabled")??o.synthesis.enabled,mode:(d=t.synthesis,("evidence_only"===(isRecord(d)?d:{}).mode?"evidence_only":void 0)??o.synthesis.mode),maxEvidenceItems:readPositiveInteger(t.synthesis,"maxEvidenceItems")??o.synthesis.maxEvidenceItems},recovery:{enabled:readBoolean(t.recovery,"enabled")??o.recovery.enabled,maxLoops:readPositiveInteger(t.recovery,"maxLoops")??o.recovery.maxLoops}};var d}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function readBoolean(e,n){const r=isRecord(e)?e:{};return"boolean"==typeof r[n]?r[n]:void 0}function readPositiveInteger(e,n){const r=(isRecord(e)?e:{})[n];return"number"==typeof r&&Number.isInteger(r)&&r>0?r:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
1
+ export function resolveQualityPolicy(e,n){const r=n.config.quality??e.quality,i=function readProfile(e){const n="string"==typeof e?e:isRecord(e)?e.profile:void 0;return"fast"===n||"balanced"===n||"strict"===n?n:"off"}(r),t=function profileDefaults(e,n){const r=n.tools.length>0||n.subagents.length>0||(n.skills?.length??0)>0;return"off"===e?function disabledPolicy(e){return{enabled:!1,profile:e,reviewer:{mode:"deterministic"},planningReview:{enabled:!1,requirePlan:!1},executionReview:{enabled:!1,requireToolEvidence:!1,rejectEmptyFinal:!1,stopOnBlocker:!1,rejectUngroundedNumbers:!1},synthesis:{enabled:!1,mode:"evidence_only",maxEvidenceItems:5},recovery:{enabled:!1,maxLoops:0}}}(e):{enabled:!0,profile:e,planningReview:{enabled:"fast"!==e,requirePlan:"fast"!==e&&r},executionReview:{enabled:!0,requireToolEvidence:"strict"===e&&r,rejectEmptyFinal:!0,stopOnBlocker:!0,rejectUngroundedNumbers:"strict"===e},synthesis:{enabled:!1,mode:"evidence_only",maxEvidenceItems:5},recovery:{enabled:"fast"!==e,maxLoops:"strict"===e?3:2}}}(i,n),o=isRecord(r)?r:{},a=function readReviewer(e){const n=isRecord(e.reviewer)?e.reviewer:e,r="llm"===n.mode||"string"==typeof n.modelRef?"llm":"deterministic",i=isRecord(n.prompts)?n.prompts:{},t=readString(n.modelRef);return{mode:r,...t?{modelRef:t}:{},...readString(n.planningPrompt)??readString(i.planning)?{planningPrompt:readString(n.planningPrompt)??readString(i.planning)}:{},...readString(n.executionPrompt)??readString(i.execution)?{executionPrompt:readString(n.executionPrompt)??readString(i.execution)}:{}}}(o);return{enabled:t.enabled,profile:i,...a?{reviewer:a}:{},planningReview:{enabled:readBoolean(o.planningReview,"enabled")??t.planningReview.enabled,requirePlan:readBoolean(o.planningReview,"requirePlan")??t.planningReview.requirePlan},executionReview:{enabled:readBoolean(o.executionReview,"enabled")??t.executionReview.enabled,requireToolEvidence:readBoolean(o.executionReview,"requireToolEvidence")??t.executionReview.requireToolEvidence,rejectEmptyFinal:readBoolean(o.executionReview,"rejectEmptyFinal")??t.executionReview.rejectEmptyFinal,stopOnBlocker:readBoolean(o.executionReview,"stopOnBlocker")??t.executionReview.stopOnBlocker,rejectUngroundedNumbers:readBoolean(o.executionReview,"rejectUngroundedNumbers")??t.executionReview.rejectUngroundedNumbers},synthesis:{enabled:readBoolean(o.synthesis,"enabled")??t.synthesis.enabled,mode:(d=o.synthesis,("evidence_only"===(isRecord(d)?d:{}).mode?"evidence_only":void 0)??t.synthesis.mode),maxEvidenceItems:readPositiveInteger(o.synthesis,"maxEvidenceItems")??t.synthesis.maxEvidenceItems,...readFieldKinds(o.synthesis)?{fieldKinds:readFieldKinds(o.synthesis)}:{}},recovery:{enabled:readBoolean(o.recovery,"enabled")??t.recovery.enabled,maxLoops:readPositiveInteger(o.recovery,"maxLoops")??t.recovery.maxLoops}};var d}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function readBoolean(e,n){const r=isRecord(e)?e:{};return"boolean"==typeof r[n]?r[n]:void 0}function readPositiveInteger(e,n){const r=(isRecord(e)?e:{})[n];return"number"==typeof r&&Number.isInteger(r)&&r>0?r:void 0}function readFieldKinds(e){const n=isRecord(e)?e:{},r=isRecord(n.fieldKinds)?n.fieldKinds:void 0;if(r)return{...readStringArray(r.context).length>0?{context:readStringArray(r.context)}:{},...readStringArray(r.data).length>0?{data:readStringArray(r.data)}:{},...readStringArray(r.timeBound).length>0?{timeBound:readStringArray(r.timeBound)}:{},...readStringArray(r.limit).length>0?{limit:readStringArray(r.limit)}:{},...readStringArray(r.other).length>0?{other:readStringArray(r.other)}:{}}}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -11,9 +11,10 @@ export type EvidenceField = {
11
11
  value: string;
12
12
  kind: FactKind;
13
13
  };
14
- export declare function evidenceFields(facts: EvidenceFact[]): EvidenceField[];
14
+ export type EvidenceClassificationHints = Partial<Record<FactKind, string[]>>;
15
+ export declare function evidenceFields(facts: EvidenceFact[], hints?: EvidenceClassificationHints): EvidenceField[];
15
16
  export declare function selectSectionFields(fields: EvidenceField[], kind: FactKind, limit: number): EvidenceField[];
16
17
  export declare function fieldTableLines(fields: EvidenceField[], language: SynthesisLanguage): string[];
17
18
  export declare function hasExtractableFields(text: string): boolean;
18
- export declare function classifyFact(text: string): FactKind;
19
+ export declare function classifyFact(text: string, hints?: EvidenceClassificationHints): FactKind;
19
20
  export declare function normalizeFieldLabel(label: string): string;
@@ -1 +1 @@
1
- export function evidenceFields(e){const t=new Set,a=[];for(const l of e)for(const e of parseEvidenceFields(l)){const l=`${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`;t.has(l)||(t.add(l),a.push(e))}return a}export function selectSectionFields(e,t,a){return function withSourceCoverage(e,t){const a=[...e].sort((e,t)=>scoreField(t)-scoreField(e)),l=new Map;for(const e of[...new Set(a.map(e=>e.source))]){const t=a.find(t=>t.source===e);t&&l.set(fieldKey(t),t)}for(const e of a)if(l.set(fieldKey(e),e),l.size>=t)break;return[...l.values()].slice(0,t)}(e.filter(e=>e.kind===t),a).sort((e,t)=>scoreField(t)-scoreField(e)||e.label.localeCompare(t.label))}export function fieldTableLines(e,t){return 0===e.length?[]:[..."zh"===t?["| 项目 | 数值 | 来源 |","|---|---:|---|"]:["| Field | Value | Source |","|---|---:|---|"],...e.map(e=>`| ${escapeTableCell(e.label)} | ${escapeTableCell(e.value)} | ${escapeTableCell(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(" ")}(e.source))} |`)]}export function hasExtractableFields(e){return extractKeyValueFields(e).some(e=>!isBoilerplateField(e.label)&&e.value.length>0)}export 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 parseEvidenceFields(e){return extractKeyValueFields(e.text).filter(e=>e.value.length>0&&!isBoilerplateField(e.label)).filter(e=>!function isLowValueField(e,t){return!!/(?:snapshot for|source type|loaded sources)/iu.test(e)||!!/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||scoreField({source:"",label:e,value:t,kind:"other"})<0}(e.label,e.value)).map(t=>{const a=classifyFact(`${t.label}: ${t.value}`);return{source:e.source,label:titleCaseLabel(t.label),value:formatEvidence(t.value),kind:"other"===a?e.kind:a}})}function scoreField(e){const t=normalizeFieldLabel(e.label);let a=e.value.length>0?10:0;return/(?:price|value|amount|total|ratio|rate|range|target|estimate|revenue|income|earnings|margin|volume|date|rating|status|count|metric|价格|收入|利润|目标|评级|数量|日期|范围|比率)/iu.test(t)&&(a+=8),/(?:pe ratio|p b|market cap|book value|52 week range|day range|target estimate|revenue|net income|operating income|diluted eps)/iu.test(t)&&(a+=12),/(?:name|company|symbol|title|headline|summary|名称|公司|代码|标题|摘要)/iu.test(t)&&(a+=6),/(?:unix|epoch|timestamp|raw|html|url|href|source|id|identifier|internal|debug)/iu.test(t)&&(a-=20),/^(?:date|time|cik)$/iu.test(t)&&(a-=12),/^(?:open|high|low)$/iu.test(t)&&(a-=4),(/^https?:\/\//iu.test(e.value)||"/"===e.value)&&(a-=12),e.value.length>240&&(a-=5),a}function extractKeyValueFields(e){const t=[...e.matchAll(/(^|[\s;|])([\p{L}\p{N}][\p{L}\p{N} _./()%&+\-]{0,48})[::](?!\/\/)\s*/gu)].filter(e=>void 0!==e.index).map((e,t,a)=>{a[t-1];const l=function cleanFieldLabel(e){const t=e.replace(/^(?:[-*]\s*)+/u,"").replace(/\s+/gu," ").trim(),a=t.match(/^.+\b(PE Ratio TTM)$/iu);if(a?.[1]&&a[1]!==t&&/(?:beta|\b20\d{2}|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b)/iu.test(t))return a[1];const l=t.split(" ").filter(Boolean);return l.length>1&&/^\d{4}$/u.test(l[0]??"")||l.length>1&&/^\d+(?:\.\d+)?$/u.test(l[0]??"")&&/^(?:\d+|beta|pe|p\/b)$/iu.test(l[1]??"")||l.length>1&&/^[A-Z]$/u.test(l[0]??"")||l.length>1&&/^(?:inc\.?|llc\.?|ltd\.?|corp\.?|corporation|co\.?)$/iu.test(l[0]??"")||l.length>1&&/^(?:usd|eur|gbp|jpy|cny|cad|aud)$/iu.test(l[0]??"")||l.length>1&&/^(?:gmt|utc)$/iu.test(l[0]??"")?l.slice(1).join(" "):function trailingKnownLabel(e){if(/\bPE Ratio TTM$/iu.test(e)&&!/^PE Ratio TTM$/iu.test(e))return"PE Ratio TTM";const t=e.match(/\b(?:Revenue|Net Income|Operating Income|Diluted EPS|EPS|Market Cap|Book Value|Target Estimate|Target Mean Price|Target Median Price|Target High Price|Target Low Price|PE Ratio TTM|P\/B|Beta(?: 5Y Monthly)?|Published|Updated|Date|Time|Summary|Title|Headline)$/iu);return t&&/(?:filed|\b20\d{2}|10-k|10-q|\bfy\b|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b|\s{3,}|[a-z].{8,}\s)/iu.test(e.slice(0,t.index))?t?.[0]??e:e}(t)}(e[2]??""),i=function droppedLabelPrefix(e,t){const a=e.trim();if(a===t)return"";const l=a.toLowerCase().lastIndexOf(t.toLowerCase());return l>0?a.slice(0,l):""}(e[2]??"",l);return{index:(e.index??0)+String(e[1]??"").length+i.length,start:(e.index??0)+e[0].length,label:l,rawLabel:e[2]??""}}).filter(e=>!isBoundaryNoiseLabel(e.label)&&!isBoundaryNoiseLabel(e.rawLabel));return t.map((a,l)=>{const i=t[l+1]?.index??e.length;return{label:a.label,value:cleanFieldValue(e.slice(a.start,i),a.label)}}).filter(e=>e.label.length>0)}function cleanFieldValue(e,t){const a=e.replace(/^[\s,;|.-]+/u,"").replace(/[\s,;|.-]+$/u,"").replace(/\s+/gu," ").trim(),l=normalizeFieldLabel(t);if(/\brange\b/iu.test(l))return a.replace(/\s+Beta\b.*$/iu,"").trim();if(/^(?:ticker|symbol|resolved symbol|resolved ticker|股票 resolved ticker|代码)$/iu.test(l)){const e=a.match(/^([A-Z0-9._-]{1,24})(?:\s+\d+[.)]\s+|$)/u);if(e?.[1])return e[1]}return a}function isBoilerplateField(e){return/^(?:status|control status|evidence tool|tool|source|来源)$/iu.test(e.trim())}function isBoundaryNoiseLabel(e){return/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||/^(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,4}(?:\s+\d{1,2})?$/iu.test(e)||/^\d{4}\s+\d{1,2}$/u.test(e)}export function normalizeFieldLabel(e){return e.toLowerCase().replace(/[^a-z0-9\p{L}\p{N}]+/giu," ").trim()}function titleCaseLabel(e){if(/\p{Script=Han}/u.test(e))return e;const t=e.split(/[^A-Za-z0-9]+/u).filter(Boolean);return normalizeFieldLabel(e).split(" ").filter(Boolean).map((e,a)=>{const l=t[a]??e;return/^[A-Z0-9]{2,}$/u.test(l)?l:e.charAt(0).toUpperCase()+e.slice(1)}).join(" ")}function formatEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1200?`${t.slice(0,1197)}...`:t}function escapeTableCell(e){return e.replace(/\|/gu,"\\|").replace(/\r?\n/gu," ")}function fieldKey(e){return`${e.source}\0${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`}
1
+ export function evidenceFields(e,t={}){const l=new Set,i=[];for(const n of e)for(const e of parseEvidenceFields(n,t)){const t=`${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`;l.has(t)||(l.add(t),i.push(e))}return i}export function selectSectionFields(e,t,l){return function withSourceCoverage(e,t){const l=[...e].sort((e,t)=>scoreField(t)-scoreField(e)),i=new Map;for(const e of[...new Set(l.map(e=>e.source))]){const t=l.find(t=>t.source===e);t&&i.set(fieldKey(t),t)}for(const e of l)if(i.set(fieldKey(e),e),i.size>=t)break;return[...i.values()].slice(0,t)}(e.filter(e=>e.kind===t),l).sort((e,t)=>scoreField(t)-scoreField(e)||e.label.localeCompare(t.label))}export function fieldTableLines(e,t){return 0===e.length?[]:[..."zh"===t?["| 项目 | 数值 | 来源 |","|---|---:|---|"]:["| Field | Value | Source |","|---|---:|---|"],...e.map(e=>`| ${escapeTableCell(e.label)} | ${escapeTableCell(e.value)} | ${escapeTableCell(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(" ")}(e.source))} |`)]}export function hasExtractableFields(e){return extractKeyValueFields(e).some(e=>!isBoilerplateField(e.label)&&e.value.length>0)}export function classifyFact(e,t={}){const l=function classifyByHints(e,t){const l=normalizeFieldLabel(e);for(const e of["limit","timeBound","data","context","other"])if((t[e]??[]).some(e=>l.includes(normalizeFieldLabel(e))))return e}(e,t);return l||(/(?:gap|blocked|missing|unavailable|unsupported|缺口|阻塞|缺失|不支持|无法|未提供)/iu.test(e)?"limit":/(?:date|time|published|updated|timestamp|deadline|日期|时间|发布|更新|\b20\d{2}[-/年])/iu.test(e)?"timeBound":/(?:[$€£¥%]|\b\d[\d,]*(?:\.\d+)?\b)/u.test(e)?"data":/(?:name|title|identifier|entity|subject|query|名称|标题|标识|识别)/iu.test(e)?"context":"other")}function parseEvidenceFields(e,t){return extractKeyValueFields(e.text,t).filter(e=>e.value.length>0&&!isBoilerplateField(e.label)).filter(e=>!function isLowValueField(e,t){return!!/(?:snapshot for|source type|loaded sources)/iu.test(e)||!!/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||scoreField({source:"",label:e,value:t,kind:"other"})<0}(e.label,e.value)).map(l=>{const i=classifyFact(`${l.label}: ${l.value}`,t);return{source:e.source,label:titleCaseLabel(l.label),value:formatEvidence(l.value),kind:"other"===i?e.kind:i}})}function scoreField(e){const t=normalizeFieldLabel(e.label);let l=e.value.length>0?10:0;return/(?:value|amount|total|ratio|rate|range|estimate|date|status|count|metric|数量|日期|范围|比率)/iu.test(t)&&(l+=8),/(?:name|title|summary|identifier|entity|subject|名称|标题|摘要|标识)/iu.test(t)&&(l+=6),/(?:unix|epoch|timestamp|raw|html|url|href|source|id|identifier|internal|debug)/iu.test(t)&&(l-=20),/^(?:date|time|cik)$/iu.test(t)&&(l-=12),/^(?:open|high|low)$/iu.test(t)&&(l-=4),(/^https?:\/\//iu.test(e.value)||"/"===e.value)&&(l-=12),e.value.length>240&&(l-=5),l}function extractKeyValueFields(e,t={}){const l=[...e.matchAll(/(^|[\s;|])([\p{L}\p{N}][\p{L}\p{N} _./()%&+\-]{0,48})[::](?!\/\/)\s*/gu)].filter(e=>void 0!==e.index).map((e,l,i)=>{const n=i[l-1]?.[2]??"",a=function cleanFieldLabel(e,t="",l={}){const i=e.replace(/^(?:[-*]\s*)+/u,"").replace(/\s+/gu," ").trim(),n=i.match(/^.+\b(PE Ratio TTM)$/iu);if(n?.[1]&&n[1]!==i&&/(?:beta|\b20\d{2}|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b)/iu.test(i))return n[1];const a=i.split(" ").filter(Boolean);return a.length>1&&/^\d{4}$/u.test(a[0]??"")||a.length>1&&/^\d+(?:\.\d+)?$/u.test(a[0]??"")&&/^(?:\d+|beta|pe|p\/b)$/iu.test(a[1]??"")||a.length>1&&/^[A-Z]$/u.test(a[0]??"")||a.length>1&&/^(?:inc\.?|llc\.?|ltd\.?|corp\.?|corporation|co\.?)$/iu.test(a[0]??"")||a.length>1&&/^(?:usd|eur|gbp|jpy|cny|cad|aud)$/iu.test(a[0]??"")||a.length>1&&/^(?:gmt|utc)$/iu.test(a[0]??"")?a.slice(1).join(" "):function trailingKnownLabel(e,t){const l=function trailingHintedLabel(e,t){const l=normalizeFieldLabel(e);return Object.values(t).flat().filter(e=>e.trim().length>0).sort((e,t)=>t.length-e.length).find(e=>l.endsWith(normalizeFieldLabel(e)))}(e,t);if(l)return l;if(/\bPE Ratio TTM$/iu.test(e)&&!/^PE Ratio TTM$/iu.test(e))return"PE Ratio TTM";const i=e.match(/\b(?:Published|Updated|Date|Time|Summary|Title|Identifier|Entity|Subject)$/iu);return i&&/(?:filed|\b20\d{2}|10-k|10-q|\bfy\b|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b|\s{3,}|[a-z].{8,}\s)/iu.test(e.slice(0,i.index))?i?.[0]??e:e}(i,l)}(e[2]??"",n,t),r=function droppedLabelPrefix(e,t){const l=e.trim();if(l===t)return"";const i=l.toLowerCase().lastIndexOf(t.toLowerCase());return i>0?l.slice(0,i):""}(e[2]??"",a);return{index:(e.index??0)+String(e[1]??"").length+r.length,start:(e.index??0)+e[0].length,label:a,rawLabel:e[2]??""}}).filter(e=>!isBoundaryNoiseLabel(e.label)&&!isBoundaryNoiseLabel(e.rawLabel));return l.map((t,i)=>{const n=l[i+1]?.index??e.length;return{label:t.label,value:cleanFieldValue(e.slice(t.start,n),t.label)}}).filter(e=>e.label.length>0)}function cleanFieldValue(e,t){const l=e.replace(/^[\s,;|.-]+/u,"").replace(/[\s,;|.-]+$/u,"").replace(/\s+/gu," ").trim(),i=normalizeFieldLabel(t);if(/\brange\b/iu.test(i))return l.replace(/\s+Beta\b.*$/iu,"").trim();if(/^(?:identifier|entity identifier|标识)$/iu.test(i)){const e=l.match(/^([A-Z0-9._-]{1,24})(?:\s+\d+[.)]\s+|$)/u);if(e?.[1])return e[1]}return l}function isBoilerplateField(e){return/^(?:status|control status|evidence tool|tool|source|来源)$/iu.test(e.trim())}function isBoundaryNoiseLabel(e){return/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||/^(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,4}(?:\s+\d{1,2})?$/iu.test(e)||/^\d{4}\s+\d{1,2}$/u.test(e)}export function normalizeFieldLabel(e){return e.toLowerCase().replace(/[^a-z0-9\p{L}\p{N}]+/giu," ").trim()}function titleCaseLabel(e){if(/\p{Script=Han}/u.test(e))return e;const t=e.split(/[^A-Za-z0-9]+/u).filter(Boolean);return normalizeFieldLabel(e).split(" ").filter(Boolean).map((e,l)=>{const i=t[l]??e;return/^[A-Z0-9]{2,}$/u.test(i)?i:e.charAt(0).toUpperCase()+e.slice(1)}).join(" ")}function formatEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1200?`${t.slice(0,1197)}...`:t}function escapeTableCell(e){return e.replace(/\|/gu,"\\|").replace(/\r?\n/gu," ")}function fieldKey(e){return`${e.source}\0${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`}
@@ -1 +1 @@
1
- import{normalizeFieldLabel as e}from"./fields.js";export function observedResultLines(e,t){const i=takeFields(e,isIdentityField,3),n=takeFields(e,isDataField,4),a=takeFields(e,isRecentField,2),o=[i.length>0?observationLine("identity",i,t):void 0,n.length>0?observationLine("data",n,t):void 0,a.length>0?observationLine("recent",a,t):void 0].filter(e=>Boolean(e));return o.length>0?o:["zh"===t?"- 只观察到原始证据,无法形成更具体的归纳。":"- Only raw evidence was observed; no more specific synthesis is available."]}function takeFields(t,i,n){const a=[],o=new Set;for(const s of t){const t=e(s.label);if(!o.has(t)&&i(s)&&(o.add(t),a.push(s),a.length>=n))break}return a}function observationLine(e,t,i){const n=t.map(e=>`${e.label} ${e.value}`).join("zh"===i?";":"; ");return"zh"===i?`- ${"identity"===e?"已确认标识":"data"===e?"关键数据":"近期证据"}:${n}。`:`- ${"identity"===e?"Confirmed identifiers":"data"===e?"Observed data":"Recent evidence"}: ${n}.`}function isIdentityField(t){const i=e(t.label);return/(?:company|name|symbol|ticker|resolved|identifier|entity|名称|公司|代码|标识)/iu.test(i)}function isDataField(t){const i=e(t.label);return"data"===t.kind||/(?:price|value|amount|total|ratio|rate|range|target|estimate|revenue|income|earnings|margin|volume|count|metric|价格|收入|利润|目标|评级|数量|范围|比率)/iu.test(i)}function isRecentField(t){const i=e(t.label);return"timeBound"===t.kind||/(?:date|time|published|updated|headline|summary|event|filing|日期|时间|发布|更新|标题|摘要|事件|披露)/iu.test(i)}
1
+ import{normalizeFieldLabel as e}from"./fields.js";export function observedResultLines(e,t){const i=takeFields(e,isIdentityField,3),n=takeFields(e,isDataField,4),a=takeFields(e,isRecentField,2),s=[i.length>0?observationLine("identity",i,t):void 0,n.length>0?observationLine("data",n,t):void 0,a.length>0?observationLine("recent",a,t):void 0].filter(e=>Boolean(e));return s.length>0?s:["zh"===t?"- 只观察到原始证据,无法形成更具体的归纳。":"- Only raw evidence was observed; no more specific synthesis is available."]}function takeFields(t,i,n){const a=[],s=new Set;for(const o of t){const t=e(o.label);if(!s.has(t)&&i(o)&&(s.add(t),a.push(o),a.length>=n))break}return a}function observationLine(e,t,i){const n=t.map(e=>`${e.label} ${e.value}`).join("zh"===i?";":"; ");return"zh"===i?`- ${"identity"===e?"已确认标识":"data"===e?"关键数据":"近期证据"}:${n}。`:`- ${"identity"===e?"Confirmed identifiers":"data"===e?"Observed data":"Recent evidence"}: ${n}.`}function isIdentityField(t){const i=e(t.label);return"context"===t.kind||/(?:name|title|identifier|entity|subject|名称|标题|标识)/iu.test(i)}function isDataField(t){const i=e(t.label);return"data"===t.kind||/(?:value|amount|total|ratio|rate|range|estimate|count|metric|数量|范围|比率)/iu.test(i)}function isRecentField(t){const i=e(t.label);return"timeBound"===t.kind||/(?:date|time|published|updated|summary|title|日期|时间|发布|更新|标题|摘要)/iu.test(i)}
@@ -1 +1 @@
1
- import{controlBlockers as e,controlGaps as t,successfulEvidenceItems as n}from"./event-evidence.js";import{classifyFact as s,evidenceFields as r,fieldTableLines as o,hasExtractableFields as i,selectSectionFields as c}from"./synthesis/fields.js";import{detectSynthesisLanguage as u}from"./synthesis/language.js";import{observedResultLines as a}from"./synthesis/observed.js";export function synthesizeEvidenceOnlyReport(s,r,o){if(!o.enabled||!o.synthesis.enabled||"evidence_only"!==o.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(-o.synthesis.maxEvidenceItems),c=e(s.events),a=t(s.events);if(0===i.length&&0===c.length&&0===a.length)return;const l=function latestDelegatedReport(e){const t=e.filter(e=>"task"===e.source&&function looksLikeFinalReport(e){const t=e.trim();return!(t.length<80)&&(/^#{1,3}\s+\S/mu.test(t)||/\n#{1,3}\s+\S/mu.test(t)||/\n-{3,}\n/u.test(t))}(e.output)&&!function looksLikeCommentaryInsteadOfEvidence(e){const t=e.trim();return!(t.length>8e3)&&[/(?:这篇文章|this article)[\s\S]{0,1200}(?:我认为|我认同|打动我|值得深入探讨|特别认同|what I find|I think|I agree)/iu,/(?:你还有什么|还想深入探讨|would you like|do you want).{0,120}[??]\s*$/iu].some(e=>e.test(t))}(e.output)).at(-1)?.output.trim();return t||void 0}(i);return l||("zh"===u(s)?function buildChineseReport(e,t,n){const s=evidenceFacts(e);return["# 调查结果","","## 结论",...resultSummaryLines(e,s,t,n,"zh"),"","## 证据摘要",...summaryLines(e,t,n,"zh"),"",...structuredFactSections(s,"zh"),"","## 证据缺口与阻塞",...gapLines(t,n,"zh"),"","## 使用的证据来源",...sourceLines(sourceSummary(e),"zh")].join("\n")}(i,c,a):function buildEnglishReport(e,t,n){const s=evidenceFacts(e);return["# Result","","## Conclusion",...resultSummaryLines(e,s,t,n,"en"),"","## 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,c,a))}function resultSummaryLines(e,t,n,s,o){if(0===e.length)return["zh"===o?"- 没有成功证据可用于形成调查结论。":"- No successful evidence was available for a result."];const i=[...new Set(e.map(e=>humanSourceLabel(e.source)))],c=r(t),u=a(c,o),l=0===n.length&&0===s.length?"zh"===o?"未观察到运行时阻塞;未覆盖的业务、估值或风险细节不应视为已确认。":"No runtime blocker was observed; uncovered business, valuation, or risk details should not be treated as confirmed.":"zh"===o?`仍有 ${n.length+s.length} 个证据缺口或阻塞,结论应按部分调查读取。`:`${n.length+s.length} evidence gap(s) or blocker(s) remain, so read this as a partial result.`;return["zh"===o?`- 已基于 ${i.join("、")} 形成可交付结果。`:`- Result formed from ${i.join(", ")}.`,`- ${l}`,...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:s(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,o=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).`,`- ${o}`]}function structuredFactSections(e,t){if(0===e.length)return["zh"===t?"- 证据缺口:没有可用于生成事实性结论的成功证据。":"- Evidence gap: no successful tool or delegated-task evidence was available."];const n=r(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(s=>{const r=c(n,s.kind,12),u=e.filter(e=>e.kind===s.kind&&!i(e.text)).filter(e=>!function isLowValueTextFact(e){const t=e.trim();return/^https?:\/\/\S+$/iu.test(t)||/^source\s*:/iu.test(t)||/^来源\s*[::]/u.test(t)}(e.text)).slice(0,5);return 0===r.length&&0===u.length?[]:[s.title,...o(r,t),...u.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 function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(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).map(normalizePlainFactLine).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 normalizePlainFactLine(e){if(/^https?:\/\//iu.test(e))return"";const t=e.match(/^\d+[.)]\s+(.+)$/u);return t?.[1]?`Headline: ${t[1]}`:e}function evidenceTextForSource(e,t){return e.find(e=>e.source===t)?.output??""}function fallbackEvidenceText(e){return formatEvidence(e)}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(" ")}
1
+ import{controlBlockers as e,controlGaps as t,successfulEvidenceItems as n}from"./event-evidence.js";import{classifyFact as s,evidenceFields as r,fieldTableLines as i,hasExtractableFields as o,selectSectionFields as c}from"./synthesis/fields.js";import{detectSynthesisLanguage as u}from"./synthesis/language.js";import{observedResultLines as a}from"./synthesis/observed.js";export function synthesizeEvidenceOnlyReport(s,r,i){if(!i.enabled||!i.synthesis.enabled||"evidence_only"!==i.synthesis.mode)return;if("pass"===r.verdict||!function hasRecoverableSynthesisIssue(e){return e.issues.some(e=>"control_blocker"!==e.code)}(r))return;const o=n(s.events).slice(-i.synthesis.maxEvidenceItems),c=e(s.events),a=t(s.events);if(0===o.length&&0===c.length&&0===a.length)return;const l=function latestDelegatedReport(e){const t=e.filter(e=>"task"===e.source&&function looksLikeFinalReport(e){const t=e.trim();return!(t.length<80)&&(/^#{1,3}\s+\S/mu.test(t)||/\n#{1,3}\s+\S/mu.test(t)||/\n-{3,}\n/u.test(t))}(e.output)&&!function looksLikeCommentaryInsteadOfEvidence(e){const t=e.trim();return!(t.length>8e3)&&[/(?:这篇文章|this article)[\s\S]{0,1200}(?:我认为|我认同|打动我|值得深入探讨|特别认同|what I find|I think|I agree)/iu,/(?:你还有什么|还想深入探讨|would you like|do you want).{0,120}[??]\s*$/iu].some(e=>e.test(t))}(e.output)).at(-1)?.output.trim();return t||void 0}(o);return l||("zh"===u(s)?function buildChineseReport(e,t,n,s){const r=evidenceFacts(e,s);return["# 调查结果","","## 结论",...resultSummaryLines(e,r,t,n,"zh",s),"","## 证据摘要",...summaryLines(e,t,n,"zh"),"",...structuredFactSections(r,"zh",s),"","## 证据缺口与阻塞",...gapLines(t,n,"zh"),"","## 使用的证据来源",...sourceLines(sourceSummary(e),"zh")].join("\n")}(o,c,a,i):function buildEnglishReport(e,t,n,s){const r=evidenceFacts(e,s);return["# Result","","## Conclusion",...resultSummaryLines(e,r,t,n,"en",s),"","## Evidence summary",...summaryLines(e,t,n,"en"),"",...structuredFactSections(r,"en",s),"","## Evidence gaps and blockers",...gapLines(t,n,"en"),"","## Sources used",...sourceLines(sourceSummary(e),"en")].join("\n")}(o,c,a,i))}function resultSummaryLines(e,t,n,s,i,o){if(0===e.length)return["zh"===i?"- 没有成功证据可用于形成调查结论。":"- No successful evidence was available for a result."];const c=[...new Set(e.map(e=>humanSourceLabel(e.source)))],u=r(t,o.synthesis.fieldKinds),l=a(u,i),d=0===n.length&&0===s.length?"zh"===i?"未观察到运行时阻塞;未覆盖的细节不应视为已确认。":"No runtime blocker was observed; uncovered details should not be treated as confirmed.":"zh"===i?`仍有 ${n.length+s.length} 个证据缺口或阻塞,结论应按部分调查读取。`:`${n.length+s.length} evidence gap(s) or blocker(s) remain, so read this as a partial result.`;return["zh"===i?`- 已基于 ${c.join("、")} 形成可交付结果。`:`- Result formed from ${c.join(", ")}.`,`- ${d}`,...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,t){return e.flatMap(e=>{const n=factLines(e.output);return(n.length>0?n:[fallbackEvidenceText(e.output)]).map(n=>({source:e.source,text:n,kind:s(n,t.synthesis.fieldKinds)}))}).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,i=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).`,`- ${i}`]}function structuredFactSections(e,t,n){if(0===e.length)return["zh"===t?"- 证据缺口:没有可用于生成事实性结论的成功证据。":"- Evidence gap: no successful tool or delegated-task evidence was available."];const s=r(e,n.synthesis.fieldKinds);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(n=>{const r=c(s,n.kind,12),u=e.filter(e=>e.kind===n.kind&&!o(e.text)).filter(e=>!function isLowValueTextFact(e){const t=e.trim();return/^https?:\/\/\S+$/iu.test(t)||/^source\s*:/iu.test(t)||/^来源\s*[::]/u.test(t)}(e.text)).slice(0,5);return 0===r.length&&0===u.length?[]:[n.title,...i(r,t),...u.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 function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(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).map(normalizePlainFactLine).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 normalizePlainFactLine(e){if(/^https?:\/\//iu.test(e))return"";const t=e.match(/^\d+[.)]\s+(.+)$/u);return t?.[1]?`List Item: ${t[1]}`:e}function evidenceTextForSource(e,t){return e.find(e=>e.source===t)?.output??""}function fallbackEvidenceText(e){return formatEvidence(e)}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(" ")}
@@ -34,12 +34,14 @@ export type QualityPolicy = {
34
34
  enabled: boolean;
35
35
  mode: "evidence_only";
36
36
  maxEvidenceItems: number;
37
+ fieldKinds?: Partial<Record<FactKind, string[]>>;
37
38
  };
38
39
  recovery: {
39
40
  enabled: boolean;
40
41
  maxLoops: number;
41
42
  };
42
43
  };
44
+ export type FactKind = "context" | "data" | "timeBound" | "limit" | "other";
43
45
  export type QualityReviewInput = {
44
46
  workspace: CompiledWorkspace;
45
47
  agent: WorkspaceAgent;
@@ -5,6 +5,7 @@ import type { CompiledWorkspace, WorkspaceAgent } from "../workspace/types.js";
5
5
  export type RuntimeCapabilityState = {
6
6
  memory?: RuntimeMemoryContext;
7
7
  pluginMemories?: RuntimeMemoryContext[];
8
+ modules: Record<string, Record<string, unknown>>;
8
9
  };
9
10
  export type RuntimeCapabilityContext = {
10
11
  workspace: CompiledWorkspace;
@@ -1 +1 @@
1
- export function createRuntimeCapabilityRegistry(e){const t=e.filter(e=>Boolean(e)),o={};return{modules:t,state:o,emitSideEffects(e,o){for(const r of t)try{r.onEvent?.(e,o)}catch{continue}},async beforeAdapterRun(e){for(const r of t){const t=await(r.beforeAdapterRun?.({...e,state:o}));mergeCapabilityState(o,t)}return o},async beforeAdapterResultContract(e){for(const r of t)await(r.beforeAdapterResultContract?.({...e,state:o}))},async afterAdapterResponse(e){for(const r of t)await(r.afterAdapterResponse?.({...e,state:o}))},async stop(){await Promise.all(t.map(e=>e.stop?.()))}}}export function normalizeAdapterResult(e){return"string"==typeof e?{text:e}:e}function mergeCapabilityState(e,t){t&&(void 0!==t.memory&&(e.memory=t.memory),t.pluginMemories&&(e.pluginMemories=[...e.pluginMemories??[],...t.pluginMemories]))}
1
+ export function createRuntimeCapabilityRegistry(e){const t=e.filter(e=>Boolean(e)),o={modules:{}};return{modules:t,state:o,emitSideEffects(e,o){for(const r of t)try{r.onEvent?.(e,o)}catch{continue}},async beforeAdapterRun(e){for(const r of t){const t=await(r.beforeAdapterRun?.({...e,state:o}));mergeCapabilityState(o,t)}return o},async beforeAdapterResultContract(e){for(const r of t)await(r.beforeAdapterResultContract?.({...e,state:o}))},async afterAdapterResponse(e){for(const r of t)await(r.afterAdapterResponse?.({...e,state:o}))},async stop(){await Promise.all(t.map(e=>e.stop?.()))}}}export function normalizeAdapterResult(e){return"string"==typeof e?{text:e}:e}function mergeCapabilityState(e,t){t&&(void 0!==t.memory&&(e.memory=t.memory),t.pluginMemories&&(e.pluginMemories=[...e.pluginMemories??[],...t.pluginMemories]),t.modules&&(e.modules=function mergeModuleState(e,t){const o={...e};for(const[e,r]of Object.entries(t))o[e]={...o[e]??{},...r};return o}(e.modules,t.modules)))}
@@ -15,7 +15,11 @@ export type RuntimeInventoryRepairDiagnostic = {
15
15
  matchSource?: string;
16
16
  confidence?: number;
17
17
  };
18
- export type RuntimeEvent = {
18
+ export type RuntimeEventMetadata = {
19
+ eventId?: string;
20
+ emittedAt?: string;
21
+ };
22
+ export type RuntimeEvent = RuntimeEventMetadata & ({
19
23
  type: "runtime.request.started";
20
24
  requestId: string;
21
25
  sessionId: string;
@@ -289,7 +293,7 @@ export type RuntimeEvent = {
289
293
  sessionId: string;
290
294
  agentId: string;
291
295
  event: unknown;
292
- };
296
+ });
293
297
  export type RuntimeMemoryHook = "read-before-plan" | "read-before-finalize" | "write-after-run";
294
298
  export type RuntimeEventListener = (event: RuntimeEvent) => void;
295
299
  export type RuntimeEmit = (event: RuntimeEvent) => void;
@@ -0,0 +1,11 @@
1
+ import type { CompiledWorkspace, RuntimeRequest, WorkspaceAgent } from "../../types.js";
2
+ export type RuntimePolicyProjectionInput = {
3
+ workspace: CompiledWorkspace;
4
+ agent?: WorkspaceAgent;
5
+ request: RuntimeRequest;
6
+ };
7
+ export type RuntimePolicyProjection = {
8
+ systemPromptSections: string[];
9
+ };
10
+ export declare function projectRuntimePolicies(input: RuntimePolicyProjectionInput): RuntimePolicyProjection;
11
+ export declare function buildRuntimeSystemPrompt(input: RuntimePolicyProjectionInput, basePrompt?: string): string | undefined;
@@ -0,0 +1 @@
1
+ export function projectRuntimePolicies(e){return{systemPromptSections:[skillInventoryPolicy(e),responseLanguagePolicy(e),responsePresentationPolicy(e)].filter(e=>Boolean(e))}}export function buildRuntimeSystemPrompt(e,t){const n=[t,...projectRuntimePolicies(e).systemPromptSections].filter(e=>Boolean(e));return n.length>0?n.join("\n\n"):void 0}function skillInventoryPolicy(e){const t=(e.agent?.skills??[]).map(t=>e.workspace.skills.get(t)).filter(e=>Boolean(e));if(0!==t.length)return["## Stable Harness Skill Inventory","Use only the skills listed in this workspace inventory. Do not infer or invent skill names, skill directories, or SKILL.md paths from generic examples.","Skill files are already registered with the backend. Do not read local SKILL.md files or skill directories through filesystem tools.","If none of these skills match the task, continue with the configured tools and collected evidence instead of reading an unlisted skill path.",t.map(e=>{const t=e.allowedTools.length>0?`; allowed tools: ${e.allowedTools.join(", ")}`:"",n=e.description?`: ${e.description}${t}`:t;return`- ${e.id}${n}`}).join("\n")].join("\n")}function responseLanguagePolicy(e){const t=readRecord(e.workspace.runtime.responseLanguage);if("matchUser"!==(readString(t.mode)??readString(t.strategy)))return;const n=function detectRequestLanguage(e){return/\p{Script=Han}/u.test(e)?"Chinese":/[\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)?"Japanese":/\p{Script=Hangul}/u.test(e)?"Korean":/\p{Script=Arabic}/u.test(e)?"Arabic":/\p{Script=Hebrew}/u.test(e)?"Hebrew":/\p{Script=Thai}/u.test(e)?"Thai":/\p{Script=Cyrillic}/u.test(e)?"Cyrillic-script language":void 0}(e.request.input);return["Stable runtime response language policy:",...n?[`- Detected request language: ${n}.`]:[],"- Match the final answer language to the original user request unless the user explicitly asks for another language.","- If tool or subagent evidence is in a different language, translate the final user-facing answer into the detected request language.","- When delegating to subagents, include the same response-language requirement in delegated instructions.","- Do not call another tool or subagent only to translate, rewrite, format, or synthesize a completed answer.",`Original user request:\n${e.request.input}`].join("\n")}function responsePresentationPolicy(e){const t=readRecord(e.workspace.runtime.responsePresentation);if(!0===t.enabled&&!function hasStructuredResponseFormat(e){return void 0!==e?.config.responseFormat||isRecord(e?.config.deepagents)&&void 0!==e.config.deepagents.responseFormat}(e.agent))return"markdown"===(readString(t.style)??"markdown")?["Stable runtime final-answer presentation policy:","- For user-facing natural-language final answers, use GitHub-flavored Markdown.","- Prefer clear section headings, short paragraphs, and concise bullets over dense prose.","- Use tables only when they make comparison or planning details easier to scan.","- For detailed investigations, plans, or reports, include assumptions, findings, recommendations, and concrete next steps.","- Preserve exact plain text, JSON, code, or other structured output when the user or response format asks for it.","- Do not end with generic follow-up offers; deliver the requested answer directly."].join("\n"):void 0}function readRecord(e){return isRecord(e)?e:{}}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -0,0 +1,45 @@
1
+ import type { RuntimeEvent, RuntimeRequest, WorkspaceAgent } from "../../types.js";
2
+ export type ToolRepeatState = {
3
+ successfulCalls: Map<string, string>;
4
+ duplicateCallCounts: Map<string, number>;
5
+ latestSuccessfulOutputByTool: Map<string, string>;
6
+ successfulToolCounts: Map<string, number>;
7
+ toolCallCounts: Map<string, number>;
8
+ maxDuplicateCallsPerTool?: number;
9
+ maxCallsPerTool?: number;
10
+ maxSuccessfulCallsPerTool?: number;
11
+ maxCallsByTool: Map<string, number>;
12
+ maxSuccessfulCallsByTool: Map<string, number>;
13
+ returnPreviousOutputOnRepeatLimit: boolean;
14
+ };
15
+ export type ToolRepeatDecision = {
16
+ eventOutput: string;
17
+ modelOutput: string;
18
+ };
19
+ export declare function createToolRepeatState(config: unknown): ToolRepeatState | undefined;
20
+ export declare function beforeToolInvoke(toolId: string, args: unknown, state: ToolRepeatState): ToolRepeatDecision | undefined;
21
+ export declare function afterToolInvoke(input: {
22
+ toolId: string;
23
+ args: unknown;
24
+ output: string;
25
+ successful: boolean;
26
+ state: ToolRepeatState;
27
+ }): {
28
+ eventOutput?: string;
29
+ modelOutput?: string;
30
+ };
31
+ export declare function isToolRepeatLimitReached(toolId: string, state: ToolRepeatState | undefined): boolean;
32
+ export declare function missingRequiredPlanContent(input: {
33
+ agent: WorkspaceAgent;
34
+ events: RuntimeEvent[];
35
+ toolId: string;
36
+ }): string;
37
+ export declare function missingToolDependencyContent(input: {
38
+ agent: WorkspaceAgent;
39
+ events: RuntimeEvent[];
40
+ toolId: string;
41
+ }): string;
42
+ export declare function toolInvocationEvents(input: {
43
+ request: RuntimeRequest;
44
+ getEvents?: () => RuntimeEvent[];
45
+ }): RuntimeEvent[];
@@ -0,0 +1 @@
1
+ export function createToolRepeatState(e){if(function repeatGuardEnabled(e){return!0===repeatGuardConfig(e).enabled}(e))return{successfulCalls:new Map,duplicateCallCounts:new Map,latestSuccessfulOutputByTool:new Map,successfulToolCounts:new Map,toolCallCounts:new Map,maxDuplicateCallsPerTool:readPositiveInteger(repeatGuardConfig(e).maxDuplicateCallsPerTool)??3,maxCallsPerTool:readPositiveInteger(repeatGuardConfig(e).maxCallsPerTool),maxSuccessfulCallsPerTool:readPositiveInteger(repeatGuardConfig(e).maxSuccessfulCallsPerTool),maxCallsByTool:readPositiveIntegerMap(repeatGuardConfig(e).maxCallsByTool),maxSuccessfulCallsByTool:readPositiveIntegerMap(repeatGuardConfig(e).maxSuccessfulCallsByTool),returnPreviousOutputOnRepeatLimit:!0===repeatGuardConfig(e).returnPreviousOutputOnRepeatLimit}}export function beforeToolInvoke(e,t,o){const n=o.toolCallCounts.get(e)??0;o.toolCallCounts.set(e,n+1);const r=o.maxCallsByTool.get(e)??o.maxCallsPerTool;if(void 0!==r&&n>=r){const t=o.latestSuccessfulOutputByTool.get(e),n=repeatedToolCallLimitContent(e,t);return{eventOutput:n,modelOutput:repeatLimitModelOutput(n,t,o)}}const l=o.maxSuccessfulCallsByTool.get(e)??o.maxSuccessfulCallsPerTool;if(void 0!==l&&(o.successfulToolCounts.get(e)??0)>=l){const t=o.latestSuccessfulOutputByTool.get(e),n=repeatedToolCallLimitContent(e,t);return{eventOutput:n,modelOutput:repeatLimitModelOutput(n,t,o)}}const a=stableToolCallKey(e,t),s=o.successfulCalls.get(a);if(void 0!==s){const t=o.duplicateCallCounts.get(a)??0;if(o.duplicateCallCounts.set(a,t+1),void 0!==o.maxDuplicateCallsPerTool&&t>=o.maxDuplicateCallsPerTool){const t=repeatedToolCallLimitContent(e);return{eventOutput:t,modelOutput:t}}const n=function duplicateToolCallContent(e,t){return JSON.stringify({status:"duplicate_tool_call",toolId:e,instruction:"This agent already completed an equivalent tool call. Use the prior evidence instead of calling the tool again.",previousOutput:t})}(e,s);return{eventOutput:n,modelOutput:s}}}export function afterToolInvoke(e){return e.successful?(e.state.successfulCalls.set(stableToolCallKey(e.toolId,e.args),e.output),e.state.latestSuccessfulOutputByTool.set(e.toolId,e.output),e.state.successfulToolCounts.set(e.toolId,(e.state.successfulToolCounts.get(e.toolId)??0)+1),{}):{}}export function isToolRepeatLimitReached(e,t){if(!t)return!1;const o=t.maxCallsByTool.get(e)??t.maxCallsPerTool;if(void 0!==o&&(t.toolCallCounts.get(e)??0)>=o)return!0;const n=t.maxSuccessfulCallsByTool.get(e)??t.maxSuccessfulCallsPerTool;return void 0!==n&&(t.successfulToolCounts.get(e)??0)>=n}export function missingRequiredPlanContent(e){const t=readRecord(e.agent.config.executionContract);if(!0!==t.requiresPlan)return"";const o=readStringArray(t.planEvidenceTools);if(0===o.length||o.includes(e.toolId))return"";const n=new Set(e.events.flatMap(readEvidenceToolId));return o.some(e=>n.has(e))?"":["Status: plan_required",`Evidence tool: ${e.toolId}`,`Blocker: execution contract requires a planning checkpoint from one of: ${o.join(", ")} before evidence tools run.`,"Instruction: call the planning tool first, then retry this atomic evidence tool with repaired arguments."].join("\n")}export function missingToolDependencyContent(e){const t=readRecord(e.agent.config.executionContract),o=readStringArray(readRecord(t.toolDependencies)[e.toolId]);if(0===o.length)return"";const n=new Set(e.events.flatMap(readEvidenceToolId)),r=o.filter(e=>!n.has(e));return 0===r.length?"":["Status: dependency_required",`Evidence tool: ${e.toolId}`,`Blocker: this atomic evidence tool requires completed dependency evidence from: ${r.join(", ")}.`,"Instruction: complete the dependency tool first, evaluate it, then retry this atomic evidence tool."].join("\n")}export function toolInvocationEvents(e){const t=e.getEvents?.();return t??[]}function repeatGuardConfig(e){const t=readRecord(e);return readRecord(t.repeatGuard)}function readPositiveInteger(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:void 0}function readPositiveIntegerMap(e){const t=readRecord(e);return new Map(Object.entries(t).map(([e,t])=>[e,readPositiveInteger(t)]).filter(e=>void 0!==e[1]))}function repeatLimitModelOutput(e,t,o){return o.returnPreviousOutputOnRepeatLimit&&void 0!==t&&0!==t.trim().length?t:e}function repeatedToolCallLimitContent(e,t){return JSON.stringify({status:"repeated_tool_call_limit",toolId:e,instruction:"This tool reached the configured repeat limit for this request. Do not call this tool or a substitute tool for the same evidence need again. Use previousOutput and the collected evidence to produce the final answer now, or report the remaining gap explicitly.",...void 0!==t?{previousOutput:t}:{}})}function stableToolCallKey(e,t){return`${e}:${stableJson(t)}`}function stableJson(e){return Array.isArray(e)?`[${e.map(stableJson).join(",")}]`:isRecord(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${stableJson(e[t])}`).join(",")}}`:JSON.stringify(e)}function readEvidenceToolId(e){return"runtime.tool.direct.completed"===e.type?[e.toolId]:"runtime.adapter.event"===e.type&&isRecord(e.event)?"agent.tool.result"!==e.event.phase||"string"!=typeof e.event.toolId?[]:function isSuccessfulEvidenceEvent(e){const t=function readString(e){return"string"==typeof e&&e.length>0?e:void 0}(e.controlStatus)??function readOutputStatus(e){if("string"!=typeof e)return;const t=function parseJsonRecord(e){try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e);return"string"==typeof t?.status?t.status:e.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}(e.output);return!t||/^(?:completed|success|ok|recorded)$/iu.test(t)}(e.event)?[e.event.toolId]:[]:[]}function readRecord(e){return isRecord(e)?e:{}}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -1 +1 @@
1
- export function resolveProgressNarrator(e){if(!1===e.options)return;const t=readProgressPolicy(e.policy);return e.options?.enabled??t.enabled?e.options?.provider??function createTemplateProgressNarrator(){const e=new Map,t=new Map;return{name:"template",narrate(r,n){var o;"runtime.request.started"===r.type&&(e.set(r.requestId,{language:(o=r.input??"",/\p{Script=Han}/u.test(o)?"zh":void 0),input:r.input}),t.delete(r.requestId));const i=function templateMessage(e,t){const r="zh"===t?.language;return"runtime.request.started"===e.type?r?`我开始处理这个请求:${summarizeText(e.input)}`:`I'm starting on this request: ${summarizeText(e.input)}`:"runtime.request.completed"===e.type?r?"我已经完成执行链,正在交付最终结果。":"I've finished the execution chain and am returning the final result.":"runtime.request.failed"===e.type?r?"执行链失败了,我会保留具体错误方便定位。":"The execution chain failed; I'm keeping the concrete error visible for diagnosis.":"runtime.request.cancelled"===e.type?r?"这个请求已取消,后续执行会停止。":"The request was cancelled, so the remaining execution will stop.":"runtime.tool.direct.started"===e.type?r?`我正在运行 ${e.toolId}。`:`I'm running ${e.toolId}.`:"runtime.tool.direct.completed"===e.type?r?`${e.toolId} 已返回结果,我会继续使用这份证据。`:`${e.toolId} returned; I'll keep using that evidence.`:"runtime.workflow.started"===e.type?r?`我正在启动 workflow ${e.workflowId}。`:`I'm starting workflow ${e.workflowId}.`:"runtime.workflow.completed"===e.type?r?`workflow ${e.workflowId} 已完成。`:`Workflow ${e.workflowId} is complete.`:"runtime.specDriven.phase.started"===e.type?r?`我正在进入 spec-driven 阶段 ${e.phaseId}。`:`I'm starting spec-driven phase ${e.phaseId}.`:"runtime.specDriven.phase.blocked"===e.type?r?`spec-driven 阶段 ${e.phaseId} 被 gate 阻塞。`:`Spec-driven phase ${e.phaseId} is blocked by a gate.`:"runtime.specDriven.phase.completed"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已完成。`:`Spec-driven phase ${e.phaseId} is complete.`:"runtime.specDriven.phase.verified"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已验证。`:`Spec-driven phase ${e.phaseId} is verified.`:"runtime.artifact.created"===e.type?r?"我已经保存一份运行产物。":"I've saved a runtime artifact.":"runtime.execution.contract.failed"===e.type?r?"运行证据没有满足执行契约,我会进入恢复或失败路径。":"The run evidence did not satisfy the execution contract, so I'll recover or fail explicitly.":"runtime.inventory.repair"===e.type?inventoryRepairMessage(e.status,e.diagnostic.layer,r):"runtime.skill.candidate.created"===e.type?r?`我发现一个可沉淀的 skill 候选:${e.name}。`:`I found a reusable skill candidate: ${e.name}.`:e.type.startsWith("runtime.memory.")?function memoryMessage(e,t){return"runtime.memory.lifecycle"===e.type?t?`我进入记忆阶段:${e.hook}。`:`I'm in the memory lifecycle phase: ${e.hook}.`:"runtime.memory.recall.completed"===e.type?t?`我召回了 ${e.recordIds.length} 条相关记忆。`:`I recalled ${e.recordIds.length} relevant memory records.`:"runtime.memory.candidate.submitted"===e.type?t?"我提交了一条候选记忆。":"I submitted a memory candidate.":"runtime.memory.approval.requested"===e.type?t?"我提交了记忆审批请求。":"I requested memory approval.":"runtime.memory.plugin.started"===e.type?t?`我正在运行记忆插件 ${e.provider}。`:`I'm running memory plugin ${e.provider}.`:"runtime.memory.plugin.completed"===e.type?t?`记忆插件 ${e.provider} 已完成。`:`Memory plugin ${e.provider} completed.`:"runtime.memory.plugin.failed"===e.type?t?`记忆插件 ${e.provider} 失败了;主任务会继续,不把它当成执行结果。`:`Memory plugin ${e.provider} failed; the main task will continue without treating it as the result.`:"runtime.memory.maintenance.started"===e.type?t?`我正在维护 ${e.target} 记忆。`:`I'm maintaining ${e.target} memory.`:"runtime.memory.maintenance.completed"===e.type?t?`${e.target} 记忆维护完成。`:`${e.target} memory maintenance completed.`:"runtime.memory.maintenance.failed"===e.type?t?`${e.target} 记忆维护失败。`:`${e.target} memory maintenance failed.`:void 0}(e,r):"runtime.adapter.event"===e.type?function adapterMessage(e,t){if(isRecord(e)){if("agent.handoff"===e.phase)return t?"我把请求交给上游 agent backend,让它负责规划和执行。":"I'm handing the request to the upstream agent backend for planning and execution.";if("agent.tool.start"===e.phase&&"string"==typeof e.toolId)return function toolStartMessage(e,t,r){if("task"===e){const e=function readTaskTarget(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)}(t),n=function readDescription(e){const t=isRecord(e)?e:{};return summarizeText(readString(t.description)??readString(t.task))}(t);if(e&&n)return r?`我正在请求 task 工具委派给 ${e}:${n}`:`I'm asking the task tool to delegate to ${e}: ${n}`;if(e)return r?`我正在请求 task 工具委派给 ${e}。`:`I'm asking the task tool to delegate to ${e}.`}return r?`我正在运行 ${e} 收集证据。`:`I'm running ${e} to gather evidence.`}(e.toolId,e.args,t);if("agent.tool.result"===e.phase&&"string"==typeof e.toolId)return function toolResultMessage(e,t,r,n,o){if(r)return o?`${e} 返回错误:${summarizeText(String(r))}`:`${e} returned an error: ${summarizeText(String(r))}`;const i="string"==typeof n?n:function readToolControlStatus(e){const t=function parseToolOutputRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e);return"string"==typeof t?.status?t.status:"string"==typeof t?.error?t.error:"string"==typeof e&&e.startsWith("Task delegation target is not in the workspace inventory")?"task_inventory_blocked":void 0}(t);if(i)return function toolControlMessage(e,t,r){return"duplicate_tool_call"===t?r?`${e} 重复调用已复用已有证据。`:`${e} repeated an equivalent call, so the existing evidence was reused.`:"repeated_tool_call_limit"===t?r?`${e} 出现重复调用循环,我会基于已有证据继续收敛。`:`${e} entered a repeated-call loop, so I'll continue from the evidence already collected.`:"tool_argument_error"===t||"tool_argument_validation_failed"===t?r?`${e} 参数被工具 schema 拒绝,我会让 agent 修正参数或改用合适工具。`:`${e} arguments were rejected by the tool schema; I'll have the agent repair them or choose a suitable tool.`:"task_inventory_blocked"===t?r?"task 委派目标不在当前 workspace inventory 中,已被运行时策略阻止。":"The task delegation target is not in the current workspace inventory and was blocked by runtime policy.":r?`${e} 返回运行时控制状态:${t}。`:`${e} returned runtime control status: ${t}.`}(e,i,o);if("task"===e)return o?"委派任务已返回结果,我会基于这些证据继续推进。":"The delegated task returned; I'll keep going with that evidence.";const a=function summarizeToolOutput(e){if("string"==typeof e)return summarizeText(e);if(isRecord(e)){if("string"==typeof e.status)return summarizeText(e.status);if("string"==typeof e.summary)return summarizeText(e.summary)}}(t);return o?`${e} 已返回${a?`:${a}`:",我会继续判断下一步。"}`:`${e} returned${a?`: ${a}`:"; I'll decide the next step from here."}`}(e.toolId,e.output,e.error,e.controlStatus,t);if("agent.langgraph.invoke"===e.phase)return t?"我正在调用 workflow backend。":"I'm invoking the workflow backend.";if("agent.node.completed"===e.phase&&"string"==typeof e.nodeId)return t?`节点 ${e.nodeId} 已完成。`:`Node ${e.nodeId} is complete.`;if("inventory.repair"===e.phase&&"string"==typeof e.status){const r=isRecord(e.diagnostic)?e.diagnostic:{};return inventoryRepairMessage(e.status,readString(r.layer)??"selection",t)}}}(e.event,r):void 0}(r,e.get(r.requestId));if(i&&i!==t.get(r.requestId))return t.set(r.requestId,i),"runtime.request.failed"!==r.type&&"runtime.request.cancelled"!==r.type||(e.delete(r.requestId),t.delete(r.requestId)),function pruneRequestState(e,t){for(;e.size>200;){const r=e.keys().next().value;if(!r)break;e.delete(r),t.delete(r)}}(e,t),{message:i,style:n.style,model:n.model}}}}():void 0}export function createProgressNarrationEvent(e){if(!e.narrator||"runtime.progress.narration"===e.source.type)return;const t=readProgressPolicy(e.policy),r=!1===e.options?void 0:e.options,n=e.narrator.narrate(e.source,{style:r?.style??t.style,model:r?.model??t.model});return function isPromiseLike(e){return isRecord(e)&&"function"==typeof e.then}(n)?n.then(t=>toNarrationEvent(e.source,e.narrator,t)):toNarrationEvent(e.source,e.narrator,n)}export function createProgressNarrationCapability(e){const t=resolveProgressNarrator(e);if(t)return{id:"runtime.progress.narration",onEvent(r,n){try{const o=createProgressNarrationEvent({source:r,narrator:t,options:e.options,policy:e.policy});!function isRuntimeEventPromise(e){return isRecord(e)&&"function"==typeof e.then}(o)?o&&n(o):o.then(e=>{e&&n(e)}).catch(()=>{})}catch{return}}}}function toNarrationEvent(e,t,r){if(r?.message.trim())return{type:"runtime.progress.narration",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,message:r.message,provider:t.name,sourceEventTypes:r.sourceEventTypes??[e.type],sourceEventIds:r.sourceEventIds,model:r.model,style:r.style}}function inventoryRepairMessage(e,t,r){return"repaired"===e?r?`${t} 选择已按 workspace inventory 修正。`:`${t} selection was repaired against the workspace inventory.`:r?`${t} 选择不在 workspace inventory 中,已被阻止。`:`${t} selection was blocked because it is outside the workspace inventory.`}function summarizeText(e){const t=e?.replace(/\s+/gu," ").trim();return t?t.length>120?`${t.slice(0,117)}...`:t:""}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function readProgressPolicy(e){const t=isRecord(e?.progress)?e.progress:{},r=isRecord(t.narration)?t.narration:{};return{enabled:"boolean"==typeof r.enabled?r.enabled:void 0,style:"string"==typeof r.style?r.style:void 0,model:"string"==typeof r.model?r.model:void 0}}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
1
+ export function resolveProgressNarrator(e){if(!1===e.options)return;const t=readProgressPolicy(e.policy);return e.options?.enabled??t.enabled?e.options?.provider??function createTemplateProgressNarrator(){const e=new Map,t=new Map;return{name:"template",narrate(r,n){var o;"runtime.request.started"===r.type&&(e.set(r.requestId,{language:(o=r.input??"",/\p{Script=Han}/u.test(o)?"zh":void 0),input:r.input}),t.delete(r.requestId));const i=function templateMessage(e,t){const r="zh"===t?.language;return"runtime.request.started"===e.type?r?`我开始处理这个请求:${summarizeText(e.input)}`:`I'm starting on this request: ${summarizeText(e.input)}`:"runtime.request.completed"===e.type?r?"我已经完成执行链,正在交付最终结果。":"I've finished the execution chain and am returning the final result.":"runtime.request.failed"===e.type?r?"执行链失败了,我会保留具体错误方便定位。":"The execution chain failed; I'm keeping the concrete error visible for diagnosis.":"runtime.request.cancelled"===e.type?r?"这个请求已取消,后续执行会停止。":"The request was cancelled, so the remaining execution will stop.":"runtime.tool.direct.started"===e.type?r?`我正在运行 ${e.toolId}。`:`I'm running ${e.toolId}.`:"runtime.tool.direct.completed"===e.type?r?`${e.toolId} 已返回结果,我会继续使用这份证据。`:`${e.toolId} returned; I'll keep using that evidence.`:"runtime.workflow.started"===e.type?r?`我正在启动 workflow ${e.workflowId}。`:`I'm starting workflow ${e.workflowId}.`:"runtime.workflow.completed"===e.type?r?`workflow ${e.workflowId} 已完成。`:`Workflow ${e.workflowId} is complete.`:"runtime.specDriven.phase.started"===e.type?r?`我正在进入 spec-driven 阶段 ${e.phaseId}。`:`I'm starting spec-driven phase ${e.phaseId}.`:"runtime.specDriven.phase.blocked"===e.type?r?`spec-driven 阶段 ${e.phaseId} 被 gate 阻塞。`:`Spec-driven phase ${e.phaseId} is blocked by a gate.`:"runtime.specDriven.phase.completed"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已完成。`:`Spec-driven phase ${e.phaseId} is complete.`:"runtime.specDriven.phase.verified"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已验证。`:`Spec-driven phase ${e.phaseId} is verified.`:"runtime.artifact.created"===e.type?r?"我已经保存一份运行产物。":"I've saved a runtime artifact.":"runtime.execution.contract.failed"===e.type?r?"运行证据没有满足执行契约,我会进入恢复或失败路径。":"The run evidence did not satisfy the execution contract, so I'll recover or fail explicitly.":"runtime.inventory.repair"===e.type?inventoryRepairMessage(e.status,e.diagnostic.layer,r):"runtime.skill.candidate.created"===e.type?r?`我发现一个可沉淀的 skill 候选:${e.name}。`:`I found a reusable skill candidate: ${e.name}.`:e.type.startsWith("runtime.memory.")?function memoryMessage(e,t){return"runtime.memory.lifecycle"===e.type?t?`我进入记忆阶段:${e.hook}。`:`I'm in the memory lifecycle phase: ${e.hook}.`:"runtime.memory.recall.completed"===e.type?t?`我召回了 ${e.recordIds.length} 条相关记忆。`:`I recalled ${e.recordIds.length} relevant memory records.`:"runtime.memory.candidate.submitted"===e.type?t?"我提交了一条候选记忆。":"I submitted a memory candidate.":"runtime.memory.approval.requested"===e.type?t?"我提交了记忆审批请求。":"I requested memory approval.":"runtime.memory.plugin.started"===e.type?t?`我正在运行记忆插件 ${e.provider}。`:`I'm running memory plugin ${e.provider}.`:"runtime.memory.plugin.completed"===e.type?t?`记忆插件 ${e.provider} 已完成。`:`Memory plugin ${e.provider} completed.`:"runtime.memory.plugin.failed"===e.type?t?`记忆插件 ${e.provider} 失败了;主任务会继续,不把它当成执行结果。`:`Memory plugin ${e.provider} failed; the main task will continue without treating it as the result.`:"runtime.memory.maintenance.started"===e.type?t?`我正在维护 ${e.target} 记忆。`:`I'm maintaining ${e.target} memory.`:"runtime.memory.maintenance.completed"===e.type?t?`${e.target} 记忆维护完成。`:`${e.target} memory maintenance completed.`:"runtime.memory.maintenance.failed"===e.type?t?`${e.target} 记忆维护失败。`:`${e.target} memory maintenance failed.`:void 0}(e,r):"runtime.adapter.event"===e.type?function adapterMessage(e,t){if(isRecord(e)){if("agent.handoff"===e.phase)return t?"我把请求交给上游 agent backend,让它负责规划和执行。":"I'm handing the request to the upstream agent backend for planning and execution.";if("agent.tool.start"===e.phase&&"string"==typeof e.toolId)return function toolStartMessage(e,t,r){if("task"===e){const e=function readTaskTarget(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)}(t),n=function readDescription(e){const t=isRecord(e)?e:{};return summarizeText(readString(t.description)??readString(t.task))}(t);if(e&&n)return r?`我正在请求 task 工具委派给 ${e}:${n}`:`I'm asking the task tool to delegate to ${e}: ${n}`;if(e)return r?`我正在请求 task 工具委派给 ${e}。`:`I'm asking the task tool to delegate to ${e}.`}return r?`我正在运行 ${e} 收集证据。`:`I'm running ${e} to gather evidence.`}(e.toolId,e.args,t);if("agent.tool.result"===e.phase&&"string"==typeof e.toolId)return function toolResultMessage(e,t,r,n,o){if(r)return o?`${e} 返回错误:${summarizeText(String(r))}`:`${e} returned an error: ${summarizeText(String(r))}`;const i="string"==typeof n?n:function readToolControlStatus(e){const t=function parseToolOutputRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e);return"string"==typeof t?.status?t.status:"string"==typeof t?.error?t.error:"string"==typeof e&&e.startsWith("Task delegation target is not in the workspace inventory")?"task_inventory_blocked":void 0}(t);if(i)return function toolControlMessage(e,t,r){return"duplicate_tool_call"===t?r?`${e} 重复调用已复用已有证据。`:`${e} repeated an equivalent call, so the existing evidence was reused.`:"repeated_tool_call_limit"===t?r?`${e} 出现重复调用循环,我会基于已有证据继续收敛。`:`${e} entered a repeated-call loop, so I'll continue from the evidence already collected.`:"tool_argument_error"===t||"tool_argument_validation_failed"===t?r?`${e} 参数被工具 schema 拒绝,我会让 agent 修正参数或改用合适工具。`:`${e} arguments were rejected by the tool schema; I'll have the agent repair them or choose a suitable tool.`:"task_inventory_blocked"===t?r?"task 委派目标不在当前 workspace inventory 中,已被运行时策略阻止。":"The task delegation target is not in the current workspace inventory and was blocked by runtime policy.":r?`${e} 返回运行时控制状态:${t}。`:`${e} returned runtime control status: ${t}.`}(e,i,o);if("task"===e)return o?"委派任务已返回结果,我会基于这些证据继续推进。":"The delegated task returned; I'll keep going with that evidence.";const a=function summarizeToolOutput(e){if("string"==typeof e)return summarizeText(e);if(isRecord(e)){if("string"==typeof e.status)return summarizeText(e.status);if("string"==typeof e.summary)return summarizeText(e.summary)}}(t);return o?`${e} 已返回${a?`:${a}`:",我会继续判断下一步。"}`:`${e} returned${a?`: ${a}`:"; I'll decide the next step from here."}`}(e.toolId,e.output,e.error,e.controlStatus,t);if("agent.langgraph.invoke"===e.phase)return t?"我正在调用 workflow backend。":"I'm invoking the workflow backend.";if("agent.node.completed"===e.phase&&"string"==typeof e.nodeId)return t?`节点 ${e.nodeId} 已完成。`:`Node ${e.nodeId} is complete.`;if("inventory.repair"===e.phase&&"string"==typeof e.status){const r=isRecord(e.diagnostic)?e.diagnostic:{};return inventoryRepairMessage(e.status,readString(r.layer)??"selection",t)}}}(e.event,r):void 0}(r,e.get(r.requestId));if(i&&i!==t.get(r.requestId))return t.set(r.requestId,i),"runtime.request.failed"!==r.type&&"runtime.request.cancelled"!==r.type||(e.delete(r.requestId),t.delete(r.requestId)),function pruneRequestState(e,t){for(;e.size>200;){const r=e.keys().next().value;if(!r)break;e.delete(r),t.delete(r)}}(e,t),{message:i,style:n.style,model:n.model}}}}():void 0}export function createProgressNarrationEvent(e){if(!e.narrator||"runtime.progress.narration"===e.source.type)return;const t=readProgressPolicy(e.policy),r=!1===e.options?void 0:e.options,n=e.narrator.narrate(e.source,{style:r?.style??t.style,model:r?.model??t.model});return function isPromiseLike(e){return isRecord(e)&&"function"==typeof e.then}(n)?n.then(t=>toNarrationEvent(e.source,e.narrator,t)):toNarrationEvent(e.source,e.narrator,n)}export function createProgressNarrationCapability(e){const t=resolveProgressNarrator(e);if(t)return{id:"runtime.progress.narration",onEvent(r,n){try{const o=createProgressNarrationEvent({source:r,narrator:t,options:e.options,policy:e.policy});!function isRuntimeEventPromise(e){return isRecord(e)&&"function"==typeof e.then}(o)?o&&n(o):o.then(e=>{e&&n(e)}).catch(()=>{})}catch{return}}}}function toNarrationEvent(e,t,r){if(r?.message.trim())return{type:"runtime.progress.narration",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,message:r.message,provider:t.name,sourceEventTypes:r.sourceEventTypes??[e.type],sourceEventIds:r.sourceEventIds??(e.eventId?[e.eventId]:void 0),model:r.model,style:r.style}}function inventoryRepairMessage(e,t,r){return"repaired"===e?r?`${t} 选择已按 workspace inventory 修正。`:`${t} selection was repaired against the workspace inventory.`:r?`${t} 选择不在 workspace inventory 中,已被阻止。`:`${t} selection was blocked because it is outside the workspace inventory.`}function summarizeText(e){const t=e?.replace(/\s+/gu," ").trim();return t?t.length>120?`${t.slice(0,117)}...`:t:""}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function readProgressPolicy(e){const t=isRecord(e?.progress)?e.progress:{},r=isRecord(t.narration)?t.narration:{};return{enabled:"boolean"==typeof r.enabled?r.enabled:void 0,style:"string"==typeof r.style?r.style:void 0,model:"string"==typeof r.model?r.model:void 0}}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -1 +1 @@
1
- import{randomUUID as e}from"node:crypto";import{assertExecutionContract as t}from"./execution-contract.js";import{assertNoRawToolCallOutput as r,assertNoToolExecutionErrorOutput as a,buildAdapterErrorRecoveryPrompt as o,buildEvidenceSynthesisOutput as s,buildExecutionContractRecoveryRequest as n,buildResultRecoveryRequest as i,containsRawToolCallOutput as u,isRecoverableAdapterError as c,rawToolCallFailureMessage as l,toolCallRecoveryEnabled as p}from"./recovery/tool-call.js";import{recoverQualityReview as d,resolveQualityPolicy as m}from"./quality/index.js";import{completeRun as w,failRun as y}from"./runtime/completion.js";import{runDirectToolCall as f}from"./runtime/direct-tool-call.js";import{createApprovalGatedToolGateway as g}from"./runtime/governance/approval-gate.js";import{createSandboxedToolGateway as I}from"./runtime/governance/sandbox.js";import{createRuntimeInspectionMethods as q}from"./runtime/inspection/methods.js";import{createRuntimeCapabilityRegistry as R,normalizeAdapterResult as v}from"./runtime/capabilities.js";import{createMemoryRuntimeCapability as b}from"./runtime/memory.js";import{createInMemoryRuntimeStore as k}from"./runtime/persistence/stores.js";import{createProgressNarrationCapability as A}from"./runtime/progress-narration.js";import{repairRuntimeSelection as C}from"./runtime/selection-repair.js";import{createToolFailureTracker as x}from"./runtime/tool-failure.js";import{runWorkflowRequest as h}from"./workflows/runtime.js";export function createStableHarnessRuntime(t){const r=new Set,a=t.store??k(),s=R([b(t),A({options:t.progressNarration,policy:t.workspace.runtime}),...t.capabilities??[]]),emitBase=e=>{a.appendEvent(e);for(const t of r)t(e)},emit=e=>{emitBase(e),s.emitSideEffects(e,emitBase)},i=I({gateway:g({gateway:t.toolGateway,approvals:t.approvals,workspace:t.workspace,emit:emit}),workspace:t.workspace,sandbox:t.sandbox,emit:emit}),u={...t,toolGateway:i},l=x(function readToolFailurePolicy(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const t=e.failurePolicy;return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}(t.workspace.runtime.toolGateway));return{request:async t=>async function runRuntimeRequest(t){const r=t.request.requestId??e(),a=t.request.sessionId??e(),s=[],{agent:i,adapter:u}=await async function resolveExecution(e,t,r){const a=t.agentId?await async function resolveRequestedAgentId(e,t,r){if(e.agents.has(t))return t;const a=await C({id:t,candidates:[...e.agents.values()].map(e=>({id:e.id,description:e.description})),trace:{...r,agentId:t,layer:"agent",owner:"stable_runtime_policy"}});return a.ok?a.id:t}(e.workspace,t.agentId,r):function resolveRoutedAgentId(e,t){for(const r of e.runtime.routes??[])if(routeMatches(r,t))return r.agentId;return e.runtime.defaultAgentId}(e.workspace,t.input),o=e.workspace.agents.get(a);if(!o)throw new Error(`Agent ${a} is not defined in the workspace`);if(t.toolCall||t.workflow)return{agent:o,adapter:void 0};const s=e.adapters.find(e=>e.canRun(o));if(!s)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:s}}(t.input,t.request,{requestId:r,sessionId:a,emit:e=>s.push(e)});t.store.createRun(function createRunRecord(e,t,r,a){return{requestId:t,sessionId:r,agentId:a.id,input:e.input,state:"running",parentRunId:e.parentRunId,metadata:e.metadata,artifacts:[],startedAt:(new Date).toISOString(),events:[]}}(t.request,r,a,i)),s.forEach(t.emit),t.emit({type:"runtime.request.started",requestId:r,sessionId:a,agentId:i.id,input:t.request.input});try{if(t.request.workflow){const e=await h({workspace:t.input.workspace,adapters:t.input.workflowAdapters??[],toolGateway:t.input.toolGateway,request:{input:t.request.input,...t.request.workflow},requestId:r,sessionId:a,agentId:i.id,emit:t.emit});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}if(t.request.toolCall){const e=await f({gateway:t.input.toolGateway,workspace:t.input.workspace,emit:t.emit,request:t.request,requestId:r,sessionId:a,agent:i,toolFailureTracker:t.toolFailureTracker});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}return await async function runAdapterRequest(e){if(!e.adapter)throw new Error(`No runtime adapter can run backend ${e.agent.backend} for agent ${e.agent.id}`);const t=e.adapter,r=await e.capabilities.beforeAdapterRun(createCapabilityContext(e)),a=r.memory,s=r.pluginMemories??[],i=e.input.workspace.runtime,u=m(e.input.workspace.runtime,e.agent),l=new Map;let p;try{p=await runAdapterOnce(e,t,e.request,a,s,l)}catch(r){if(!c(r,i))throw r;p=await runAdapterOnce(e,t,o(e.request,r,i),a,s,l)}p=await recoverAdapterResultOutput(e,t,e.request,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),e.request,p,u),await e.capabilities.beforeAdapterResultContract({...createCapabilityContext(e),result:p});try{assertRequestExecutionContract(e)}catch(r){const o=n({request:e.request,events:e.store.getRun(e.requestId)?.events??[],policy:i});if(!o)throw r;p=await runAdapterOnce(e,t,o,a,s,l),p=await recoverAdapterResultOutput(e,t,o,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),o,p,u),assertRequestExecutionContract(e)}const y=w({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,result:p,artifacts:e.input.artifacts});return await e.capabilities.afterAdapterResponse({...createCapabilityContext(e),result:p,response:y}),y}({...t,adapter:u,requestId:r,sessionId:a,agent:i})}catch(e){return y({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,error:e})}}({input:u,capabilities:s,store:a,emit:emit,request:t,toolFailureTracker:l}),subscribe:e=>(r.add(e),()=>r.delete(e)),...q({workspace:t.workspace,store:a,artifacts:t.artifacts,approvals:t.approvals,emit:emit}),cancel(e,t){const r=a.getRun(e);r&&"running"===r.state&&(a.updateRun(e,{state:"cancelled",completedAt:(new Date).toISOString()}),emit({type:"runtime.request.cancelled",requestId:e,sessionId:r.sessionId,agentId:r.agentId,reason:t}))},async stop(){await s.stop(),r.clear()}}}function createCapabilityContext(e){return{workspace:e.input.workspace,store:e.store,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent}}function createQualityRuntimeInput(e,t,r,a){return{workspace:e.input.workspace,agent:e.agent,request:e.request,requestId:e.requestId,sessionId:e.sessionId,events:e.store.getRun(e.requestId)?.events??[],emit:e.emit,getEvents:()=>e.store.getRun(e.requestId)?.events??[],runAdapter:o=>runAdapterOnce(e,e.adapter,o,t,r,a),reviewModel:e.input.qualityReviewModel,memory:t,pluginMemories:r}}async function recoverAdapterResultOutput(e,t,o,n,c,d,m,w){let y=o;const f=function resultRecoveryAttempts(e){const t="object"!=typeof e||null===e||Array.isArray(e)?void 0:e.recovery,r="object"!=typeof t||null===t||Array.isArray(t)?void 0:t.toolCall,a="object"!=typeof r||null===r||Array.isArray(r)?void 0:r.maxResultRecoveryAttempts;return"number"==typeof a&&Number.isInteger(a)&&a>0?a:3}(m);let g=0;for(let r=0;r<f;r+=1){const r=e.store.getRun(e.requestId)?.events??[],a=i({request:y,output:n.text,events:r.slice(g),availableToolIds:e.agent.tools,policy:m});if(!a)break;y=a,g=e.store.getRun(e.requestId)?.events.length??0,n=await runAdapterOnce(e,t,a,c,d,w)}if(p(m)){let t=!1;u(n.text,m)&&function rawToolCallFailureReturnsMessage(e){return"message"===("object"!=typeof e?.toolCallRecovery||null===e.toolCallRecovery||Array.isArray(e.toolCallRecovery)?{}:e.toolCallRecovery).onFailure}(o.metadata)&&(n={...n,text:l(),metadata:{...n.metadata,toolCallRecovery:{failed:!0,reason:"raw_tool_call_output"}}});const i=s({request:o,output:n.text,events:e.store.getRun(e.requestId)?.events??[],policy:m});i&&(t=!0,n={...n,text:i,metadata:{...n.metadata,toolCallRecovery:{synthesized:!0,reason:"raw_tool_call_output_with_evidence"}}}),t||(r(n.text,m),a(n.text,m))}return n}function assertRequestExecutionContract(e){t({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,metadata:e.request.metadata})}async function runAdapterOnce(e,t,r,a,o,s){return v(await t.run({workspace:e.input.workspace,agent:e.agent,request:r,requestId:e.requestId,sessionId:e.sessionId,memory:a,pluginMemories:o,toolGateway:e.input.toolGateway,toolFailureTracker:e.input.toolFailureTracker,requestState:s,emit:e.emit}))}function routeMatches(e,t){if(e.pattern)try{if(new RegExp(e.pattern,"iu").test(t))return!0}catch{return!1}const r=t.toLowerCase();return(e.keywords??[]).some(e=>r.includes(e.toLowerCase()))}
1
+ import{randomUUID as e}from"node:crypto";import{assertExecutionContract as t}from"./execution-contract.js";import{assertNoRawToolCallOutput as r,assertNoToolExecutionErrorOutput as a,buildAdapterErrorRecoveryPrompt as o,buildEvidenceSynthesisOutput as s,buildExecutionContractRecoveryRequest as n,buildResultRecoveryRequest as i,containsRawToolCallOutput as u,isRecoverableAdapterError as c,rawToolCallFailureMessage as l,toolCallRecoveryEnabled as p}from"./recovery/tool-call.js";import{recoverQualityReview as d,resolveQualityPolicy as m}from"./quality/index.js";import{completeRun as w,failRun as y}from"./runtime/completion.js";import{runDirectToolCall as f}from"./runtime/direct-tool-call.js";import{createApprovalGatedToolGateway as I}from"./runtime/governance/approval-gate.js";import{createSandboxedToolGateway as g}from"./runtime/governance/sandbox.js";import{createRuntimeInspectionMethods as q}from"./runtime/inspection/methods.js";import{createRuntimeCapabilityRegistry as R,normalizeAdapterResult as v}from"./runtime/capabilities.js";import{createMemoryRuntimeCapability as b}from"./runtime/memory.js";import{createInMemoryRuntimeStore as k}from"./runtime/persistence/stores.js";import{createProgressNarrationCapability as A}from"./runtime/progress-narration.js";import{repairRuntimeSelection as C}from"./runtime/selection-repair.js";import{createToolFailureTracker as x}from"./runtime/tool-failure.js";import{runWorkflowRequest as h}from"./workflows/runtime.js";export function createStableHarnessRuntime(t){const r=new Set,a=t.store??k(),s=R([b(t),A({options:t.progressNarration,policy:t.workspace.runtime}),...t.capabilities??[]]),emitBase=t=>{const o=function enrichRuntimeEvent(t){return{...t,eventId:t.eventId??e(),emittedAt:t.emittedAt??(new Date).toISOString()}}(t);a.appendEvent(o);for(const e of r)e(o)},emit=e=>{emitBase(e),s.emitSideEffects(e,emitBase)},i=g({gateway:I({gateway:t.toolGateway,approvals:t.approvals,workspace:t.workspace,emit:emit}),workspace:t.workspace,sandbox:t.sandbox,emit:emit}),u={...t,toolGateway:i},l=x(function readToolFailurePolicy(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const t=e.failurePolicy;return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}(t.workspace.runtime.toolGateway));return{request:async t=>async function runRuntimeRequest(t){const r=t.request.requestId??e(),a=t.request.sessionId??e(),s=[],{agent:i,adapter:u}=await async function resolveExecution(e,t,r){const a=t.agentId?await async function resolveRequestedAgentId(e,t,r){if(e.agents.has(t))return t;const a=await C({id:t,candidates:[...e.agents.values()].map(e=>({id:e.id,description:e.description})),trace:{...r,agentId:t,layer:"agent",owner:"stable_runtime_policy"}});return a.ok?a.id:t}(e.workspace,t.agentId,r):function resolveRoutedAgentId(e,t){for(const r of e.runtime.routes??[])if(routeMatches(r,t))return r.agentId;return e.runtime.defaultAgentId}(e.workspace,t.input),o=e.workspace.agents.get(a);if(!o)throw new Error(`Agent ${a} is not defined in the workspace`);if(t.toolCall||t.workflow)return{agent:o,adapter:void 0};const s=e.adapters.find(e=>e.canRun(o));if(!s)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:s}}(t.input,t.request,{requestId:r,sessionId:a,emit:e=>s.push(e)});t.store.createRun(function createRunRecord(e,t,r,a){return{requestId:t,sessionId:r,agentId:a.id,input:e.input,state:"running",parentRunId:e.parentRunId,metadata:e.metadata,artifacts:[],startedAt:(new Date).toISOString(),events:[]}}(t.request,r,a,i)),s.forEach(t.emit),t.emit({type:"runtime.request.started",requestId:r,sessionId:a,agentId:i.id,input:t.request.input});try{if(t.request.workflow){const e=await h({workspace:t.input.workspace,adapters:t.input.workflowAdapters??[],toolGateway:t.input.toolGateway,request:{input:t.request.input,...t.request.workflow},requestId:r,sessionId:a,agentId:i.id,emit:t.emit});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}if(t.request.toolCall){const e=await f({gateway:t.input.toolGateway,workspace:t.input.workspace,emit:t.emit,request:t.request,requestId:r,sessionId:a,agent:i,toolFailureTracker:t.toolFailureTracker});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}return await async function runAdapterRequest(e){if(!e.adapter)throw new Error(`No runtime adapter can run backend ${e.agent.backend} for agent ${e.agent.id}`);const t=e.adapter,r=await e.capabilities.beforeAdapterRun(createCapabilityContext(e)),a=r.memory,s=r.pluginMemories??[],i=e.input.workspace.runtime,u=m(e.input.workspace.runtime,e.agent),l=new Map;let p;try{p=await runAdapterOnce(e,t,e.request,a,s,l)}catch(r){if(!c(r,i))throw r;p=await runAdapterOnce(e,t,o(e.request,r,i),a,s,l)}p=await recoverAdapterResultOutput(e,t,e.request,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),e.request,p,u),await e.capabilities.beforeAdapterResultContract({...createCapabilityContext(e),result:p});try{assertRequestExecutionContract(e)}catch(r){const o=n({request:e.request,events:e.store.getRun(e.requestId)?.events??[],policy:i});if(!o)throw r;p=await runAdapterOnce(e,t,o,a,s,l),p=await recoverAdapterResultOutput(e,t,o,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),o,p,u),assertRequestExecutionContract(e)}const y=w({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,result:p,artifacts:e.input.artifacts});return await e.capabilities.afterAdapterResponse({...createCapabilityContext(e),result:p,response:y}),y}({...t,adapter:u,requestId:r,sessionId:a,agent:i})}catch(e){return y({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,error:e})}}({input:u,capabilities:s,store:a,emit:emit,request:t,toolFailureTracker:l}),subscribe:e=>(r.add(e),()=>r.delete(e)),...q({workspace:t.workspace,store:a,artifacts:t.artifacts,approvals:t.approvals,emit:emit}),cancel(e,t){const r=a.getRun(e);r&&"running"===r.state&&(a.updateRun(e,{state:"cancelled",completedAt:(new Date).toISOString()}),emit({type:"runtime.request.cancelled",requestId:e,sessionId:r.sessionId,agentId:r.agentId,reason:t}))},async stop(){await s.stop(),r.clear()}}}function createCapabilityContext(e){return{workspace:e.input.workspace,store:e.store,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent}}function createQualityRuntimeInput(e,t,r,a){return{workspace:e.input.workspace,agent:e.agent,request:e.request,requestId:e.requestId,sessionId:e.sessionId,events:e.store.getRun(e.requestId)?.events??[],emit:e.emit,getEvents:()=>e.store.getRun(e.requestId)?.events??[],runAdapter:o=>runAdapterOnce(e,e.adapter,o,t,r,a),reviewModel:e.input.qualityReviewModel,memory:t,pluginMemories:r}}async function recoverAdapterResultOutput(e,t,o,n,c,d,m,w){let y=o;const f=function resultRecoveryAttempts(e){const t="object"!=typeof e||null===e||Array.isArray(e)?void 0:e.recovery,r="object"!=typeof t||null===t||Array.isArray(t)?void 0:t.toolCall,a="object"!=typeof r||null===r||Array.isArray(r)?void 0:r.maxResultRecoveryAttempts;return"number"==typeof a&&Number.isInteger(a)&&a>0?a:3}(m);let I=0;for(let r=0;r<f;r+=1){const r=e.store.getRun(e.requestId)?.events??[],a=i({request:y,output:n.text,events:r.slice(I),availableToolIds:e.agent.tools,policy:m});if(!a)break;y=a,I=e.store.getRun(e.requestId)?.events.length??0,n=await runAdapterOnce(e,t,a,c,d,w)}if(p(m)){let t=!1;u(n.text,m)&&function rawToolCallFailureReturnsMessage(e){return"message"===("object"!=typeof e?.toolCallRecovery||null===e.toolCallRecovery||Array.isArray(e.toolCallRecovery)?{}:e.toolCallRecovery).onFailure}(o.metadata)&&(n={...n,text:l(),metadata:{...n.metadata,toolCallRecovery:{failed:!0,reason:"raw_tool_call_output"}}});const i=s({request:o,output:n.text,events:e.store.getRun(e.requestId)?.events??[],policy:m});i&&(t=!0,n={...n,text:i,metadata:{...n.metadata,toolCallRecovery:{synthesized:!0,reason:"raw_tool_call_output_with_evidence"}}}),t||(r(n.text,m),a(n.text,m))}return n}function assertRequestExecutionContract(e){t({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,metadata:e.request.metadata})}async function runAdapterOnce(e,t,r,a,o,s){return v(await t.run({workspace:e.input.workspace,agent:e.agent,request:r,requestId:e.requestId,sessionId:e.sessionId,memory:a,pluginMemories:o,toolGateway:e.input.toolGateway,toolFailureTracker:e.input.toolFailureTracker,requestState:s,getEvents:()=>e.store.getRun(e.requestId)?.events??[],emit:e.emit}))}function routeMatches(e,t){if(e.pattern)try{if(new RegExp(e.pattern,"iu").test(t))return!0}catch{return!1}const r=t.toLowerCase();return(e.keywords??[]).some(e=>r.includes(e.toLowerCase()))}
@@ -10,6 +10,38 @@ export type RuntimeTraceEntry = {
10
10
  requestId: string;
11
11
  detail?: Record<string, unknown>;
12
12
  };
13
+ export type RuntimeAdapterTraceProjection = {
14
+ traceType: RuntimeTraceEntry["type"];
15
+ traceLabel: string;
16
+ } & Record<string, unknown>;
17
+ export type RuntimeTraceSpanKind = "run" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation" | "approval" | "quality";
18
+ export type RuntimeTraceSpanStatus = "running" | "completed" | "failed" | "blocked" | "event";
19
+ export type RuntimeTraceSpanEventRef = {
20
+ index: number;
21
+ eventId: string;
22
+ type: RuntimeEvent["type"];
23
+ emittedAt?: string;
24
+ };
25
+ export type RuntimeTraceSpan = {
26
+ spanId: string;
27
+ parentSpanId?: string;
28
+ requestId: string;
29
+ sessionId: string;
30
+ agentId: string;
31
+ kind: RuntimeTraceSpanKind;
32
+ name: string;
33
+ status: RuntimeTraceSpanStatus;
34
+ startedAt?: string;
35
+ completedAt?: string;
36
+ startEventIndex: number;
37
+ endEventIndex?: number;
38
+ durationMs?: number;
39
+ attributes?: Record<string, unknown>;
40
+ events: RuntimeTraceSpanEventRef[];
41
+ };
42
+ export declare function createDelegationTraceProjection(label: "delegation.start" | "delegation.completed", detail?: Record<string, unknown>): RuntimeAdapterTraceProjection;
43
+ export declare function createPlanTraceProjection(label: "plan.updated", detail?: Record<string, unknown>): RuntimeAdapterTraceProjection;
13
44
  export declare function projectRuntimeTrace(run: RuntimeRunRecord): RuntimeTraceEntry[];
45
+ export declare function projectRuntimeTraceSpans(run: RuntimeRunRecord): RuntimeTraceSpan[];
14
46
  export declare function projectEvent(event: RuntimeEvent): RuntimeTraceEntry | undefined;
15
47
  export declare function readPlanTodos(output: unknown): PlanTodoItem[];
@@ -1 +1 @@
1
- export function projectRuntimeTrace(e){return e.events.map(projectEvent).filter(isTraceEntry)}export function projectEvent(e){return"runtime.request.started"===e.type||"runtime.request.completed"===e.type||"runtime.request.failed"===e.type?base(e,"request",e.type):"runtime.request.cancelled"===e.type?base(e,"request",e.type,{reason:e.reason}):"runtime.execution.contract.failed"===e.type?base(e,"request",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):"runtime.inventory.repair"===e.type?base(e,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.tool.direct.started"===e.type?base(e,"tool","runtime.tool.direct.started",{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?base(e,"tool","runtime.tool.direct.completed",{toolId:e.toolId}):"runtime.sandbox.decision"===e.type?base(e,"tool","runtime.sandbox.decision",{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?base(e,"tool","runtime.tool.failure",{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?base(e,"tool","runtime.tool.circuit.opened",{toolId:e.toolId,reason:e.reason}):"runtime.workflow.started"===e.type||"runtime.workflow.completed"===e.type?base(e,"workflow",e.type,{workflowId:e.workflowId,adapter:e.adapter}):function isSpecDrivenPhaseEvent(e){return e.type.startsWith("runtime.specDriven.phase.")}(e)?base(e,"spec",e.type,{phaseId:e.phaseId,..."workflowId"in e&&e.workflowId?{workflowId:e.workflowId}:{},..."reason"in e?{reason:e.reason}:{},..."artifact"in e&&e.artifact?{artifact:e.artifact}:{}}):"runtime.adapter.event"===e.type?function adapterTrace(e){const t=e.event;if(isRecord(t)&&"string"==typeof t.phase){const r=function semanticAdapterTrace(e,t){if("inventory.repair"===t.phase)return base(e,"adapter","runtime.inventory.repair",{status:t.status,...isRecord(t.diagnostic)?t.diagnostic:{}});const r=function readTraceType(e){const t=readString(e);return"request"===t||"tool"===t||"workflow"===t||"spec"===t||"adapter"===t||"memory"===t||"artifact"===t||"progress"===t||"plan"===t||"delegation"===t?t:void 0}(t.traceType),o=readString(t.traceLabel);return r&&o?base(e,r,o,t):void 0}(e,t);return r||base(e,"adapter",t.phase.startsWith("agent.")?t.phase:`adapter.${t.phase}`,t)}return base(e,"adapter","runtime.adapter.event",{event:t})}(e):"runtime.artifact.created"===e.type?base(e,"artifact","runtime.artifact.created",{artifact:e.artifact}):e.type.startsWith("runtime.memory.")?base(e,"memory",e.type):"runtime.progress.narration"===e.type?base(e,"progress",e.type,{message:e.message,provider:e.provider,sourceEventTypes:e.sourceEventTypes}):void 0}export function readPlanTodos(e){const t=function readPlanRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e),r=function readTodosArray(e){const t=isRecord(e?.args)?e.args:void 0;return Array.isArray(e?.todos)?e.todos:Array.isArray(t?.todos)?t.todos:[]}(t);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(e){if(isRecord(e)&&"string"==typeof e.content)return{content:e.content,status:"string"==typeof e.status?e.status:"pending"}}function isPlanTodoItem(e){return void 0!==e}function base(e,t,r,o){return{type:t,label:r,agentId:e.agentId,requestId:e.requestId,detail:o}}function isTraceEntry(e){return void 0!==e}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}
1
+ export function createDelegationTraceProjection(e,t={}){return{traceType:"delegation",traceLabel:e,...t}}export function createPlanTraceProjection(e,t={}){return{traceType:"plan",traceLabel:e,...t}}export function projectRuntimeTrace(e){return e.events.map(projectEvent).filter(isTraceEntry)}export function projectRuntimeTraceSpans(e){const t=function createSpanBuilder(e){const t=`run:${e.requestId}`,r=[],o=new Map;return{ensureRoot(){if(o.has(t))return;const n={spanId:t,requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,kind:"run",name:e.agentId,status:(a=e.state,"completed"===a?"completed":"failed"===a?"failed":"cancelled"===a?"blocked":"running"),startedAt:e.startedAt,completedAt:e.completedAt,startEventIndex:0,...e.parentRunId?{parentSpanId:`run:${e.parentRunId}`}:{},events:[]};var a;r.push(n),o.set(t,n)},markRoot(e,r,n,a){const i=o.get(t);i&&(addEvent(i,e,r),i.status=n,i.attributes=merge(i.attributes,a),"running"!==n&&close(i,e,r))},start(e,n,a,i,s,d){const p=createSpan(`${t}/${e}:${s}`,t,n,a,i,s,d);r.push(p),o.set(e,p)},complete(e,n,a,i){const s=o.get(e)??createSpan(`${t}/${e}:${a}`,t,"adapter",e,n,a);return o.has(e)||r.push(s),addEvent(s,n,a),s.attributes=merge(s.attributes,i),close(s,n,a),o.delete(e),s},fail(e,t,r,o){this.complete(e,t,r,o).status="failed"},event(e,o,n,a,i){const s=createSpan(`${t}/event:${a}`,t,e,o,n,a,i);s.status=function readBlockedStatus(e){return e.type.endsWith(".blocked")||e.type.includes(".approval.")?"blocked":void 0}(n)??"event",close(s,n,a),r.push(s)},closeRoot(){const r=o.get(t);r&&e.completedAt&&(r.completedAt=e.completedAt)},spans:()=>r}}(e);return t.ensureRoot(),e.events.forEach((e,r)=>function projectSpanEvent(e,t,r){return t.type.startsWith("runtime.request.")?function projectRequestSpanEvent(e,t,r){return"runtime.request.started"===t.type?e.markRoot(t,r,"running",{input:t.input}):"runtime.request.completed"===t.type?e.markRoot(t,r,"completed",{output:t.output}):"runtime.request.failed"===t.type?e.markRoot(t,r,"failed",{error:t.error}):"runtime.request.cancelled"===t.type?e.markRoot(t,r,"blocked",{reason:t.reason}):"runtime.execution.contract.failed"===t.type?projectSingleSpan(e,t,r,"quality",t.type,{reason:t.reason,missingEvidenceTools:t.missingEvidenceTools}):void 0}(e,t,r):"runtime.tool.direct.started"===t.type?e.start(`tool:${t.toolId}`,"tool",t.toolId,t,r,{toolId:t.toolId}):"runtime.tool.direct.completed"===t.type?e.complete(`tool:${t.toolId}`,t,r,{toolId:t.toolId,output:t.output}):"runtime.workflow.started"===t.type?e.start(`workflow:${t.workflowId}`,"workflow",t.workflowId,t,r,{workflowId:t.workflowId,adapter:t.adapter}):"runtime.workflow.completed"===t.type?e.complete(`workflow:${t.workflowId}`,t,r,{workflowId:t.workflowId,adapter:t.adapter}):t.type.startsWith("runtime.approval.")||t.type.startsWith("runtime.memory.approval.")?projectSingleSpan(e,t,r,"approval",t.type):t.type.startsWith("runtime.specDriven.phase.")?projectSingleSpan(e,t,r,"spec",function readPhaseName(e,t){return"phaseId"in e&&"string"==typeof e.phaseId?e.phaseId:t}(t,"phase")):t.type.startsWith("runtime.memory.")?projectSingleSpan(e,t,r,"memory",t.type):t.type.startsWith("runtime.quality.")?projectSingleSpan(e,t,r,"quality",t.type):"runtime.artifact.created"===t.type?projectSingleSpan(e,t,r,"artifact",t.artifact.id,{artifact:t.artifact}):"runtime.progress.narration"===t.type?projectSingleSpan(e,t,r,"progress",t.message,{provider:t.provider}):"runtime.adapter.event"===t.type?function projectAdapterSpanEvent(e,t,r){const o=isRecord(t.event)?t.event:void 0,n=readString(o?.phase)??"runtime.adapter.event",a=readTraceType(o?.traceType),i=readString(o?.traceLabel);return"delegation"===a&&i?.endsWith(".start")?e.start(delegationKey(o),"delegation",readString(o?.subagentType)??i,t,r,o):"delegation"===a&&i?.endsWith(".completed")?e.complete(delegationKey(o),t,r,o):"plan"===a&&i?projectSingleSpan(e,t,r,"plan",i,o):"agent.tool.start"===n?e.start(`agent-tool:${readString(o?.toolId)??"unknown"}`,"tool",readString(o?.toolId)??n,t,r,o):"agent.tool.result"===n?e.complete(`agent-tool:${readString(o?.toolId)??"unknown"}`,t,r,o):projectSingleSpan(e,t,r,"adapter",n,o)}(e,t,r):"runtime.inventory.repair"===t.type?projectSingleSpan(e,t,r,"adapter","runtime.inventory.repair",{status:t.status,...t.diagnostic}):"runtime.sandbox.decision"===t.type?projectSingleSpan(e,t,r,"tool",`sandbox:${t.toolId}`,{toolId:t.toolId,...t.decision}):"runtime.tool.failure"===t.type?e.fail(`tool:${t.toolId}`,t,r,{toolId:t.toolId,...t.failure}):"runtime.tool.circuit.opened"===t.type?projectSingleSpan(e,t,r,"tool",`circuit:${t.toolId}`,{toolId:t.toolId,reason:t.reason}):void 0}(t,e,r)),t.closeRoot(),t.spans()}export function projectEvent(e){return"runtime.request.started"===e.type||"runtime.request.completed"===e.type||"runtime.request.failed"===e.type?base(e,"request",e.type):"runtime.request.cancelled"===e.type?base(e,"request",e.type,{reason:e.reason}):"runtime.execution.contract.failed"===e.type?base(e,"request",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):"runtime.inventory.repair"===e.type?base(e,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.tool.direct.started"===e.type?base(e,"tool","runtime.tool.direct.started",{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?base(e,"tool","runtime.tool.direct.completed",{toolId:e.toolId}):"runtime.sandbox.decision"===e.type?base(e,"tool","runtime.sandbox.decision",{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?base(e,"tool","runtime.tool.failure",{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?base(e,"tool","runtime.tool.circuit.opened",{toolId:e.toolId,reason:e.reason}):"runtime.workflow.started"===e.type||"runtime.workflow.completed"===e.type?base(e,"workflow",e.type,{workflowId:e.workflowId,adapter:e.adapter}):function isSpecDrivenPhaseEvent(e){return e.type.startsWith("runtime.specDriven.phase.")}(e)?base(e,"spec",e.type,{phaseId:e.phaseId,..."workflowId"in e&&e.workflowId?{workflowId:e.workflowId}:{},..."reason"in e?{reason:e.reason}:{},..."artifact"in e&&e.artifact?{artifact:e.artifact}:{}}):"runtime.adapter.event"===e.type?function adapterTrace(e){const t=e.event;if(isRecord(t)&&"string"==typeof t.phase){const r=function semanticAdapterTrace(e,t){if("inventory.repair"===t.phase)return base(e,"adapter","runtime.inventory.repair",{status:t.status,...isRecord(t.diagnostic)?t.diagnostic:{}});const r=readTraceType(t.traceType),o=readString(t.traceLabel);return r&&o?base(e,r,o,t):void 0}(e,t);return r||base(e,"adapter",t.phase.startsWith("agent.")?t.phase:`adapter.${t.phase}`,t)}return base(e,"adapter","runtime.adapter.event",{event:t})}(e):"runtime.artifact.created"===e.type?base(e,"artifact","runtime.artifact.created",{artifact:e.artifact}):e.type.startsWith("runtime.memory.")?base(e,"memory",e.type):"runtime.progress.narration"===e.type?base(e,"progress",e.type,{message:e.message,provider:e.provider,sourceEventTypes:e.sourceEventTypes}):void 0}export function readPlanTodos(e){const t=function readPlanRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e),r=function readTodosArray(e){const t=isRecord(e?.args)?e.args:void 0;return Array.isArray(e?.todos)?e.todos:Array.isArray(t?.todos)?t.todos:[]}(t);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(e){if(isRecord(e)&&"string"==typeof e.content)return{content:e.content,status:"string"==typeof e.status?e.status:"pending"}}function isPlanTodoItem(e){return void 0!==e}function base(e,t,r,o){return{type:t,label:r,agentId:e.agentId,requestId:e.requestId,detail:o}}function isTraceEntry(e){return void 0!==e}function projectSingleSpan(e,t,r,o,n,a){return e.event(o,n,t,r,a)}function delegationKey(e){return`delegation:${readString(e?.subagentType)??readString(e?.toolId)??"task"}`}function createSpan(e,t,r,o,n,a,i){const s={spanId:e,parentSpanId:t,requestId:n.requestId,sessionId:n.sessionId,agentId:n.agentId,kind:r,name:o,status:"running",startedAt:n.emittedAt,startEventIndex:a,attributes:i,events:[]};return addEvent(s,n,a),s}function addEvent(e,t,r){e.events.push({index:r,eventId:t.eventId??`${t.requestId}:${r}`,type:t.type,emittedAt:t.emittedAt})}function close(e,t,r){e.status="failed"===e.status||"blocked"===e.status?e.status:"completed",e.completedAt=t.emittedAt,e.endEventIndex=r,e.durationMs=function durationMs(e,t){if(!e||!t)return;const r=Date.parse(t)-Date.parse(e);return Number.isFinite(r)&&r>=0?r:void 0}(e.startedAt,e.completedAt)}function merge(e,t){return t?{...e,...t}:e}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readTraceType(e){const t=readString(e);return"request"===t||"tool"===t||"workflow"===t||"spec"===t||"adapter"===t||"memory"===t||"artifact"===t||"progress"===t||"plan"===t||"delegation"===t?t:void 0}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}
@@ -29,6 +29,7 @@ export type RuntimeAdapterContext = {
29
29
  toolGateway?: RuntimeToolGateway;
30
30
  toolFailureTracker?: RuntimeToolFailureTracker;
31
31
  requestState?: Map<string, unknown>;
32
+ getEvents?: () => RuntimeEvent[];
32
33
  emit: RuntimeEmit;
33
34
  };
34
35
  export type RuntimeMemoryContext = {
@@ -1 +1 @@
1
- import{createServer as t}from"node:http";import{compileWorkflowPlan as e,projectRuntimeTrace as r,renderWorkflowMermaid as o}from"@stable-harness/core";export function createHttpServer(n){return t(async(t,s)=>{try{if("GET"===t.method&&"/health"===t.url)return void sendJson(s,200,{ok:!0});if("GET"===t.method&&"/inspect"===t.url)return void sendJson(s,200,n.inspect());if("GET"===t.method&&"/requests"===t.url)return void sendJson(s,200,n.listRequests());if("GET"===t.method&&"/sessions"===t.url)return void sendJson(s,200,n.listSessions());const a=function readArtifactList(t){if(!t?.startsWith("/artifacts"))return;const e=new URL(t,"http://stable-harness.local");return"/artifacts"===e.pathname?{...e.searchParams.get("requestId")?{requestId:e.searchParams.get("requestId")}:{},...e.searchParams.get("sessionId")?{sessionId:e.searchParams.get("sessionId")}:{},...e.searchParams.get("agentId")?{agentId:e.searchParams.get("agentId")}:{}}:void 0}(t.url);if("GET"===t.method&&a)return void sendJson(s,200,n.listArtifacts(a));const d=function readArtifactContentId(t){const e=(t??"").match(/^\/artifacts\/([^/]+)\/content$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&d){const t=n.getArtifact(d),e=n.readArtifact(d);return void sendJson(s,t&&void 0!==e?200:404,t&&void 0!==e?{artifact:t,content:e}:{error:"artifact_content_not_found"})}const i=function readArtifactId(t){const e=(t??"").match(/^\/artifacts\/([^/]+)$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&i){const t=n.getArtifact(i);return void sendJson(s,t?200:404,t??{error:"artifact_not_found"})}const c=function readApprovalList(t){if(!t?.startsWith("/approvals"))return;const e=new URL(t,"http://stable-harness.local");if("/approvals"!==e.pathname)return;const r=e.searchParams.get("status");return{status:"pending"===r||"approved"===r||"rejected"===r?r:void 0}}(t.url);if("GET"===t.method&&c)return void sendJson(s,200,await n.listApprovals(c.status));const u=function readApprovalDecision(t){const e=(t??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(e?.[1]&&e[2])return{id:decodeURIComponent(e[1]),status:"approve"===e[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&u){const t=await n.resolveApproval(u.id,u.status);return void sendJson(s,t?200:404,t??{error:"approval_not_found"})}if("GET"===t.method&&"/workflows"===t.url)return void sendJson(s,200,n.inspect().workflows);const f=function readWorkflowMermaidId(t){const e=(t??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&f){const t=n.getWorkflow(f);return void sendJson(s,t?200:404,t?{mermaid:o(t)}:{error:"workflow_not_found"})}const l=function readWorkflowPlanId(t){const e=(t??"").match(/^\/workflows\/([^/]+)\/plan$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&l){const t=n.getWorkflow(l);return void sendJson(s,t?200:404,t?e(t):{error:"workflow_not_found"})}const p=function readRequestInspectionId(t){const e=(t??"").match(/^\/requests\/([^/]+)$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&p){const t=n.inspectRequest(p);return void sendJson(s,t?200:404,t??{error:"request_not_found"})}const m=function readTraceRequestId(t){const e=(t??"").match(/^\/runs\/([^/]+)\/trace$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&m){const t=n.getRun(m);return void sendJson(s,t?200:404,t?r(t):{error:"run_not_found"})}const h=function readReplayRequestId(t){const e=(t??"").match(/^\/requests\/([^/]+)\/replay$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&h){const t=n.exportReplayBundle(h);return void sendJson(s,t?200:404,t??{error:"run_not_found"})}if("POST"===t.method&&"/requests"===t.url){const e=await async function readJson(t){const e=[];for await(const r of t)e.push(Buffer.isBuffer(r)?r:Buffer.from(r));return 0===e.length?{}:JSON.parse(Buffer.concat(e).toString("utf8"))}(t);return void sendJson(s,200,await n.request(function readRuntimeRequest(t){const e=function readToolCall(t){if("object"!=typeof t||null===t)return;const e=t;return"string"==typeof e.toolId?{toolId:e.toolId,args:e.args}:void 0}(t.toolCall),r=function readWorkflow(t){const e=readRecord(t);if(e)return{..."string"==typeof e.workflowId?{workflowId:e.workflowId}:{},..."string"==typeof e.routeId?{routeId:e.routeId}:{},...void 0!==e.input?{input:e.input}:{},..."object"==typeof e.metadata&&e.metadata?{metadata:e.metadata}:{}}}(t.workflow),o=function readMemory(t){const e=readRecord(t);if(e)return{..."string"==typeof e.namespace?{namespace:e.namespace}:{},...!1===e.recall||readRecord(e.recall)?{recall:e.recall}:{},...Array.isArray(e.candidates)?{candidates:e.candidates}:{}}}(t.memory),n=readRecord(t.metadata);return{input:"string"==typeof t.input?t.input:"",..."string"==typeof t.agentId?{agentId:t.agentId}:{},..."string"==typeof t.sessionId?{sessionId:t.sessionId}:{},..."string"==typeof t.requestId?{requestId:t.requestId}:{},..."string"==typeof t.parentRunId?{parentRunId:t.parentRunId}:{},...e?{toolCall:e}:{},...r?{workflow:r}:{},...o?{memory:o}:{},...n?{metadata:n}:{}}}(e)))}sendJson(s,404,{error:"not_found"})}catch(t){sendJson(s,500,{error:t instanceof Error?t.message:String(t)})}})}function readRecord(t){return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}function sendJson(t,e,r){t.writeHead(e,{"content-type":"application/json"}),t.end(JSON.stringify(r))}
1
+ import{createServer as t}from"node:http";import{compileWorkflowPlan as e,projectRuntimeTrace as r,projectRuntimeTraceSpans as o,renderWorkflowMermaid as n}from"@stable-harness/core";export function createHttpServer(s){return t(async(t,a)=>{try{if("GET"===t.method&&"/health"===t.url)return void sendJson(a,200,{ok:!0});if("GET"===t.method&&"/inspect"===t.url)return void sendJson(a,200,s.inspect());if("GET"===t.method&&"/requests"===t.url)return void sendJson(a,200,s.listRequests());if("GET"===t.method&&"/sessions"===t.url)return void sendJson(a,200,s.listSessions());const d=function readArtifactList(t){if(!t?.startsWith("/artifacts"))return;const e=new URL(t,"http://stable-harness.local");return"/artifacts"===e.pathname?{...e.searchParams.get("requestId")?{requestId:e.searchParams.get("requestId")}:{},...e.searchParams.get("sessionId")?{sessionId:e.searchParams.get("sessionId")}:{},...e.searchParams.get("agentId")?{agentId:e.searchParams.get("agentId")}:{}}:void 0}(t.url);if("GET"===t.method&&d)return void sendJson(a,200,s.listArtifacts(d));const i=function readArtifactContentId(t){const e=(t??"").match(/^\/artifacts\/([^/]+)\/content$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&i){const t=s.getArtifact(i),e=s.readArtifact(i);return void sendJson(a,t&&void 0!==e?200:404,t&&void 0!==e?{artifact:t,content:e}:{error:"artifact_content_not_found"})}const u=function readArtifactId(t){const e=(t??"").match(/^\/artifacts\/([^/]+)$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&u){const t=s.getArtifact(u);return void sendJson(a,t?200:404,t??{error:"artifact_not_found"})}const c=function readApprovalList(t){if(!t?.startsWith("/approvals"))return;const e=new URL(t,"http://stable-harness.local");if("/approvals"!==e.pathname)return;const r=e.searchParams.get("status");return{status:"pending"===r||"approved"===r||"rejected"===r?r:void 0}}(t.url);if("GET"===t.method&&c)return void sendJson(a,200,await s.listApprovals(c.status));const f=function readApprovalDecision(t){const e=(t??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(e?.[1]&&e[2])return{id:decodeURIComponent(e[1]),status:"approve"===e[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&f){const t=await s.resolveApproval(f.id,f.status);return void sendJson(a,t?200:404,t??{error:"approval_not_found"})}if("GET"===t.method&&"/workflows"===t.url)return void sendJson(a,200,s.inspect().workflows);const l=function readWorkflowMermaidId(t){const e=(t??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&l){const t=s.getWorkflow(l);return void sendJson(a,t?200:404,t?{mermaid:n(t)}:{error:"workflow_not_found"})}const p=function readWorkflowPlanId(t){const e=(t??"").match(/^\/workflows\/([^/]+)\/plan$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&p){const t=s.getWorkflow(p);return void sendJson(a,t?200:404,t?e(t):{error:"workflow_not_found"})}const m=function readRequestInspectionId(t){const e=(t??"").match(/^\/requests\/([^/]+)$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&m){const t=s.inspectRequest(m);return void sendJson(a,t?200:404,t??{error:"request_not_found"})}const h=function readTraceRequestId(t){const e=(t??"").match(/^\/runs\/([^/]+)\/trace$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&h){const t=s.getRun(h);return void sendJson(a,t?200:404,t?r(t):{error:"run_not_found"})}const I=function readSpanRequestId(t){const e=(t??"").match(/^\/runs\/([^/]+)\/spans$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&I){const t=s.getRun(I);return void sendJson(a,t?200:404,t?o(t):{error:"run_not_found"})}const v=function readReplayRequestId(t){const e=(t??"").match(/^\/requests\/([^/]+)\/replay$/u);return e?.[1]?decodeURIComponent(e[1]):void 0}(t.url);if("GET"===t.method&&v){const t=s.exportReplayBundle(v);return void sendJson(a,t?200:404,t??{error:"run_not_found"})}if("POST"===t.method&&"/requests"===t.url){const e=await async function readJson(t){const e=[];for await(const r of t)e.push(Buffer.isBuffer(r)?r:Buffer.from(r));return 0===e.length?{}:JSON.parse(Buffer.concat(e).toString("utf8"))}(t);return void sendJson(a,200,await s.request(function readRuntimeRequest(t){const e=function readToolCall(t){if("object"!=typeof t||null===t)return;const e=t;return"string"==typeof e.toolId?{toolId:e.toolId,args:e.args}:void 0}(t.toolCall),r=function readWorkflow(t){const e=readRecord(t);if(e)return{..."string"==typeof e.workflowId?{workflowId:e.workflowId}:{},..."string"==typeof e.routeId?{routeId:e.routeId}:{},...void 0!==e.input?{input:e.input}:{},..."object"==typeof e.metadata&&e.metadata?{metadata:e.metadata}:{}}}(t.workflow),o=function readMemory(t){const e=readRecord(t);if(e)return{..."string"==typeof e.namespace?{namespace:e.namespace}:{},...!1===e.recall||readRecord(e.recall)?{recall:e.recall}:{},...Array.isArray(e.candidates)?{candidates:e.candidates}:{}}}(t.memory),n=readRecord(t.metadata);return{input:"string"==typeof t.input?t.input:"",..."string"==typeof t.agentId?{agentId:t.agentId}:{},..."string"==typeof t.sessionId?{sessionId:t.sessionId}:{},..."string"==typeof t.requestId?{requestId:t.requestId}:{},..."string"==typeof t.parentRunId?{parentRunId:t.parentRunId}:{},...e?{toolCall:e}:{},...r?{workflow:r}:{},...o?{memory:o}:{},...n?{metadata:n}:{}}}(e)))}sendJson(a,404,{error:"not_found"})}catch(t){sendJson(a,500,{error:t instanceof Error?t.message:String(t)})}})}function readRecord(t){return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}function sendJson(t,e,r){t.writeHead(e,{"content-type":"application/json"}),t.end(JSON.stringify(r))}