@xenosystem/agent-sdk 0.9.10 → 0.9.11

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 (87) hide show
  1. package/dist/agents/index.cjs +9 -9
  2. package/dist/agents/index.d.cts +12 -2
  3. package/dist/agents/index.d.ts +12 -2
  4. package/dist/agents/index.js +16 -16
  5. package/dist/agents/metafile-cjs.json +1 -1
  6. package/dist/agents/metafile-esm.json +1 -1
  7. package/dist/artifacts/browser.cjs +1 -1
  8. package/dist/artifacts/browser.d.cts +2 -2
  9. package/dist/artifacts/browser.d.ts +2 -2
  10. package/dist/artifacts/browser.js +1 -1
  11. package/dist/artifacts/{diff-artifact-C2tQZWcs.d.cts → diff-artifact-CmhmeSu5.d.cts} +87 -7
  12. package/dist/artifacts/{diff-artifact-C2tQZWcs.d.ts → diff-artifact-CmhmeSu5.d.ts} +87 -7
  13. package/dist/artifacts/index.cjs +8 -8
  14. package/dist/artifacts/index.d.cts +22 -5
  15. package/dist/artifacts/index.d.ts +22 -5
  16. package/dist/artifacts/index.js +8 -8
  17. package/dist/artifacts/metafile-cjs.json +1 -1
  18. package/dist/artifacts/metafile-esm.json +1 -1
  19. package/dist/automation/index.cjs +2 -2
  20. package/dist/automation/index.d.cts +97 -7
  21. package/dist/automation/index.d.ts +97 -7
  22. package/dist/automation/index.js +2 -2
  23. package/dist/automation/metafile-cjs.json +1 -1
  24. package/dist/automation/metafile-esm.json +1 -1
  25. package/dist/control-plane/index.cjs +7 -7
  26. package/dist/control-plane/index.d.cts +19 -2
  27. package/dist/control-plane/index.d.ts +19 -2
  28. package/dist/control-plane/index.js +7 -7
  29. package/dist/control-plane/metafile-cjs.json +1 -1
  30. package/dist/control-plane/metafile-esm.json +1 -1
  31. package/dist/electron/index.cjs +142 -142
  32. package/dist/electron/index.d.cts +24 -4
  33. package/dist/electron/index.d.ts +24 -4
  34. package/dist/electron/index.js +140 -140
  35. package/dist/electron/metafile-cjs.json +1 -1
  36. package/dist/electron/metafile-esm.json +1 -1
  37. package/dist/hooks/index.d.cts +10 -1
  38. package/dist/hooks/index.d.ts +10 -1
  39. package/dist/hosted/index.cjs +1 -1
  40. package/dist/hosted/index.js +1 -1
  41. package/dist/hosted/metafile-cjs.json +1 -1
  42. package/dist/hosted/metafile-esm.json +1 -1
  43. package/dist/index.cjs +327 -327
  44. package/dist/index.d.cts +192 -24
  45. package/dist/index.d.ts +192 -24
  46. package/dist/index.js +328 -328
  47. package/dist/mcp/index.cjs +17 -17
  48. package/dist/mcp/index.js +17 -17
  49. package/dist/mcp/metafile-cjs.json +1 -1
  50. package/dist/mcp/metafile-esm.json +1 -1
  51. package/dist/metafile-cjs.json +1 -1
  52. package/dist/metafile-esm.json +1 -1
  53. package/dist/oracle/index.cjs +1 -1
  54. package/dist/oracle/index.d.cts +86 -6
  55. package/dist/oracle/index.d.ts +86 -6
  56. package/dist/oracle/index.js +1 -1
  57. package/dist/oracle/metafile-cjs.json +1 -1
  58. package/dist/oracle/metafile-esm.json +1 -1
  59. package/dist/providers/index.cjs +10 -10
  60. package/dist/providers/index.d.cts +1 -0
  61. package/dist/providers/index.d.ts +1 -0
  62. package/dist/providers/index.js +10 -10
  63. package/dist/providers/metafile-cjs.json +1 -1
  64. package/dist/providers/metafile-esm.json +1 -1
  65. package/dist/recipes/index.cjs +2 -2
  66. package/dist/recipes/index.d.cts +10 -1
  67. package/dist/recipes/index.d.ts +10 -1
  68. package/dist/recipes/index.js +2 -2
  69. package/dist/recipes/metafile-cjs.json +1 -1
  70. package/dist/recipes/metafile-esm.json +1 -1
  71. package/dist/research/index.cjs +3 -3
  72. package/dist/research/index.d.cts +86 -6
  73. package/dist/research/index.d.ts +86 -6
  74. package/dist/research/index.js +3 -3
  75. package/dist/research/metafile-cjs.json +1 -1
  76. package/dist/research/metafile-esm.json +1 -1
  77. package/dist/session/index.cjs +20 -20
  78. package/dist/session/index.js +21 -21
  79. package/dist/session/metafile-cjs.json +1 -1
  80. package/dist/session/metafile-esm.json +1 -1
  81. package/dist/utils/index.cjs +20 -20
  82. package/dist/utils/index.d.cts +3 -1
  83. package/dist/utils/index.d.ts +3 -1
  84. package/dist/utils/index.js +17 -17
  85. package/dist/utils/metafile-cjs.json +1 -1
  86. package/dist/utils/metafile-esm.json +1 -1
  87. package/package.json +23 -22
@@ -1 +1 @@
1
- {"inputs":{"src/config/models.ts":{"bytes":14032,"imports":[],"format":"esm"},"src/core/llm-provider.ts":{"bytes":12540,"imports":[],"format":"esm"},"src/providers/DualLLMProvider.ts":{"bytes":19754,"imports":[{"path":"src/config/models.ts","kind":"import-statement","original":"../config/models.js"},{"path":"src/core/llm-provider.ts","kind":"import-statement","original":"../core/llm-provider.js"}],"format":"esm"},"src/utils/tool-result-content.ts":{"bytes":4887,"imports":[],"format":"esm"},"src/observability/telemetry.ts":{"bytes":7495,"imports":[{"path":"node:perf_hooks","kind":"import-statement","external":true}],"format":"esm"},"src/observability/index.ts":{"bytes":33,"imports":[{"path":"src/observability/telemetry.ts","kind":"import-statement","original":"./telemetry.js"}],"format":"esm"},"src/providers/provider-errors.ts":{"bytes":6785,"imports":[{"path":"src/observability/index.ts","kind":"import-statement","original":"../observability/index.js"}],"format":"esm"},"src/providers/endpoint-policy.ts":{"bytes":5679,"imports":[{"path":"node:dns/promises","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"}],"format":"esm"},"src/providers/bounded-provider-transport.ts":{"bytes":11504,"imports":[{"path":"node:perf_hooks","kind":"import-statement","external":true},{"path":"src/observability/index.ts","kind":"import-statement","original":"../observability/index.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"}],"format":"esm"},"src/utils/json-schema.ts":{"bytes":44449,"imports":[{"path":"node:net","kind":"import-statement","external":true}],"format":"esm"},"src/providers/tool-schema-projection.ts":{"bytes":12530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/utils/json-schema.ts","kind":"import-statement","original":"../utils/json-schema.js"}],"format":"esm"},"src/providers/direct-provider.ts":{"bytes":43193,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/utils/tool-result-content.ts","kind":"import-statement","original":"../utils/tool-result-content.js"},{"path":"src/providers/bounded-provider-transport.ts","kind":"import-statement","original":"./bounded-provider-transport.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"},{"path":"src/providers/tool-schema-projection.ts","kind":"import-statement","original":"./tool-schema-projection.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/providers/catalog.ts":{"bytes":22681,"imports":[{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/providers/file-connection-store.ts":{"bytes":8464,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/providers/catalog.ts","kind":"import-statement","original":"./catalog.js"}],"format":"esm"},"src/providers/index.ts":{"bytes":1557,"imports":[{"path":"src/providers/DualLLMProvider.ts","kind":"import-statement","original":"./DualLLMProvider.js"},{"path":"src/providers/direct-provider.ts","kind":"import-statement","original":"./direct-provider.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/tool-schema-projection.ts","kind":"import-statement","original":"./tool-schema-projection.js"},{"path":"src/providers/catalog.ts","kind":"import-statement","original":"./catalog.js"},{"path":"src/providers/file-connection-store.ts","kind":"import-statement","original":"./file-connection-store.js"}],"format":"esm"}},"outputs":{"dist/providers/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:perf_hooks","kind":"import-statement","external":true},{"path":"node:dns/promises","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["BUILT_IN_XENO_PROVIDER_PRESETS","DualLLMProvider","FileXenoProviderConnectionStore","ProviderError","ToolSchemaProjectionError","XENO_PROVIDER_CATALOG_SCHEMA_VERSION","XENO_PROVIDER_CONNECTION_STORE_SCHEMA_VERSION","XenoProviderCatalog","assertDirectEndpointResolution","classifyProviderHttpError","createDirectProvider","directProviderConfigFromConnection","parseRetryAfter","probeXenoProvider","projectToolDefinitionsForProvider","projectToolSchemaForProvider","providerCapabilityError","providerProtocolError","selectXenoProviderRoute","validateDirectEndpoint"],"entryPoint":"src/providers/index.ts","inputs":{"src/config/models.ts":{"bytesInOutput":50},"src/core/llm-provider.ts":{"bytesInOutput":1072},"src/providers/DualLLMProvider.ts":{"bytesInOutput":5733},"src/providers/index.ts":{"bytesInOutput":0},"src/providers/direct-provider.ts":{"bytesInOutput":21409},"src/utils/tool-result-content.ts":{"bytesInOutput":435},"src/providers/bounded-provider-transport.ts":{"bytesInOutput":5090},"src/observability/telemetry.ts":{"bytesInOutput":1599},"src/observability/index.ts":{"bytesInOutput":0},"src/providers/endpoint-policy.ts":{"bytesInOutput":2943},"src/providers/provider-errors.ts":{"bytesInOutput":3038},"src/providers/tool-schema-projection.ts":{"bytesInOutput":5702},"src/utils/json-schema.ts":{"bytesInOutput":19764},"src/utils/text-security.ts":{"bytesInOutput":180},"src/providers/catalog.ts":{"bytesInOutput":10865},"src/providers/file-connection-store.ts":{"bytesInOutput":3786},"src/artifacts/hash.ts":{"bytesInOutput":564},"src/control-plane/lock.ts":{"bytesInOutput":1054}},"bytes":83931}}}
1
+ {"inputs":{"src/config/models.ts":{"bytes":16456,"imports":[],"format":"esm"},"src/core/llm-provider.ts":{"bytes":13178,"imports":[],"format":"esm"},"src/providers/DualLLMProvider.ts":{"bytes":19754,"imports":[{"path":"src/config/models.ts","kind":"import-statement","original":"../config/models.js"},{"path":"src/core/llm-provider.ts","kind":"import-statement","original":"../core/llm-provider.js"}],"format":"esm"},"src/utils/tool-result-content.ts":{"bytes":4887,"imports":[],"format":"esm"},"src/observability/telemetry.ts":{"bytes":7495,"imports":[{"path":"node:perf_hooks","kind":"import-statement","external":true}],"format":"esm"},"src/observability/index.ts":{"bytes":33,"imports":[{"path":"src/observability/telemetry.ts","kind":"import-statement","original":"./telemetry.js"}],"format":"esm"},"src/utils/context-overflow-phrases.ts":{"bytes":2266,"imports":[],"format":"esm"},"src/providers/provider-errors.ts":{"bytes":6802,"imports":[{"path":"src/observability/index.ts","kind":"import-statement","original":"../observability/index.js"},{"path":"src/utils/context-overflow-phrases.ts","kind":"import-statement","original":"../utils/context-overflow-phrases.js"}],"format":"esm"},"src/providers/endpoint-policy.ts":{"bytes":5679,"imports":[{"path":"node:dns/promises","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"}],"format":"esm"},"src/providers/bounded-provider-transport.ts":{"bytes":11504,"imports":[{"path":"node:perf_hooks","kind":"import-statement","external":true},{"path":"src/observability/index.ts","kind":"import-statement","original":"../observability/index.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"}],"format":"esm"},"src/utils/json-schema.ts":{"bytes":44449,"imports":[{"path":"node:net","kind":"import-statement","external":true}],"format":"esm"},"src/providers/tool-schema-projection.ts":{"bytes":12530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/utils/json-schema.ts","kind":"import-statement","original":"../utils/json-schema.js"}],"format":"esm"},"src/providers/direct-provider.ts":{"bytes":48475,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/utils/tool-result-content.ts","kind":"import-statement","original":"../utils/tool-result-content.js"},{"path":"src/providers/bounded-provider-transport.ts","kind":"import-statement","original":"./bounded-provider-transport.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"},{"path":"src/providers/tool-schema-projection.ts","kind":"import-statement","original":"./tool-schema-projection.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/providers/catalog.ts":{"bytes":22681,"imports":[{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/providers/file-connection-store.ts":{"bytes":8464,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/providers/catalog.ts","kind":"import-statement","original":"./catalog.js"}],"format":"esm"},"src/providers/index.ts":{"bytes":1557,"imports":[{"path":"src/providers/DualLLMProvider.ts","kind":"import-statement","original":"./DualLLMProvider.js"},{"path":"src/providers/direct-provider.ts","kind":"import-statement","original":"./direct-provider.js"},{"path":"src/providers/provider-errors.ts","kind":"import-statement","original":"./provider-errors.js"},{"path":"src/providers/endpoint-policy.ts","kind":"import-statement","original":"./endpoint-policy.js"},{"path":"src/providers/tool-schema-projection.ts","kind":"import-statement","original":"./tool-schema-projection.js"},{"path":"src/providers/catalog.ts","kind":"import-statement","original":"./catalog.js"},{"path":"src/providers/file-connection-store.ts","kind":"import-statement","original":"./file-connection-store.js"}],"format":"esm"}},"outputs":{"dist/providers/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:perf_hooks","kind":"import-statement","external":true},{"path":"node:dns/promises","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:net","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["BUILT_IN_XENO_PROVIDER_PRESETS","DualLLMProvider","FileXenoProviderConnectionStore","ProviderError","ToolSchemaProjectionError","XENO_PROVIDER_CATALOG_SCHEMA_VERSION","XENO_PROVIDER_CONNECTION_STORE_SCHEMA_VERSION","XenoProviderCatalog","assertDirectEndpointResolution","classifyProviderHttpError","createDirectProvider","directProviderConfigFromConnection","parseRetryAfter","probeXenoProvider","projectToolDefinitionsForProvider","projectToolSchemaForProvider","providerCapabilityError","providerProtocolError","selectXenoProviderRoute","validateDirectEndpoint"],"entryPoint":"src/providers/index.ts","inputs":{"src/config/models.ts":{"bytesInOutput":50},"src/core/llm-provider.ts":{"bytesInOutput":1142},"src/providers/DualLLMProvider.ts":{"bytesInOutput":5733},"src/providers/index.ts":{"bytesInOutput":0},"src/providers/direct-provider.ts":{"bytesInOutput":21863},"src/utils/tool-result-content.ts":{"bytesInOutput":435},"src/providers/bounded-provider-transport.ts":{"bytesInOutput":5090},"src/observability/telemetry.ts":{"bytesInOutput":1599},"src/observability/index.ts":{"bytesInOutput":0},"src/providers/endpoint-policy.ts":{"bytesInOutput":2943},"src/utils/context-overflow-phrases.ts":{"bytesInOutput":169},"src/providers/provider-errors.ts":{"bytesInOutput":2966},"src/providers/tool-schema-projection.ts":{"bytesInOutput":5702},"src/utils/json-schema.ts":{"bytesInOutput":19769},"src/utils/text-security.ts":{"bytesInOutput":180},"src/providers/catalog.ts":{"bytesInOutput":10865},"src/providers/file-connection-store.ts":{"bytesInOutput":3786},"src/artifacts/hash.ts":{"bytesInOutput":564},"src/control-plane/lock.ts":{"bytesInOutput":1054}},"bytes":84557}}}
@@ -1,2 +1,2 @@
1
- "use strict";var I=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var i in t)I(e,i,{get:t[i],enumerable:!0})},$=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of x(t))!T.call(e,o)&&o!==i&&I(e,o,{get:()=>t[o],enumerable:!(r=k(t,o))||r.enumerable});return e};var N=e=>$(I({},"__esModule",{value:!0}),e);var Y={};C(Y,{XENO_RECIPE_SCHEMA_VERSION:()=>S,XenoRecipeValidationError:()=>d,assertValidXenoRecipeDefinition:()=>y,compileXenoRecipe:()=>O,parseXenoRecipeDefinition:()=>D,serializeXenoRecipe:()=>F,xenoRecipeFingerprint:()=>_});module.exports=N(Y);var b=require("node:crypto");function m(e){return{algorithm:"sha256",value:(0,b.createHash)("sha256").update(e).digest("hex")}}function p(e){return JSON.stringify(w(e,new Set))}function h(e){return m(p(e))}function w(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(o=>w(o,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((o,a)=>o.localeCompare(a))){let o=e[r];if(o===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=w(o,t)}return t.delete(e),i}var P="[\\u0000-\\u001f\\u007f]",re=new RegExp(P);var Se=64*1024*1024;var Ce=16*1024*1024;function X(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var S="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function D(e){let t=l(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=l(t.authority,"authority",["permissionMode","externalActions","network"]),r=l(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),o={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:g(t.version,"version"),modes:u(t.modes,"modes").map(a=>a),inputs:u(t.inputs,"inputs").map((a,n)=>L(a,n)),requiredSecretRefs:u(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:g(r.maxAgents,"budget.maxAgents"),maxConcurrency:g(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:g(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:g(r.timeoutMs,"budget.timeoutMs")},steps:u(t.steps,"steps").map((a,n)=>M(a,n)),...t.provenance!==void 0?{provenance:H(t.provenance)}:{}};return y(o),o}function y(e){let t=[];e?.schemaVersion!==S&&t.push("schemaVersion must be xeno.recipe.v1"),A(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);Z(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),q(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(G(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let s of n.enum??[])f(s,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let o=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),o.has(n)&&t.push(`duplicate secret ref ${n}`),o.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){A(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&A(n.agentProfile,`step ${n.id} agentProfile`,t);for(let s of n?.dependsOn??[])A(s,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let s of n?.expectedArtifacts??[])K(s,`step ${n.id} expected artifact`,t);for(let s of U(n?.prompt??""))r.has(s)||t.push(`step ${n.id} references unknown input ${s}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let s of n.dependsOn??[])a.has(s)||t.push(`step ${n.id} depends on unknown step ${s}`),s===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(j(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function O(e,t){if(y(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(s=>[s.name,s])),o=Object.keys(i).filter(s=>!r.has(s));if(o.length>0)throw new d(o.map(s=>`unknown recipe input ${s}`));let a={};for(let s of e.inputs){let E=i[s.name]??s.default;if(E===void 0){if(s.required)throw new d([`required recipe input ${s.name} is missing`]);a[s.name]="";continue}a[s.name]=B(s,E)}let n=e.requiredSecretRefs.filter(s=>t.hasSecretRef&&!t.hasSecretRef(s));if(n.length>0)throw new d(n.map(s=>`required secret reference is unavailable: ${s}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:_(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:J(e.steps).map(s=>({...structuredClone(s),prompt:z(s.prompt,a)}))}}function _(e){return y(e),{algorithm:"sha256",value:h(e).value}}function F(e){return y(e),`${p(e)}
2
- `}function L(e,t){let i=l(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:W(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:u(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function M(e,t){let i=l(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:l(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:u(i.dependsOn,"dependsOn").map(o=>c(o,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:u(i.expectedArtifacts,"expectedArtifacts").map(o=>c(o,"expected artifact"))}:{}}}function H(e){let t=l(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function q(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function j(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,o=new Set,a=n=>{if(!(o.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let s of i.get(n)?.dependsOn??[])a(s);r.delete(n),o.add(n)}};for(let n of e)a(n.id)}function J(e){let t=new Map(e.map(o=>[o.id,o])),i=new Map(e.map((o,a)=>[o.id,{step:o,index:a,dependencies:new Set(o.dependsOn??[])}])),r=[];for(;i.size>0;){let o=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(o.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of o)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function B(e,t){let i=t.trim();if(i.length>32e3||X(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function z(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function U(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function l(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,o=Object.keys(r).filter(a=>!i.includes(a));if(o.length>0)throw new d(o.map(a=>`${t} contains unsupported field ${a}`));return r}function u(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function W(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function g(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function A(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function G(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||X(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function K(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function Z(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}0&&(module.exports={XENO_RECIPE_SCHEMA_VERSION,XenoRecipeValidationError,assertValidXenoRecipeDefinition,compileXenoRecipe,parseXenoRecipeDefinition,serializeXenoRecipe,xenoRecipeFingerprint});
1
+ "use strict";var R=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var i in t)R(e,i,{get:t[i],enumerable:!0})},L=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of D(t))!O.call(e,o)&&o!==i&&R(e,o,{get:()=>t[o],enumerable:!(r=V(t,o))||r.enumerable});return e};var M=e=>L(R({},"__esModule",{value:!0}),e);var oe={};F(oe,{XENO_RECIPE_SCHEMA_VERSION:()=>$,XenoRecipeValidationError:()=>d,assertValidXenoRecipeDefinition:()=>y,compileXenoRecipe:()=>J,parseXenoRecipeDefinition:()=>j,serializeXenoRecipe:()=>B,xenoRecipeFingerprint:()=>P});module.exports=M(oe);var _=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],k=["draft","pending_review","approved","rejected","superseded","archived"],x=["public","internal","confidential","restricted"],T=["agent","tool","user","system","integration"],A=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],I=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var C=require("node:crypto");function m(e){return{algorithm:"sha256",value:(0,C.createHash)("sha256").update(e).digest("hex")}}function p(e){return JSON.stringify(E(e,new Set))}function h(e){return m(p(e))}function E(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(o=>E(o,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((o,a)=>o.localeCompare(a))){let o=e[r];if(o===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=E(o,t)}return t.delete(e),i}var H="[\\u0000-\\u001f\\u007f]",me=new RegExp(H);var he=new Set(k),ve=new Set(x),ge=new Set(T),ye=new Set(_),Ae=new Set(A),Ie=new Set(I);var Se=new Set(A),_e=new Set(I);var ze=64*1024*1024;var Ze=16*1024*1024;function b(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var $="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function j(e){let t=l(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=l(t.authority,"authority",["permissionMode","externalActions","network"]),r=l(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),o={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:g(t.version,"version"),modes:u(t.modes,"modes").map(a=>a),inputs:u(t.inputs,"inputs").map((a,n)=>z(a,n)),requiredSecretRefs:u(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:g(r.maxAgents,"budget.maxAgents"),maxConcurrency:g(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:g(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:g(r.timeoutMs,"budget.timeoutMs")},steps:u(t.steps,"steps").map((a,n)=>U(a,n)),...t.provenance!==void 0?{provenance:W(t.provenance)}:{}};return y(o),o}function y(e){let t=[];e?.schemaVersion!==$&&t.push("schemaVersion must be xeno.recipe.v1"),w(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);re(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),K(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(ne(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let s of n.enum??[])f(s,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let o=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),o.has(n)&&t.push(`duplicate secret ref ${n}`),o.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){w(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&w(n.agentProfile,`step ${n.id} agentProfile`,t);for(let s of n?.dependsOn??[])w(s,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let s of n?.expectedArtifacts??[])ie(s,`step ${n.id} expected artifact`,t);for(let s of ee(n?.prompt??""))r.has(s)||t.push(`step ${n.id} references unknown input ${s}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let s of n.dependsOn??[])a.has(s)||t.push(`step ${n.id} depends on unknown step ${s}`),s===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(G(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function J(e,t){if(y(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(s=>[s.name,s])),o=Object.keys(i).filter(s=>!r.has(s));if(o.length>0)throw new d(o.map(s=>`unknown recipe input ${s}`));let a={};for(let s of e.inputs){let S=i[s.name]??s.default;if(S===void 0){if(s.required)throw new d([`required recipe input ${s.name} is missing`]);a[s.name]="";continue}a[s.name]=Y(s,S)}let n=e.requiredSecretRefs.filter(s=>t.hasSecretRef&&!t.hasSecretRef(s));if(n.length>0)throw new d(n.map(s=>`required secret reference is unavailable: ${s}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:P(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:Z(e.steps).map(s=>({...structuredClone(s),prompt:Q(s.prompt,a)}))}}function P(e){return y(e),{algorithm:"sha256",value:h(e).value}}function B(e){return y(e),`${p(e)}
2
+ `}function z(e,t){let i=l(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:te(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:u(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function U(e,t){let i=l(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:l(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:u(i.dependsOn,"dependsOn").map(o=>c(o,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:u(i.expectedArtifacts,"expectedArtifacts").map(o=>c(o,"expected artifact"))}:{}}}function W(e){let t=l(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function K(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function G(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,o=new Set,a=n=>{if(!(o.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let s of i.get(n)?.dependsOn??[])a(s);r.delete(n),o.add(n)}};for(let n of e)a(n.id)}function Z(e){let t=new Map(e.map(o=>[o.id,o])),i=new Map(e.map((o,a)=>[o.id,{step:o,index:a,dependencies:new Set(o.dependsOn??[])}])),r=[];for(;i.size>0;){let o=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(o.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of o)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function Y(e,t){let i=t.trim();if(i.length>32e3||b(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function Q(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function ee(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function l(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,o=Object.keys(r).filter(a=>!i.includes(a));if(o.length>0)throw new d(o.map(a=>`${t} contains unsupported field ${a}`));return r}function u(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function te(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function g(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function w(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function ne(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||b(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function ie(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function re(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}0&&(module.exports={XENO_RECIPE_SCHEMA_VERSION,XenoRecipeValidationError,assertValidXenoRecipeDefinition,compileXenoRecipe,parseXenoRecipeDefinition,serializeXenoRecipe,xenoRecipeFingerprint});
@@ -1,6 +1,15 @@
1
+ declare const AGENT_PERMISSION_MODES: readonly [
2
+ "default",
3
+ "plan",
4
+ "acceptEdits",
5
+ "auto",
6
+ "dontAsk",
7
+ "bypassPermissions"
8
+ ];
9
+ type AgentPermissionMode = (typeof AGENT_PERMISSION_MODES)[number];
1
10
  declare const XENO_RECIPE_SCHEMA_VERSION: "xeno.recipe.v1";
2
11
  type XenoRecipeMode = "interactive" | "headless" | "ci";
3
- type XenoRecipePermissionMode = "default" | "plan" | "acceptEdits" | "auto" | "dontAsk";
12
+ type XenoRecipePermissionMode = Extract<AgentPermissionMode, "default" | "plan" | "acceptEdits" | "auto" | "dontAsk">;
4
13
  interface XenoRecipeInputDefinition {
5
14
  name: string;
6
15
  description: string;
@@ -1,6 +1,15 @@
1
+ declare const AGENT_PERMISSION_MODES: readonly [
2
+ "default",
3
+ "plan",
4
+ "acceptEdits",
5
+ "auto",
6
+ "dontAsk",
7
+ "bypassPermissions"
8
+ ];
9
+ type AgentPermissionMode = (typeof AGENT_PERMISSION_MODES)[number];
1
10
  declare const XENO_RECIPE_SCHEMA_VERSION: "xeno.recipe.v1";
2
11
  type XenoRecipeMode = "interactive" | "headless" | "ci";
3
- type XenoRecipePermissionMode = "default" | "plan" | "acceptEdits" | "auto" | "dontAsk";
12
+ type XenoRecipePermissionMode = Extract<AgentPermissionMode, "default" | "plan" | "acceptEdits" | "auto" | "dontAsk">;
4
13
  interface XenoRecipeInputDefinition {
5
14
  name: string;
6
15
  description: string;
@@ -1,2 +1,2 @@
1
- import{createHash as E}from"node:crypto";function m(e){return{algorithm:"sha256",value:E("sha256").update(e).digest("hex")}}function p(e){return JSON.stringify(I(e,new Set))}function h(e){return m(p(e))}function I(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(s=>I(s,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((s,a)=>s.localeCompare(a))){let s=e[r];if(s===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=I(s,t)}return t.delete(e),i}var b="[\\u0000-\\u001f\\u007f]",U=new RegExp(b);var he=64*1024*1024;var Ie=16*1024*1024;function R(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var _="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function nt(e){let t=l(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=l(t.authority,"authority",["permissionMode","externalActions","network"]),r=l(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),s={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:g(t.version,"version"),modes:u(t.modes,"modes").map(a=>a),inputs:u(t.inputs,"inputs").map((a,n)=>x(a,n)),requiredSecretRefs:u(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:g(r.maxAgents,"budget.maxAgents"),maxConcurrency:g(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:g(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:g(r.timeoutMs,"budget.timeoutMs")},steps:u(t.steps,"steps").map((a,n)=>T(a,n)),...t.provenance!==void 0?{provenance:C(t.provenance)}:{}};return A(s),s}function A(e){let t=[];e?.schemaVersion!==_&&t.push("schemaVersion must be xeno.recipe.v1"),y(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);H(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),$(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(L(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let o of n.enum??[])f(o,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let s=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),s.has(n)&&t.push(`duplicate secret ref ${n}`),s.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){y(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&y(n.agentProfile,`step ${n.id} agentProfile`,t);for(let o of n?.dependsOn??[])y(o,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let o of n?.expectedArtifacts??[])M(o,`step ${n.id} expected artifact`,t);for(let o of O(n?.prompt??""))r.has(o)||t.push(`step ${n.id} references unknown input ${o}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let o of n.dependsOn??[])a.has(o)||t.push(`step ${n.id} depends on unknown step ${o}`),o===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(N(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function it(e,t){if(A(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(o=>[o.name,o])),s=Object.keys(i).filter(o=>!r.has(o));if(s.length>0)throw new d(s.map(o=>`unknown recipe input ${o}`));let a={};for(let o of e.inputs){let X=i[o.name]??o.default;if(X===void 0){if(o.required)throw new d([`required recipe input ${o.name} is missing`]);a[o.name]="";continue}a[o.name]=V(o,X)}let n=e.requiredSecretRefs.filter(o=>t.hasSecretRef&&!t.hasSecretRef(o));if(n.length>0)throw new d(n.map(o=>`required secret reference is unavailable: ${o}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:k(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:P(e.steps).map(o=>({...structuredClone(o),prompt:D(o.prompt,a)}))}}function k(e){return A(e),{algorithm:"sha256",value:h(e).value}}function rt(e){return A(e),`${p(e)}
2
- `}function x(e,t){let i=l(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:F(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:u(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function T(e,t){let i=l(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:l(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:u(i.dependsOn,"dependsOn").map(s=>c(s,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:u(i.expectedArtifacts,"expectedArtifacts").map(s=>c(s,"expected artifact"))}:{}}}function C(e){let t=l(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function $(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function N(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,s=new Set,a=n=>{if(!(s.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let o of i.get(n)?.dependsOn??[])a(o);r.delete(n),s.add(n)}};for(let n of e)a(n.id)}function P(e){let t=new Map(e.map(s=>[s.id,s])),i=new Map(e.map((s,a)=>[s.id,{step:s,index:a,dependencies:new Set(s.dependsOn??[])}])),r=[];for(;i.size>0;){let s=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(s.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of s)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function V(e,t){let i=t.trim();if(i.length>32e3||R(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function D(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function O(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function l(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,s=Object.keys(r).filter(a=>!i.includes(a));if(s.length>0)throw new d(s.map(a=>`${t} contains unsupported field ${a}`));return r}function u(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function F(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function g(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function y(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function L(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||R(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function M(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function H(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}export{_ as XENO_RECIPE_SCHEMA_VERSION,d as XenoRecipeValidationError,A as assertValidXenoRecipeDefinition,it as compileXenoRecipe,nt as parseXenoRecipeDefinition,rt as serializeXenoRecipe,k as xenoRecipeFingerprint};
1
+ var S=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],_=["draft","pending_review","approved","rejected","superseded","archived"],k=["public","internal","confidential","restricted"],x=["agent","tool","user","system","integration"],y=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],A=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];import{createHash as C}from"node:crypto";function m(e){return{algorithm:"sha256",value:C("sha256").update(e).digest("hex")}}function p(e){return JSON.stringify(R(e,new Set))}function h(e){return m(p(e))}function R(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(s=>R(s,t));return t.delete(e),r}let i={};for(let r of Object.keys(e).sort((s,a)=>s.localeCompare(a))){let s=e[r];if(s===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);i[r]=R(s,t)}return t.delete(e),i}var N="[\\u0000-\\u001f\\u007f]",ie=new RegExp(N);var re=new Set(_),oe=new Set(k),se=new Set(x),ae=new Set(S),ce=new Set(y),de=new Set(A);var he=new Set(y),ve=new Set(A);var Ve=64*1024*1024;var Me=16*1024*1024;function X(e,t={}){for(let i of e){let r=i.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var P="xeno.recipe.v1",d=class extends Error{constructor(i){super(`XENO recipe is invalid: ${i.join("; ")}`);this.issues=i;this.name="XenoRecipeValidationError"}issues;code="XENO_RECIPE_INVALID"};function Et(e){let t=l(e,"recipe",["schemaVersion","recipeId","name","description","version","modes","inputs","requiredSecretRefs","authority","budget","steps","provenance"]),i=l(t.authority,"authority",["permissionMode","externalActions","network"]),r=l(t.budget,"budget",["maxAgents","maxConcurrency","maxTotalTokens","timeoutMs"]),s={schemaVersion:t.schemaVersion,recipeId:c(t.recipeId,"recipeId"),name:c(t.name,"name"),description:c(t.description,"description"),version:g(t.version,"version"),modes:u(t.modes,"modes").map(a=>a),inputs:u(t.inputs,"inputs").map((a,n)=>D(a,n)),requiredSecretRefs:u(t.requiredSecretRefs,"requiredSecretRefs").map(a=>c(a,"secret ref")),authority:{permissionMode:i.permissionMode,externalActions:i.externalActions,network:i.network},budget:{maxAgents:g(r.maxAgents,"budget.maxAgents"),maxConcurrency:g(r.maxConcurrency,"budget.maxConcurrency"),maxTotalTokens:g(r.maxTotalTokens,"budget.maxTotalTokens"),timeoutMs:g(r.timeoutMs,"budget.timeoutMs")},steps:u(t.steps,"steps").map((a,n)=>O(a,n)),...t.provenance!==void 0?{provenance:F(t.provenance)}:{}};return w(s),s}function w(e){let t=[];e?.schemaVersion!==P&&t.push("schemaVersion must be xeno.recipe.v1"),I(e?.recipeId,"recipeId",t),f(e?.name,"name",t,256),f(e?.description,"description",t,8e3),(!Number.isSafeInteger(e?.version)||e.version<1||e.version>1e6)&&t.push("version must be a positive bounded integer"),(!Array.isArray(e?.modes)||e.modes.length<1)&&t.push("modes must contain at least one execution mode");let i=new Set;for(let n of e?.modes??[])n!=="interactive"&&n!=="headless"&&n!=="ci"&&t.push(`unsupported recipe mode ${String(n)}`),i.has(n)&&t.push(`duplicate recipe mode ${n}`),i.add(n);W(e?.authority?.permissionMode)||t.push("authority.permissionMode is invalid"),e?.authority?.externalActions!=="deny"&&e?.authority?.externalActions!=="approval-required"&&t.push("authority.externalActions is invalid"),e?.authority?.network!=="deny"&&e?.authority?.network!=="environment-policy"&&t.push("authority.network is invalid"),L(e?.budget,t);let r=new Set;for(let n of e?.inputs??[]){if(z(n?.name,t),r.has(n.name)&&t.push(`duplicate input ${n.name}`),r.add(n.name),f(n?.description,`input ${n.name} description`,t,2e3),typeof n?.required!="boolean"&&t.push(`input ${n.name} required must be boolean`),n?.default!==void 0&&f(n.default,`input ${n.name} default`,t,32e3),n?.required&&n?.default!==void 0&&t.push(`required input ${n.name} cannot define a default`),n?.enum!==void 0){(!Array.isArray(n.enum)||n.enum.length<1||n.enum.length>256)&&t.push(`input ${n.name} enum is invalid`);for(let o of n.enum??[])f(o,`input ${n.name} enum value`,t,2e3);n.default!==void 0&&!n.enum.includes(n.default)&&t.push(`input ${n.name} default is outside its enum`)}if(n?.pattern!==void 0){f(n.pattern,`input ${n.name} pattern`,t,1e3);try{new RegExp(n.pattern,"u")}catch{t.push(`input ${n.name} pattern is invalid`)}}}let s=new Set;for(let n of e?.requiredSecretRefs??[])/^[A-Z_][A-Z0-9_]{0,127}$/u.test(n)||t.push(`required secret ref ${n} is invalid`),s.has(n)&&t.push(`duplicate secret ref ${n}`),s.add(n);(!Array.isArray(e?.steps)||e.steps.length<1||e.steps.length>256)&&t.push("steps must contain 1 through 256 records"),Array.isArray(e?.steps)&&e.steps.length>(e?.budget?.maxAgents??0)&&t.push("budget.maxAgents must cover every recipe step");let a=new Map;for(let n of e?.steps??[]){I(n?.id,"step id",t),a.has(n.id)&&t.push(`duplicate step ${n.id}`),a.set(n.id,n),f(n?.title,`step ${n.id} title`,t,2e3),n?.kind!=="agent"&&n?.kind!=="verification"&&t.push(`step ${n.id} kind is invalid`),f(n?.prompt,`step ${n.id} prompt`,t,128e3),n?.agentProfile!==void 0&&I(n.agentProfile,`step ${n.id} agentProfile`,t);for(let o of n?.dependsOn??[])I(o,`step ${n.id} dependency`,t);n?.approval&&f(n.approval.message,`step ${n.id} approval message`,t,8e3);for(let o of n?.expectedArtifacts??[])U(o,`step ${n.id} expected artifact`,t);for(let o of J(n?.prompt??""))r.has(o)||t.push(`step ${n.id} references unknown input ${o}`);/\{\{\s*(?:secret|env)[.:]/iu.test(n?.prompt??"")&&t.push(`step ${n.id} cannot interpolate secrets into prompts`)}for(let n of e?.steps??[])for(let o of n.dependsOn??[])a.has(o)||t.push(`step ${n.id} depends on unknown step ${o}`),o===n.id&&t.push(`step ${n.id} cannot depend on itself`);if(M(e?.steps??[],t),t.length>0)throw new d([...new Set(t)])}function Xt(e,t){if(w(e),!e.modes.includes(t.mode))throw new d([`recipe does not allow ${t.mode} mode`]);let i=t.inputs??{},r=new Map(e.inputs.map(o=>[o.name,o])),s=Object.keys(i).filter(o=>!r.has(o));if(s.length>0)throw new d(s.map(o=>`unknown recipe input ${o}`));let a={};for(let o of e.inputs){let b=i[o.name]??o.default;if(b===void 0){if(o.required)throw new d([`required recipe input ${o.name} is missing`]);a[o.name]="";continue}a[o.name]=q(o,b)}let n=e.requiredSecretRefs.filter(o=>t.hasSecretRef&&!t.hasSecretRef(o));if(n.length>0)throw new d(n.map(o=>`required secret reference is unavailable: ${o}`));return{schemaVersion:1,recipeId:e.recipeId,recipeVersion:e.version,recipeFingerprint:V(e),mode:t.mode,inputs:a,requiredSecretRefs:[...e.requiredSecretRefs],authority:structuredClone(e.authority),budget:structuredClone(e.budget),steps:H(e.steps).map(o=>({...structuredClone(o),prompt:j(o.prompt,a)}))}}function V(e){return w(e),{algorithm:"sha256",value:h(e).value}}function bt(e){return w(e),`${p(e)}
2
+ `}function D(e,t){let i=l(e,`inputs[${t}]`,["name","description","required","default","enum","pattern"]);return{name:c(i.name,`inputs[${t}].name`),description:c(i.description,`inputs[${t}].description`),required:B(i.required,`inputs[${t}].required`),...i.default!==void 0?{default:c(i.default,`inputs[${t}].default`)}:{},...i.enum!==void 0?{enum:u(i.enum,`inputs[${t}].enum`).map(r=>c(r,"enum value"))}:{},...i.pattern!==void 0?{pattern:c(i.pattern,`inputs[${t}].pattern`)}:{}}}function O(e,t){let i=l(e,`steps[${t}]`,["id","title","kind","prompt","dependsOn","agentProfile","approval","expectedArtifacts"]),r=i.approval===void 0?void 0:l(i.approval,`steps[${t}].approval`,["message"]);return{id:c(i.id,`steps[${t}].id`),title:c(i.title,`steps[${t}].title`),kind:i.kind,prompt:c(i.prompt,`steps[${t}].prompt`),...i.dependsOn!==void 0?{dependsOn:u(i.dependsOn,"dependsOn").map(s=>c(s,"dependency"))}:{},...i.agentProfile!==void 0?{agentProfile:c(i.agentProfile,"agentProfile")}:{},...r?{approval:{message:c(r.message,"approval message")}}:{},...i.expectedArtifacts!==void 0?{expectedArtifacts:u(i.expectedArtifacts,"expectedArtifacts").map(s=>c(s,"expected artifact"))}:{}}}function F(e){let t=l(e,"provenance",["publisherId","source","revision"]);return{publisherId:c(t.publisherId,"provenance.publisherId"),...t.source!==void 0?{source:c(t.source,"provenance.source")}:{},...t.revision!==void 0?{revision:c(t.revision,"provenance.revision")}:{}}}function L(e,t){(!Number.isSafeInteger(e?.maxAgents)||e.maxAgents<1||e.maxAgents>256)&&t.push("budget.maxAgents is invalid"),(!Number.isSafeInteger(e?.maxConcurrency)||e.maxConcurrency<1||e.maxConcurrency>64)&&t.push("budget.maxConcurrency is invalid"),e?.maxConcurrency>e?.maxAgents&&t.push("budget.maxConcurrency cannot exceed maxAgents"),(!Number.isSafeInteger(e?.maxTotalTokens)||e.maxTotalTokens<1||e.maxTotalTokens>1e8)&&t.push("budget.maxTotalTokens is invalid"),(!Number.isSafeInteger(e?.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>10080*60*1e3)&&t.push("budget.timeoutMs is invalid")}function M(e,t){let i=new Map(e.map(n=>[n.id,n])),r=new Set,s=new Set,a=n=>{if(!(s.has(n)||!i.has(n))){if(r.has(n)){t.push(`recipe step dependency cycle includes ${n}`);return}r.add(n);for(let o of i.get(n)?.dependsOn??[])a(o);r.delete(n),s.add(n)}};for(let n of e)a(n.id)}function H(e){let t=new Map(e.map(s=>[s.id,s])),i=new Map(e.map((s,a)=>[s.id,{step:s,index:a,dependencies:new Set(s.dependsOn??[])}])),r=[];for(;i.size>0;){let s=[...i.values()].filter(({dependencies:a})=>[...a].every(n=>!i.has(n))).sort((a,n)=>a.index-n.index);if(s.length===0)throw new d(["recipe step dependency graph is cyclic"]);for(let a of s)r.push(t.get(a.step.id)),i.delete(a.step.id)}return r}function q(e,t){let i=t.trim();if(i.length>32e3||X(i,{allowTab:!0,allowLineBreaks:!0}))throw new d([`input ${e.name} is invalid`]);if(e.enum&&!e.enum.includes(i))throw new d([`input ${e.name} is outside its enum`]);if(e.pattern&&!new RegExp(e.pattern,"u").test(i))throw new d([`input ${e.name} does not match its pattern`]);return i}function j(e,t){return e.replace(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu,(i,r)=>t[r]??"")}function J(e){return[...e.matchAll(/\{\{\s*input\.([A-Za-z_][A-Za-z0-9_-]*)\s*\}\}/gu)].map(t=>t[1])}function l(e,t,i){if(!e||typeof e!="object"||Array.isArray(e))throw new d([`${t} must be an object`]);let r=e,s=Object.keys(r).filter(a=>!i.includes(a));if(s.length>0)throw new d(s.map(a=>`${t} contains unsupported field ${a}`));return r}function u(e,t){if(!Array.isArray(e))throw new d([`${t} must be an array`]);return e}function c(e,t){if(typeof e!="string")throw new d([`${t} must be text`]);return e}function B(e,t){if(typeof e!="boolean")throw new d([`${t} must be boolean`]);return e}function g(e,t){if(!Number.isSafeInteger(e))throw new d([`${t} must be an integer`]);return e}function I(e,t,i){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&i.push(`${t} is invalid`)}function z(e,t){(typeof e!="string"||!/^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(e))&&t.push(`input name ${String(e)} is invalid`)}function f(e,t,i,r){(typeof e!="string"||!e.trim()||e.length>r||X(e,{allowTab:!0,allowLineBreaks:!0}))&&i.push(`${t} must be non-empty bounded text`)}function U(e,t,i){(typeof e!="string"||!e||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(r=>!r||r==="."||r===".."))&&i.push(`${t} must be workflow-relative`)}function W(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="auto"||e==="dontAsk"}export{P as XENO_RECIPE_SCHEMA_VERSION,d as XenoRecipeValidationError,w as assertValidXenoRecipeDefinition,Xt as compileXenoRecipe,Et as parseXenoRecipeDefinition,bt as serializeXenoRecipe,V as xenoRecipeFingerprint};
@@ -1 +1 @@
1
- {"inputs":{"src/artifacts/types.ts":{"bytes":9397,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25931,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/evidence-graph.ts":{"bytes":9299,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/repository.ts":{"bytes":30001,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/artifacts/file-repository.ts":{"bytes":16811,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/diff-artifact.ts":{"bytes":18491,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/review-service.ts":{"bytes":8903,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"}],"format":"esm"},"src/artifacts/spec-lifecycle.ts":{"bytes":31787,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/multi-agent-review.ts":{"bytes":30924,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/legacy-adapters.ts":{"bytes":11181,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"}],"format":"esm"},"src/artifacts/index.ts":{"bytes":396,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/evidence-graph.ts","kind":"import-statement","original":"./evidence-graph.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/file-repository.ts","kind":"import-statement","original":"./file-repository.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/spec-lifecycle.ts","kind":"import-statement","original":"./spec-lifecycle.js"},{"path":"src/artifacts/multi-agent-review.ts","kind":"import-statement","original":"./multi-agent-review.js"},{"path":"src/artifacts/legacy-adapters.ts","kind":"import-statement","original":"./legacy-adapters.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/recipes/protocol.ts":{"bytes":20322,"imports":[{"path":"src/artifacts/index.ts","kind":"import-statement","original":"../artifacts/index.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/recipes/index.ts":{"bytes":32,"imports":[{"path":"src/recipes/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/recipes/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/recipes/index.ts","inputs":{"src/recipes/index.ts":{"bytesInOutput":249},"src/artifacts/index.ts":{"bytesInOutput":0},"src/artifacts/hash.ts":{"bytesInOutput":715},"src/artifacts/validation.ts":{"bytesInOutput":50},"src/artifacts/file-repository.ts":{"bytesInOutput":20},"src/artifacts/diff-artifact.ts":{"bytesInOutput":20},"src/utils/text-security.ts":{"bytesInOutput":179},"src/recipes/protocol.ts":{"bytesInOutput":10069}},"bytes":11921}}}
1
+ {"inputs":{"src/artifacts/types.ts":{"bytes":11627,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/custom-names.ts":{"bytes":2210,"imports":[],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25780,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/evidence-graph.ts":{"bytes":9003,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/repository.ts":{"bytes":30001,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/artifacts/file-repository.ts":{"bytes":16811,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/diff-artifact.ts":{"bytes":18491,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/review-service.ts":{"bytes":8903,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"}],"format":"esm"},"src/artifacts/spec-lifecycle.ts":{"bytes":31787,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/multi-agent-review.ts":{"bytes":31322,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/legacy-adapters.ts":{"bytes":11181,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"}],"format":"esm"},"src/artifacts/index.ts":{"bytes":396,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/evidence-graph.ts","kind":"import-statement","original":"./evidence-graph.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/file-repository.ts","kind":"import-statement","original":"./file-repository.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/spec-lifecycle.ts","kind":"import-statement","original":"./spec-lifecycle.js"},{"path":"src/artifacts/multi-agent-review.ts","kind":"import-statement","original":"./multi-agent-review.js"},{"path":"src/artifacts/legacy-adapters.ts","kind":"import-statement","original":"./legacy-adapters.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/recipes/protocol.ts":{"bytes":21766,"imports":[{"path":"src/artifacts/index.ts","kind":"import-statement","original":"../artifacts/index.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/recipes/index.ts":{"bytes":32,"imports":[{"path":"src/recipes/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/recipes/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/recipes/index.ts","inputs":{"src/recipes/index.ts":{"bytesInOutput":252},"src/artifacts/types.ts":{"bytesInOutput":812},"src/artifacts/index.ts":{"bytesInOutput":0},"src/artifacts/hash.ts":{"bytesInOutput":715},"src/artifacts/validation.ts":{"bytesInOutput":138},"src/artifacts/evidence-graph.ts":{"bytesInOutput":32},"src/artifacts/file-repository.ts":{"bytesInOutput":20},"src/artifacts/diff-artifact.ts":{"bytesInOutput":20},"src/utils/text-security.ts":{"bytesInOutput":179},"src/recipes/protocol.ts":{"bytesInOutput":10079}},"bytes":12866}}}
@@ -1 +1 @@
1
- {"inputs":{"src/artifacts/types.ts":{"bytes":9397,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25931,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/evidence-graph.ts":{"bytes":9299,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/repository.ts":{"bytes":30001,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/artifacts/file-repository.ts":{"bytes":16811,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/diff-artifact.ts":{"bytes":18491,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/review-service.ts":{"bytes":8903,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"}],"format":"esm"},"src/artifacts/spec-lifecycle.ts":{"bytes":31787,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/multi-agent-review.ts":{"bytes":30924,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/legacy-adapters.ts":{"bytes":11181,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"}],"format":"esm"},"src/artifacts/index.ts":{"bytes":396,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/evidence-graph.ts","kind":"import-statement","original":"./evidence-graph.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/file-repository.ts","kind":"import-statement","original":"./file-repository.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/spec-lifecycle.ts","kind":"import-statement","original":"./spec-lifecycle.js"},{"path":"src/artifacts/multi-agent-review.ts","kind":"import-statement","original":"./multi-agent-review.js"},{"path":"src/artifacts/legacy-adapters.ts","kind":"import-statement","original":"./legacy-adapters.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/recipes/protocol.ts":{"bytes":20322,"imports":[{"path":"src/artifacts/index.ts","kind":"import-statement","original":"../artifacts/index.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/recipes/index.ts":{"bytes":32,"imports":[{"path":"src/recipes/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/recipes/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"exports":["XENO_RECIPE_SCHEMA_VERSION","XenoRecipeValidationError","assertValidXenoRecipeDefinition","compileXenoRecipe","parseXenoRecipeDefinition","serializeXenoRecipe","xenoRecipeFingerprint"],"entryPoint":"src/recipes/index.ts","inputs":{"src/artifacts/index.ts":{"bytesInOutput":0},"src/artifacts/hash.ts":{"bytesInOutput":712},"src/artifacts/validation.ts":{"bytesInOutput":49},"src/artifacts/file-repository.ts":{"bytesInOutput":20},"src/artifacts/diff-artifact.ts":{"bytesInOutput":20},"src/utils/text-security.ts":{"bytesInOutput":179},"src/recipes/protocol.ts":{"bytesInOutput":10072},"src/recipes/index.ts":{"bytesInOutput":0}},"bytes":11270}}}
1
+ {"inputs":{"src/artifacts/types.ts":{"bytes":11627,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1530,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/custom-names.ts":{"bytes":2210,"imports":[],"format":"esm"},"src/artifacts/validation.ts":{"bytes":25780,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/evidence-graph.ts":{"bytes":9003,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/repository.ts":{"bytes":30001,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/artifacts/file-repository.ts":{"bytes":16811,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/diff-artifact.ts":{"bytes":18491,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"}],"format":"esm"},"src/artifacts/review-service.ts":{"bytes":8903,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"}],"format":"esm"},"src/artifacts/spec-lifecycle.ts":{"bytes":31787,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/artifacts/multi-agent-review.ts":{"bytes":31322,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/utils/custom-names.ts","kind":"import-statement","original":"../utils/custom-names.js"}],"format":"esm"},"src/artifacts/legacy-adapters.ts":{"bytes":11181,"imports":[{"path":"node:buffer","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"}],"format":"esm"},"src/artifacts/index.ts":{"bytes":396,"imports":[{"path":"src/artifacts/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/artifacts/validation.ts","kind":"import-statement","original":"./validation.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"./hash.js"},{"path":"src/artifacts/evidence-graph.ts","kind":"import-statement","original":"./evidence-graph.js"},{"path":"src/artifacts/repository.ts","kind":"import-statement","original":"./repository.js"},{"path":"src/artifacts/file-repository.ts","kind":"import-statement","original":"./file-repository.js"},{"path":"src/artifacts/diff-artifact.ts","kind":"import-statement","original":"./diff-artifact.js"},{"path":"src/artifacts/review-service.ts","kind":"import-statement","original":"./review-service.js"},{"path":"src/artifacts/spec-lifecycle.ts","kind":"import-statement","original":"./spec-lifecycle.js"},{"path":"src/artifacts/multi-agent-review.ts","kind":"import-statement","original":"./multi-agent-review.js"},{"path":"src/artifacts/legacy-adapters.ts","kind":"import-statement","original":"./legacy-adapters.js"}],"format":"esm"},"src/utils/text-security.ts":{"bytes":833,"imports":[],"format":"esm"},"src/recipes/protocol.ts":{"bytes":21766,"imports":[{"path":"src/artifacts/index.ts","kind":"import-statement","original":"../artifacts/index.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"}],"format":"esm"},"src/recipes/index.ts":{"bytes":32,"imports":[{"path":"src/recipes/protocol.ts","kind":"import-statement","original":"./protocol.js"}],"format":"esm"}},"outputs":{"dist/recipes/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"exports":["XENO_RECIPE_SCHEMA_VERSION","XenoRecipeValidationError","assertValidXenoRecipeDefinition","compileXenoRecipe","parseXenoRecipeDefinition","serializeXenoRecipe","xenoRecipeFingerprint"],"entryPoint":"src/recipes/index.ts","inputs":{"src/artifacts/types.ts":{"bytesInOutput":812},"src/artifacts/index.ts":{"bytesInOutput":0},"src/artifacts/hash.ts":{"bytesInOutput":712},"src/artifacts/validation.ts":{"bytesInOutput":138},"src/artifacts/evidence-graph.ts":{"bytesInOutput":32},"src/artifacts/file-repository.ts":{"bytesInOutput":20},"src/artifacts/diff-artifact.ts":{"bytesInOutput":20},"src/utils/text-security.ts":{"bytesInOutput":179},"src/recipes/protocol.ts":{"bytesInOutput":10072},"src/recipes/index.ts":{"bytesInOutput":0}},"bytes":12203}}}
@@ -1,3 +1,3 @@
1
- "use strict";var g=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},$=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of k(t))!T.call(e,o)&&o!==n&&g(e,o,{get:()=>t[o],enumerable:!(i=x(t,o))||i.enumerable});return e};var N=e=>$(g({},"__esModule",{value:!0}),e);var K={};C(K,{XENO_SOURCE_RESEARCH_SCHEMA_VERSION:()=>I,XenoSourceResearchValidationError:()=>c,assertValidXenoSourceResearchReport:()=>h,createXenoSourceResearchExcerpt:()=>D,createXenoSourceResearchReport:()=>O,normalizeSourceText:()=>l,xenoArtifactToSourceResearchReport:()=>L,xenoSourceResearchReportToArtifact:()=>F});module.exports=N(K);var A=require("node:crypto");var R=require("node:crypto");function s(e){return{algorithm:"sha256",value:(0,R.createHash)("sha256").update(e).digest("hex")}}function d(e){return JSON.stringify(v(e,new Set))}function f(e){return s(d(e))}function v(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(o=>v(o,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((o,r)=>o.localeCompare(r))){let o=e[i];if(o===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=v(o,t)}return t.delete(e),n}var V="[\\u0000-\\u001f\\u007f]",ne=new RegExp(V);var Ee=64*1024*1024;var ke=16*1024*1024;function X(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var I="xeno.source-research-report.v1",c=class extends Error{constructor(n){super(`XENO source-research report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoSourceResearchValidationError"}issues;code="XENO_SOURCE_RESEARCH_INVALID"};function O(e){let t={schemaVersion:I,reportId:e.reportId??`research_${(0,A.randomUUID)()}`,runId:e.runId??`research_run_${(0,A.randomUUID)()}`,query:e.query.trim(),queryHash:_(e.query.trim()),repository:structuredClone(e.repository),collectedAt:e.collectedAt,completedAt:e.completedAt??new Date().toISOString(),model:structuredClone(e.model),files:structuredClone(e.files),excerpts:structuredClone(e.excerpts),answer:e.answer.trim(),answerExcerptIds:[...new Set(e.answerExcerptIds)],publicRationale:e.publicRationale.trim(),findings:structuredClone(e.findings),limitations:[...new Set((e.limitations??[]).map(n=>n.trim()).filter(Boolean))],usage:{inputTokens:S(e.usage?.inputTokens),outputTokens:S(e.usage?.outputTokens)}};return h(t),t}function D(e){return{excerptId:e.excerptId,path:e.path,startLine:e.startLine,endLine:e.endLine,text:l(e.text),contentHash:_(l(e.text)),sourceContentHash:structuredClone(e.sourceContentHash)}}function h(e){let t=[];e?.schemaVersion!==I&&t.push("schemaVersion must be xeno.source-research-report.v1"),p(e?.reportId,"reportId",t),p(e?.runId,"runId",t),a(e?.query,"query",t,128e3),m(e?.queryHash,"queryHash",t),typeof e?.query=="string"&&e.queryHash?.value!==s(e.query).value&&t.push("queryHash does not match query"),H(e?.repository,t),E(e?.collectedAt,"collectedAt",t),E(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.collectedAt)&&t.push("completedAt cannot precede collectedAt"),q(e?.model,t),a(e?.answer,"answer",t,512e3),a(e?.publicRationale,"publicRationale",t,256e3),J(e?.usage,t),(!Array.isArray(e?.files)||e.files.length<1||e.files.length>256)&&t.push("files must contain 1 through 256 source records");let n=new Map;for(let r of e?.files??[])M(r,t),n.has(r.path)&&t.push(`duplicate source file ${r.path}`),n.set(r.path,r);(!Array.isArray(e?.excerpts)||e.excerpts.length>1024)&&t.push("excerpts must contain at most 1024 records");let i=new Map;for(let r of e?.excerpts??[])j(r,n,t),i.has(r.excerptId)&&t.push(`duplicate excerpt ${r.excerptId}`),i.set(r.excerptId,r);(!Array.isArray(e?.answerExcerptIds)||e.answerExcerptIds.length<1)&&t.push("answerExcerptIds must cite at least one source excerpt");for(let r of e?.answerExcerptIds??[])i.has(r)||t.push(`answer references unknown excerpt ${r}`);(!Array.isArray(e?.findings)||e.findings.length>512)&&t.push("findings must contain at most 512 records");let o=new Set;for(let r of e?.findings??[]){p(r?.findingId,"findingId",t),o.has(r.findingId)&&t.push(`duplicate finding ${r.findingId}`),o.add(r.findingId),a(r?.title,`finding ${r.findingId} title`,t,2e3),a(r?.summary,`finding ${r.findingId} summary`,t,64e3),G(r?.severity)||t.push(`finding ${r.findingId} severity is invalid`),W(r?.confidence)||t.push(`finding ${r.findingId} confidence must be between 0 and 1`),(!Array.isArray(r?.excerptIds)||r.excerptIds.length<1)&&t.push(`finding ${r.findingId} requires source excerpts`);for(let w of r?.excerptIds??[])i.has(w)||t.push(`finding ${r.findingId} references unknown excerpt ${w}`)}(!Array.isArray(e?.limitations)||e.limitations.length>256)&&t.push("limitations must contain at most 256 records");for(let r of e?.limitations??[])a(r,"limitation",t,16e3);if(t.length>0)throw new c([...new Set(t)])}function F(e,t){h(e);let n=t.createdAt??e.completedAt,i=d(e);return{schemaVersion:1,artifactId:t.artifactId??`research_${s(`${e.runId}:${e.repository.commit}:${e.queryHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:source-research-report",title:`Source research: ${e.repository.repository}`,description:e.answer.slice(0,1e3),state:"pending_review",createdAt:n,mediaType:"application/vnd.xeno.source-research-report+json",sensitivity:t.sensitivity??"internal",identity:{...t.identity,runId:t.identity?.runId??e.runId,repositoryId:t.identity?.repositoryId??`${e.repository.provider}:${e.repository.repository}`},content:{hash:f(e),sizeBytes:Buffer.byteLength(i,"utf8"),storage:{type:"inline",text:i},encoding:"utf8",redactedPreview:e.answer.slice(0,2e3)},provenance:{producer:structuredClone(t.producer),attributes:{"xeno.research.provider":e.repository.provider,"xeno.research.repository":e.repository.repository,"xeno.research.commit":e.repository.commit,"xeno.research.model":`${e.model.providerId}/${e.model.model}`,"xeno.research.fileCount":e.files.length,"xeno.research.findingCount":e.findings.length}},anchors:e.excerpts.map(o=>({kind:"source-line",path:o.path,startLine:o.startLine,endLine:o.endLine,repositoryId:`${e.repository.provider}:${e.repository.repository}`,commit:e.repository.commit}))}}function L(e){if(e.kind!=="custom:source-research-report"||e.mediaType!=="application/vnd.xeno.source-research-report+json")throw new c([`Artifact ${e.artifactId} is not a source-research report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new c(["Source-research reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new c(["Source-research artifact content is invalid JSON"])}if(h(t),f(t).value!==e.content.hash.value)throw new c(["Source-research content hash does not match the artifact"]);return structuredClone(t)}function l(e){return e.replace(/\r\n?/gu,`
2
- `)}function H(e,t){e?.provider!=="github"&&e?.provider!=="gitlab"&&t.push("repository provider must be github or gitlab"),B(e?.host,"repository host",t),z(e?.repository,t),a(e?.ref,"repository ref",t,512),(typeof e?.commit!="string"||!/^[a-f0-9]{7,64}$/u.test(e.commit))&&t.push("repository commit must be a lowercase hexadecimal object ID"),U(e?.url,"repository url",t)}function M(e,t){b(e?.path,"source file path",t),m(e?.contentHash,`source file ${e?.path} contentHash`,t),(!Number.isSafeInteger(e?.sizeBytes)||e.sizeBytes<0||e.sizeBytes>8*1024*1024)&&t.push(`source file ${e?.path} sizeBytes is invalid`),(!Number.isSafeInteger(e?.lineCount)||e.lineCount<1||e.lineCount>1e6)&&t.push(`source file ${e?.path} lineCount is invalid`),e?.blobId!==void 0&&a(e.blobId,`source file ${e.path} blobId`,t,256),e?.language!==void 0&&a(e.language,`source file ${e.path} language`,t,128)}function j(e,t,n){p(e?.excerptId,"excerptId",n),b(e?.path,`excerpt ${e?.excerptId} path`,n);let i=t.get(e?.path);i||n.push(`excerpt ${e?.excerptId} references unknown source file ${e?.path}`),(!Number.isSafeInteger(e?.startLine)||e.startLine<1)&&n.push(`excerpt ${e?.excerptId} startLine is invalid`),(!Number.isSafeInteger(e?.endLine)||e.endLine<e.startLine)&&n.push(`excerpt ${e?.excerptId} endLine is invalid`),i&&e.endLine>i.lineCount&&n.push(`excerpt ${e?.excerptId} exceeds source line count`),a(e?.text,`excerpt ${e?.excerptId} text`,n,256e3),m(e?.contentHash,`excerpt ${e?.excerptId} contentHash`,n),m(e?.sourceContentHash,`excerpt ${e?.excerptId} sourceContentHash`,n);let o=typeof e?.text=="string"?l(e.text):"";e?.contentHash?.value!==s(o).value&&n.push(`excerpt ${e?.excerptId} contentHash does not match text`),i&&e?.sourceContentHash?.value!==i.contentHash.value&&n.push(`excerpt ${e?.excerptId} is bound to a different source hash`),o&&o.split(`
3
- `).length!==e.endLine-e.startLine+1&&n.push(`excerpt ${e?.excerptId} line span does not match text`)}function q(e,t){p(e?.providerId,"model providerId",t),a(e?.model,"model",t,512),e?.connectionId!==void 0&&p(e.connectionId,"model connectionId",t)}function J(e,t){(!Number.isSafeInteger(e?.inputTokens)||e.inputTokens<0)&&t.push("usage.inputTokens must be a non-negative integer"),(!Number.isSafeInteger(e?.outputTokens)||e.outputTokens<0)&&t.push("usage.outputTokens must be a non-negative integer")}function m(e,t,n){(e?.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e?.value??""))&&n.push(`${t} must be a lowercase SHA-256 digest`)}function p(e,t,n){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&n.push(`${t} is invalid`)}function a(e,t,n,i){(typeof e!="string"||!e.trim()||e.length>i||X(e,{allowTab:!0,allowLineBreaks:!0}))&&n.push(`${t} must be non-empty bounded text`)}function E(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e))||new Date(e).toISOString()!==e)&&n.push(`${t} must be an ISO-8601 UTC timestamp`)}function B(e,t,n){(typeof e!="string"||e.length>253||!/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.test(e))&&n.push(`${t} is invalid`)}function z(e,t){(typeof e!="string"||e.length>2048||e.startsWith("/")||e.endsWith("/")||e.split("/").some(n=>!n||n==="."||n===".."))&&t.push("repository name is invalid")}function b(e,t,n){(typeof e!="string"||e.length>4096||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(i=>!i||i==="."||i===".."))&&n.push(`${t} must be repository-relative`)}function U(e,t,n){try{let i=new URL(String(e));(i.protocol!=="https:"||i.username||i.password)&&n.push(`${t} must be credential-free HTTPS`)}catch{n.push(`${t} is invalid`)}}function S(e){return Number.isSafeInteger(e)&&(e??-1)>=0?e:0}function _(e){return{algorithm:"sha256",value:s(e).value}}function W(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=1}function G(e){return e==="info"||e==="low"||e==="medium"||e==="high"||e==="critical"}0&&(module.exports={XENO_SOURCE_RESEARCH_SCHEMA_VERSION,XenoSourceResearchValidationError,assertValidXenoSourceResearchReport,createXenoSourceResearchExcerpt,createXenoSourceResearchReport,normalizeSourceText,xenoArtifactToSourceResearchReport,xenoSourceResearchReportToArtifact});
1
+ "use strict";var y=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var n in t)y(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of O(t))!D.call(e,o)&&o!==n&&y(e,o,{get:()=>t[o],enumerable:!(i=P(t,o))||i.enumerable});return e};var H=e=>L(y({},"__esModule",{value:!0}),e);var ie={};F(ie,{XENO_SOURCE_RESEARCH_SCHEMA_VERSION:()=>R,XenoSourceResearchValidationError:()=>c,assertValidXenoSourceResearchReport:()=>v,createXenoSourceResearchExcerpt:()=>B,createXenoSourceResearchReport:()=>q,normalizeSourceText:()=>h,xenoArtifactToSourceResearchReport:()=>z,xenoSourceResearchReportToArtifact:()=>J});module.exports=H(ie);var w=require("node:crypto");var X=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation"],S=["draft","pending_review","approved","rejected","superseded","archived"],b=["public","internal","confidential","restricted"],_=["agent","tool","user","system","integration"],l=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],m=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var x=require("node:crypto");function s(e){return{algorithm:"sha256",value:(0,x.createHash)("sha256").update(e).digest("hex")}}function d(e){return JSON.stringify(A(e,new Set))}function f(e){return s(d(e))}function A(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let i=e.map(o=>A(o,t));return t.delete(e),i}let n={};for(let i of Object.keys(e).sort((o,r)=>o.localeCompare(r))){let o=e[i];if(o===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=A(o,t)}return t.delete(e),n}var M="[\\u0000-\\u001f\\u007f]",pe=new RegExp(M);var le=new Set(S),me=new Set(b),he=new Set(_),ge=new Set(X),ve=new Set(l),ye=new Set(m);var Xe=new Set(l),Se=new Set(m);var Be=64*1024*1024;var Ke=16*1024*1024;function k(e,t={}){for(let n of e){let i=n.codePointAt(0);if(i===127)return!0;if(!(i>31)&&!(i===9&&t.allowTab===!0)&&!((i===10||i===13)&&t.allowLineBreaks===!0))return!0}return!1}var R="xeno.source-research-report.v1",c=class extends Error{constructor(n){super(`XENO source-research report is invalid: ${n.join("; ")}`);this.issues=n;this.name="XenoSourceResearchValidationError"}issues;code="XENO_SOURCE_RESEARCH_INVALID"};function q(e){let t={schemaVersion:R,reportId:e.reportId??`research_${(0,w.randomUUID)()}`,runId:e.runId??`research_run_${(0,w.randomUUID)()}`,query:e.query.trim(),queryHash:V(e.query.trim()),repository:structuredClone(e.repository),collectedAt:e.collectedAt,completedAt:e.completedAt??new Date().toISOString(),model:structuredClone(e.model),files:structuredClone(e.files),excerpts:structuredClone(e.excerpts),answer:e.answer.trim(),answerExcerptIds:[...new Set(e.answerExcerptIds)],publicRationale:e.publicRationale.trim(),findings:structuredClone(e.findings),limitations:[...new Set((e.limitations??[]).map(n=>n.trim()).filter(Boolean))],usage:{inputTokens:N(e.usage?.inputTokens),outputTokens:N(e.usage?.outputTokens)}};return v(t),t}function B(e){return{excerptId:e.excerptId,path:e.path,startLine:e.startLine,endLine:e.endLine,text:h(e.text),contentHash:V(h(e.text)),sourceContentHash:structuredClone(e.sourceContentHash)}}function v(e){let t=[];e?.schemaVersion!==R&&t.push("schemaVersion must be xeno.source-research-report.v1"),p(e?.reportId,"reportId",t),p(e?.runId,"runId",t),a(e?.query,"query",t,128e3),g(e?.queryHash,"queryHash",t),typeof e?.query=="string"&&e.queryHash?.value!==s(e.query).value&&t.push("queryHash does not match query"),U(e?.repository,t),C(e?.collectedAt,"collectedAt",t),C(e?.completedAt,"completedAt",t),Date.parse(e?.completedAt)<Date.parse(e?.collectedAt)&&t.push("completedAt cannot precede collectedAt"),G(e?.model,t),a(e?.answer,"answer",t,512e3),a(e?.publicRationale,"publicRationale",t,256e3),Y(e?.usage,t),(!Array.isArray(e?.files)||e.files.length<1||e.files.length>256)&&t.push("files must contain 1 through 256 source records");let n=new Map;for(let r of e?.files??[])W(r,t),n.has(r.path)&&t.push(`duplicate source file ${r.path}`),n.set(r.path,r);(!Array.isArray(e?.excerpts)||e.excerpts.length>1024)&&t.push("excerpts must contain at most 1024 records");let i=new Map;for(let r of e?.excerpts??[])K(r,n,t),i.has(r.excerptId)&&t.push(`duplicate excerpt ${r.excerptId}`),i.set(r.excerptId,r);(!Array.isArray(e?.answerExcerptIds)||e.answerExcerptIds.length<1)&&t.push("answerExcerptIds must cite at least one source excerpt");for(let r of e?.answerExcerptIds??[])i.has(r)||t.push(`answer references unknown excerpt ${r}`);(!Array.isArray(e?.findings)||e.findings.length>512)&&t.push("findings must contain at most 512 records");let o=new Set;for(let r of e?.findings??[]){p(r?.findingId,"findingId",t),o.has(r.findingId)&&t.push(`duplicate finding ${r.findingId}`),o.add(r.findingId),a(r?.title,`finding ${r.findingId} title`,t,2e3),a(r?.summary,`finding ${r.findingId} summary`,t,64e3),ne(r?.severity)||t.push(`finding ${r.findingId} severity is invalid`),te(r?.confidence)||t.push(`finding ${r.findingId} confidence must be between 0 and 1`),(!Array.isArray(r?.excerptIds)||r.excerptIds.length<1)&&t.push(`finding ${r.findingId} requires source excerpts`);for(let E of r?.excerptIds??[])i.has(E)||t.push(`finding ${r.findingId} references unknown excerpt ${E}`)}(!Array.isArray(e?.limitations)||e.limitations.length>256)&&t.push("limitations must contain at most 256 records");for(let r of e?.limitations??[])a(r,"limitation",t,16e3);if(t.length>0)throw new c([...new Set(t)])}function J(e,t){v(e);let n=t.createdAt??e.completedAt,i=d(e);return{schemaVersion:1,artifactId:t.artifactId??`research_${s(`${e.runId}:${e.repository.commit}:${e.queryHash.value}`).value.slice(0,24)}`,revision:1,kind:"custom:source-research-report",title:`Source research: ${e.repository.repository}`,description:e.answer.slice(0,1e3),state:"pending_review",createdAt:n,mediaType:"application/vnd.xeno.source-research-report+json",sensitivity:t.sensitivity??"internal",identity:{...t.identity,runId:t.identity?.runId??e.runId,repositoryId:t.identity?.repositoryId??`${e.repository.provider}:${e.repository.repository}`},content:{hash:f(e),sizeBytes:Buffer.byteLength(i,"utf8"),storage:{type:"inline",text:i},encoding:"utf8",redactedPreview:e.answer.slice(0,2e3)},provenance:{producer:structuredClone(t.producer),attributes:{"xeno.research.provider":e.repository.provider,"xeno.research.repository":e.repository.repository,"xeno.research.commit":e.repository.commit,"xeno.research.model":`${e.model.providerId}/${e.model.model}`,"xeno.research.fileCount":e.files.length,"xeno.research.findingCount":e.findings.length}},anchors:e.excerpts.map(o=>({kind:"source-line",path:o.path,startLine:o.startLine,endLine:o.endLine,repositoryId:`${e.repository.provider}:${e.repository.repository}`,commit:e.repository.commit}))}}function z(e){if(e.kind!=="custom:source-research-report"||e.mediaType!=="application/vnd.xeno.source-research-report+json")throw new c([`Artifact ${e.artifactId} is not a source-research report`]);if(e.content.storage.type!=="inline"||typeof e.content.storage.text!="string")throw new c(["Source-research reports require inline JSON content"]);let t;try{t=JSON.parse(e.content.storage.text)}catch{throw new c(["Source-research artifact content is invalid JSON"])}if(v(t),f(t).value!==e.content.hash.value)throw new c(["Source-research content hash does not match the artifact"]);return structuredClone(t)}function h(e){return e.replace(/\r\n?/gu,`
2
+ `)}function U(e,t){e?.provider!=="github"&&e?.provider!=="gitlab"&&t.push("repository provider must be github or gitlab"),Z(e?.host,"repository host",t),Q(e?.repository,t),a(e?.ref,"repository ref",t,512),(typeof e?.commit!="string"||!/^[a-f0-9]{7,64}$/u.test(e.commit))&&t.push("repository commit must be a lowercase hexadecimal object ID"),ee(e?.url,"repository url",t)}function W(e,t){$(e?.path,"source file path",t),g(e?.contentHash,`source file ${e?.path} contentHash`,t),(!Number.isSafeInteger(e?.sizeBytes)||e.sizeBytes<0||e.sizeBytes>8*1024*1024)&&t.push(`source file ${e?.path} sizeBytes is invalid`),(!Number.isSafeInteger(e?.lineCount)||e.lineCount<1||e.lineCount>1e6)&&t.push(`source file ${e?.path} lineCount is invalid`),e?.blobId!==void 0&&a(e.blobId,`source file ${e.path} blobId`,t,256),e?.language!==void 0&&a(e.language,`source file ${e.path} language`,t,128)}function K(e,t,n){p(e?.excerptId,"excerptId",n),$(e?.path,`excerpt ${e?.excerptId} path`,n);let i=t.get(e?.path);i||n.push(`excerpt ${e?.excerptId} references unknown source file ${e?.path}`),(!Number.isSafeInteger(e?.startLine)||e.startLine<1)&&n.push(`excerpt ${e?.excerptId} startLine is invalid`),(!Number.isSafeInteger(e?.endLine)||e.endLine<e.startLine)&&n.push(`excerpt ${e?.excerptId} endLine is invalid`),i&&e.endLine>i.lineCount&&n.push(`excerpt ${e?.excerptId} exceeds source line count`),a(e?.text,`excerpt ${e?.excerptId} text`,n,256e3),g(e?.contentHash,`excerpt ${e?.excerptId} contentHash`,n),g(e?.sourceContentHash,`excerpt ${e?.excerptId} sourceContentHash`,n);let o=typeof e?.text=="string"?h(e.text):"";e?.contentHash?.value!==s(o).value&&n.push(`excerpt ${e?.excerptId} contentHash does not match text`),i&&e?.sourceContentHash?.value!==i.contentHash.value&&n.push(`excerpt ${e?.excerptId} is bound to a different source hash`),o&&o.split(`
3
+ `).length!==e.endLine-e.startLine+1&&n.push(`excerpt ${e?.excerptId} line span does not match text`)}function G(e,t){p(e?.providerId,"model providerId",t),a(e?.model,"model",t,512),e?.connectionId!==void 0&&p(e.connectionId,"model connectionId",t)}function Y(e,t){(!Number.isSafeInteger(e?.inputTokens)||e.inputTokens<0)&&t.push("usage.inputTokens must be a non-negative integer"),(!Number.isSafeInteger(e?.outputTokens)||e.outputTokens<0)&&t.push("usage.outputTokens must be a non-negative integer")}function g(e,t,n){(e?.algorithm!=="sha256"||!/^[a-f0-9]{64}$/u.test(e?.value??""))&&n.push(`${t} must be a lowercase SHA-256 digest`)}function p(e,t,n){(typeof e!="string"||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u.test(e))&&n.push(`${t} is invalid`)}function a(e,t,n,i){(typeof e!="string"||!e.trim()||e.length>i||k(e,{allowTab:!0,allowLineBreaks:!0}))&&n.push(`${t} must be non-empty bounded text`)}function C(e,t,n){(typeof e!="string"||!Number.isFinite(Date.parse(e))||new Date(e).toISOString()!==e)&&n.push(`${t} must be an ISO-8601 UTC timestamp`)}function Z(e,t,n){(typeof e!="string"||e.length>253||!/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.test(e))&&n.push(`${t} is invalid`)}function Q(e,t){(typeof e!="string"||e.length>2048||e.startsWith("/")||e.endsWith("/")||e.split("/").some(n=>!n||n==="."||n===".."))&&t.push("repository name is invalid")}function $(e,t,n){(typeof e!="string"||e.length>4096||e.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(e)||e.includes("\\")||e.split("/").some(i=>!i||i==="."||i===".."))&&n.push(`${t} must be repository-relative`)}function ee(e,t,n){try{let i=new URL(String(e));(i.protocol!=="https:"||i.username||i.password)&&n.push(`${t} must be credential-free HTTPS`)}catch{n.push(`${t} is invalid`)}}function N(e){return Number.isSafeInteger(e)&&(e??-1)>=0?e:0}function V(e){return{algorithm:"sha256",value:s(e).value}}function te(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=1}function ne(e){return e==="info"||e==="low"||e==="medium"||e==="high"||e==="critical"}0&&(module.exports={XENO_SOURCE_RESEARCH_SCHEMA_VERSION,XenoSourceResearchValidationError,assertValidXenoSourceResearchReport,createXenoSourceResearchExcerpt,createXenoSourceResearchReport,normalizeSourceText,xenoArtifactToSourceResearchReport,xenoSourceResearchReportToArtifact});
@@ -4,9 +4,45 @@ type XenoJsonValue = XenoJsonPrimitive | XenoJsonObject | XenoJsonValue[];
4
4
  interface XenoJsonObject {
5
5
  [key: string]: XenoJsonValue;
6
6
  }
7
- type XenoArtifactKind = "plan" | "requirements" | "design" | "task-graph" | "patch" | "diff" | "file" | "document" | "diagram" | "screenshot" | "recording" | "browser-snapshot" | "test-report" | "review-report" | "security-report" | "performance-report" | "release-report" | "sbom" | "provenance" | "attestation" | `custom:${string}`;
8
- type XenoArtifactState = "draft" | "pending_review" | "approved" | "rejected" | "superseded" | "archived";
9
- type XenoArtifactSensitivity = "public" | "internal" | "confidential" | "restricted";
7
+ declare const XENO_BUILTIN_ARTIFACT_KINDS: readonly [
8
+ "plan",
9
+ "requirements",
10
+ "design",
11
+ "task-graph",
12
+ "patch",
13
+ "diff",
14
+ "file",
15
+ "document",
16
+ "diagram",
17
+ "screenshot",
18
+ "recording",
19
+ "browser-snapshot",
20
+ "test-report",
21
+ "review-report",
22
+ "security-report",
23
+ "performance-report",
24
+ "release-report",
25
+ "sbom",
26
+ "provenance",
27
+ "attestation"
28
+ ];
29
+ type XenoArtifactKind = (typeof XENO_BUILTIN_ARTIFACT_KINDS)[number] | `custom:${string}`;
30
+ declare const XENO_ARTIFACT_STATES: readonly [
31
+ "draft",
32
+ "pending_review",
33
+ "approved",
34
+ "rejected",
35
+ "superseded",
36
+ "archived"
37
+ ];
38
+ type XenoArtifactState = (typeof XENO_ARTIFACT_STATES)[number];
39
+ declare const XENO_ARTIFACT_SENSITIVITIES: readonly [
40
+ "public",
41
+ "internal",
42
+ "confidential",
43
+ "restricted"
44
+ ];
45
+ type XenoArtifactSensitivity = (typeof XENO_ARTIFACT_SENSITIVITIES)[number];
10
46
  interface XenoContentHash {
11
47
  algorithm: "sha256" | `custom:${string}`;
12
48
  value: string;
@@ -51,7 +87,14 @@ interface XenoArtifactIdentity {
51
87
  workspaceId?: string;
52
88
  repositoryId?: string;
53
89
  }
54
- type XenoArtifactActorKind = "agent" | "tool" | "user" | "system" | "integration";
90
+ declare const XENO_ARTIFACT_ACTOR_KINDS: readonly [
91
+ "agent",
92
+ "tool",
93
+ "user",
94
+ "system",
95
+ "integration"
96
+ ];
97
+ type XenoArtifactActorKind = (typeof XENO_ARTIFACT_ACTOR_KINDS)[number];
55
98
  interface XenoArtifactActor {
56
99
  kind: XenoArtifactActorKind;
57
100
  id: string;
@@ -68,8 +111,45 @@ interface XenoArtifactProvenance {
68
111
  sourceArtifactIds?: string[];
69
112
  attributes?: XenoJsonObject;
70
113
  }
71
- type XenoEvidenceNodeType = "requirement" | "design-decision" | "risk" | "task" | "agent" | "run" | "tool-call" | "edit" | "commit" | "test-case" | "test-run" | "finding" | "approval" | "artifact" | "release" | "claim" | `custom:${string}`;
72
- type XenoEvidenceEdgeType = "decomposes" | "depends_on" | "implements" | "changes" | "tests" | "verifies" | "finds" | "fixes" | "reviews" | "approves" | "rejects" | "supersedes" | "derived_from" | "produced_by" | "supports_claim" | "contradicts_claim" | "released_as" | `custom:${string}`;
114
+ declare const XENO_EVIDENCE_NODE_TYPES: readonly [
115
+ "requirement",
116
+ "design-decision",
117
+ "risk",
118
+ "task",
119
+ "agent",
120
+ "run",
121
+ "tool-call",
122
+ "edit",
123
+ "commit",
124
+ "test-case",
125
+ "test-run",
126
+ "finding",
127
+ "approval",
128
+ "artifact",
129
+ "release",
130
+ "claim"
131
+ ];
132
+ type XenoEvidenceNodeType = (typeof XENO_EVIDENCE_NODE_TYPES)[number] | `custom:${string}`;
133
+ declare const XENO_EVIDENCE_EDGE_TYPES: readonly [
134
+ "decomposes",
135
+ "depends_on",
136
+ "implements",
137
+ "changes",
138
+ "tests",
139
+ "verifies",
140
+ "finds",
141
+ "fixes",
142
+ "reviews",
143
+ "approves",
144
+ "rejects",
145
+ "supersedes",
146
+ "derived_from",
147
+ "produced_by",
148
+ "supports_claim",
149
+ "contradicts_claim",
150
+ "released_as"
151
+ ];
152
+ type XenoEvidenceEdgeType = (typeof XENO_EVIDENCE_EDGE_TYPES)[number] | `custom:${string}`;
73
153
  interface XenoEvidenceReference {
74
154
  type: XenoEvidenceNodeType;
75
155
  id: string;