@knoflows/engine 0.1.0-alpha.9 → 0.1.0-beta.18

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 (107) hide show
  1. package/README.md +5 -10
  2. package/dist/engine.js +110 -10
  3. package/dist/migrations/20260918025930_context_files/migration.sql +7 -0
  4. package/dist/migrations/20260918025930_context_files/snapshot.json +1275 -0
  5. package/dist/migrations/20260918074816_large_kate_bishop/migration.sql +8 -0
  6. package/dist/migrations/20260918074816_large_kate_bishop/snapshot.json +1338 -0
  7. package/dist/migrations/20260919073531_tense_grey_gargoyle/migration.sql +1 -0
  8. package/dist/migrations/20260919073531_tense_grey_gargoyle/snapshot.json +1348 -0
  9. package/dist/migrations/20260919081637_fearless_warlock/migration.sql +1 -0
  10. package/dist/migrations/20260919081637_fearless_warlock/snapshot.json +1358 -0
  11. package/package.json +6 -6
  12. package/static/apple-touch-icon.png +0 -0
  13. package/static/assets/i18n/en.json +217 -12
  14. package/static/assets/i18n/es.json +217 -12
  15. package/static/chunk--WRMKpmO.js +5 -0
  16. package/static/{chunk-BmSmqIC7.js → chunk-5xJXPFlv.js} +1 -1
  17. package/static/chunk-7NTQwN96.js +1 -0
  18. package/static/chunk-BCHj6l85.js +1 -0
  19. package/static/chunk-BIL86kgf.js +1 -0
  20. package/static/chunk-BIdwV0jx.js +1 -0
  21. package/static/chunk-BRZ5T52h.js +1 -0
  22. package/static/chunk-B_R_vsLt.js +1 -0
  23. package/static/chunk-BaYdwXIA.js +1 -0
  24. package/static/chunk-BcQQgpKh.js +1 -0
  25. package/static/chunk-BrP_q6LZ.js +1 -0
  26. package/static/chunk-Bv1r1Ly-.js +1 -0
  27. package/static/chunk-C3Xml1YG.js +1 -0
  28. package/static/chunk-C9PkSfMb.js +1 -0
  29. package/static/{chunk-WzBVBHEz.js → chunk-CLM-K-Vg.js} +1 -1
  30. package/static/chunk-CPNxRF7A.js +1 -0
  31. package/static/chunk-CRGkNzel.js +70 -0
  32. package/static/chunk-CV-FUe_H.js +1 -0
  33. package/static/chunk-CZoPJsBm.js +1 -0
  34. package/static/chunk-CuwZV6XG.js +1 -0
  35. package/static/chunk-Cvoe3MtC.js +1 -0
  36. package/static/chunk-D19C8Gcb.js +1 -0
  37. package/static/chunk-D3JZ8ur5.js +66 -0
  38. package/static/chunk-DAONFRT8.js +1 -0
  39. package/static/chunk-DDhSFoAE.js +1 -0
  40. package/static/chunk-DEF7Ge5B.js +1 -0
  41. package/static/chunk-DHC_yfIa.js +1 -0
  42. package/static/chunk-DSgUAlqN.js +1 -0
  43. package/static/chunk-DVJ9L-aC.js +1 -0
  44. package/static/chunk-DaO-gpzS.js +1 -0
  45. package/static/chunk-Dg-4XevL.js +1 -0
  46. package/static/chunk-DvWh-Q5D.js +1 -0
  47. package/static/chunk-Dx92ksvP.js +1 -0
  48. package/static/chunk-DyiDg8XX.js +1 -0
  49. package/static/chunk-VXZaUyyE.js +1 -0
  50. package/static/chunk-Ysn4Fbgj.js +1 -0
  51. package/static/chunk-ZqQUQSE8.js +1 -0
  52. package/static/chunk-hpn_m1ZC.js +1 -0
  53. package/static/chunk-pi-mtheN.js +1 -0
  54. package/static/chunk-xeQj_hSF.js +1 -0
  55. package/static/favicon-16x16.png +0 -0
  56. package/static/favicon-32x32.png +0 -0
  57. package/static/favicon.ico +0 -0
  58. package/static/favicon.svg +12 -0
  59. package/static/icon-192.png +0 -0
  60. package/static/icon-512.png +0 -0
  61. package/static/index.html +30 -5
  62. package/static/main-SI5AKDMC.js +248 -0
  63. package/static/media/inter-latin-400-normal-55WT6UWF.woff2 +0 -0
  64. package/static/media/inter-latin-400-normal-FR5HOXA4.woff +0 -0
  65. package/static/media/inter-latin-500-normal-W62DVTXI.woff2 +0 -0
  66. package/static/media/inter-latin-500-normal-ZNGIZ2YB.woff +0 -0
  67. package/static/media/inter-latin-600-normal-R6Y2SZCR.woff2 +0 -0
  68. package/static/media/inter-latin-600-normal-ZYHV6QZT.woff +0 -0
  69. package/static/media/jetbrains-mono-latin-500-normal-ETEQEOVZ.woff +0 -0
  70. package/static/media/jetbrains-mono-latin-500-normal-V4XIP5OW.woff2 +0 -0
  71. package/static/media/space-grotesk-latin-500-normal-GESQWJQV.woff2 +0 -0
  72. package/static/media/space-grotesk-latin-500-normal-HV4TE4RA.woff +0 -0
  73. package/static/media/space-grotesk-latin-700-normal-6Z7GHSI6.woff +0 -0
  74. package/static/media/space-grotesk-latin-700-normal-I3MXRIUZ.woff2 +0 -0
  75. package/static/nz-theme-dark.css +1 -0
  76. package/static/nz-theme.css +1 -0
  77. package/static/styles-JGCTKGGH.css +1 -0
  78. package/static/chunk-1SlEtaMr.js +0 -1
  79. package/static/chunk-5H-9s7GP.js +0 -7
  80. package/static/chunk-B-P3MXAn.js +0 -1
  81. package/static/chunk-B76UD1mt.js +0 -1
  82. package/static/chunk-BFYi_kYd.js +0 -1
  83. package/static/chunk-BG0Azip9.js +0 -1
  84. package/static/chunk-BWr0M-hk.js +0 -1
  85. package/static/chunk-Bpxo3nwV.js +0 -1
  86. package/static/chunk-Bw9D3p4h.js +0 -1
  87. package/static/chunk-C-T2O6LE.js +0 -1
  88. package/static/chunk-C1E15gBW.js +0 -5
  89. package/static/chunk-C1V4WljN.js +0 -1
  90. package/static/chunk-C3wpjxgW.js +0 -1
  91. package/static/chunk-C4yhGGeB.js +0 -1
  92. package/static/chunk-C5hSEJdm.js +0 -1
  93. package/static/chunk-CTkRZ4w1.js +0 -1
  94. package/static/chunk-CYX8w88D.js +0 -1
  95. package/static/chunk-Cq4-aSSE.js +0 -1
  96. package/static/chunk-Cwf9CcBI.js +0 -1
  97. package/static/chunk-D32ZkSz4.js +0 -1
  98. package/static/chunk-DE9IK0Os.js +0 -1
  99. package/static/chunk-DNtWpE65.js +0 -1
  100. package/static/chunk-DdVQ8Ilm.js +0 -66
  101. package/static/chunk-W0OF0P_2.js +0 -1
  102. package/static/chunk-XvSvuf-k.js +0 -1
  103. package/static/chunk-aWIxMbtR.js +0 -1
  104. package/static/chunk-f1UVptf5.js +0 -1
  105. package/static/chunk-vj0RDTCf.js +0 -1
  106. package/static/main-BRWQ5RNE.js +0 -249
  107. package/static/styles-6MW3GE4V.css +0 -1
package/dist/engine.js CHANGED
@@ -1,23 +1,123 @@
1
1
  #!/usr/bin/env node
2
- var d=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as tu,Get as nu}from"@nestjs/common";var ni,xr,Et,ri=d(()=>{"use strict";ni=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Et=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};ni([nu(),xr("design:type",Function),xr("design:paramtypes",[]),xr("design:returntype",Object)],Et.prototype,"getHealth",null);Et=ni([tu("health")],Et)});import{Module as ou}from"@nestjs/common";var ru,zt,oi=d(()=>{"use strict";ru=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zt=class{};zt=ru([ou({})],zt)});import{Module as su}from"@nestjs/common";var iu,Xt,ii=d(()=>{"use strict";iu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Xt=class{};Xt=iu([su({})],Xt)});var Pt,Er=d(()=>{"use strict";Pt=Symbol("NOTIFICATION_PROVIDER")});var Zt,si=d(()=>{"use strict";Zt=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});var Rt,Pr=d(()=>{"use strict";Rt=Symbol("KNOWLEDGE_PROVIDER")});import{readdir as au,readFile as cu}from"node:fs/promises";import{join as ai}from"node:path";var Yt,ci=d(()=>{"use strict";Yt=class{baseDir;constructor(e){this.baseDir=e}async resolve(e,t){let r=ai(this.baseDir,e),o;try{o=await au(r)}catch(a){if(a.code==="ENOENT")return[];throw a}let i=o.filter(a=>a.endsWith(".md")).sort(),s=[];for(let a of i){let u=ai(r,a),c=await cu(u,"utf8");s.push({tier:e,content:c,sourceRef:u})}return s}}});import{existsSync as ui}from"node:fs";import{dirname as uu,join as At}from"node:path";import{fileURLToPath as du}from"node:url";function kt(){let n=uu(du(import.meta.url)),e=At(n,"../data"),t=At(n,"../../data");return ui(At(e,"kno.db"))?e:ui(At(t,"kno.db"))?t:e}function di(){return At(kt(),"kno.db")}var en=d(()=>{"use strict"});import{createCipheriv as pu,createDecipheriv as lu,randomBytes as pi}from"node:crypto";import{mkdir as li,readFile as fi,writeFile as mi}from"node:fs/promises";import{join as Ar}from"node:path";function st(n){return`kno.${n}.apiKey`}function gu(n){return Ar(n,"secrets")}function gi(n){return new kr(gu(n.dataDir),n.keyring)}function yu(n){try{return n(tn,"__kno_probe__").getPassword(),!0}catch(e){return Tr(e)}}function Tr(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var tn,hi,fu,Rr,mu,hu,kr,oe,_e=d(()=>{"use strict";tn="kno-flows";hi="aes-256-gcm",fu=12,Rr=32,mu="master.key",hu="store.json",kr=class{secretsDir;keyring;keyringResolved=!1;masterKey=null;constructor(e,t){this.secretsDir=e,this.keyring=t,t!==void 0&&(this.keyringResolved=!0)}async get(e){let t=await this.resolveKeyring();if(t)try{let r=t(tn,e).getPassword();if(r!=null)return r}catch(r){Tr(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(tn,e).setPassword(t),await this.fileDelete(e);return}catch{this.disableKeyring()}await this.fileSet(e,t)}async delete(e){let t=await this.resolveKeyring();if(t)try{t(tn,e).deletePassword()}catch(r){Tr(r)||this.disableKeyring()}await this.fileDelete(e)}disableKeyring(){this.keyring=null,this.keyringResolved=!0}async resolveKeyring(){if(this.keyringResolved)return this.keyring??null;this.keyringResolved=!0;try{let{Entry:e}=await import("@napi-rs/keyring"),t=(r,o)=>new e(r,o);return yu(t)?(this.keyring=t,t):(this.keyring=null,null)}catch{return this.keyring=null,null}}async fileGet(e){let r=(await this.readStore())[e];return r?this.decrypt(r):null}async fileSet(e,t){let r=await this.readStore();r[e]=await this.encrypt(t),await this.writeStore(r)}async fileDelete(e){let t=await this.readStore();e in t&&(delete t[e],await this.writeStore(t))}async readStore(){try{let e=await fi(this.storePath(),"utf8"),t=JSON.parse(e);if(t==null||typeof t!="object"||Array.isArray(t))throw new Error(`Corrupt secret store at ${this.storePath()}`);return t}catch(e){if(e.code==="ENOENT")return{};throw e}}async writeStore(e){await li(this.secretsDir,{recursive:!0}),await mi(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=pi(fu),o=pu(hi,t,r),i=Buffer.concat([o.update(e,"utf8"),o.final()]);return{iv:r.toString("base64"),tag:o.getAuthTag().toString("base64"),ciphertext:i.toString("base64")}}async decrypt(e){let t=await this.loadOrCreateMasterKey(),r=lu(hi,t,Buffer.from(e.iv,"base64"));return r.setAuthTag(Buffer.from(e.tag,"base64")),Buffer.concat([r.update(Buffer.from(e.ciphertext,"base64")),r.final()]).toString("utf8")}async loadOrCreateMasterKey(){if(this.masterKey)return this.masterKey;await li(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await fi(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==Rr)throw new Error(`Secret store master key at ${e} is not ${Rr} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=pi(Rr);return await mi(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return Ar(this.secretsDir,hu)}masterKeyPath(){return Ar(this.secretsDir,mu)}};oe=Symbol("SECRET_STORE")});import{Module as bu}from"@nestjs/common";import{mkdirSync as Su}from"node:fs";var wu,yi,at,Or=d(()=>{"use strict";en();_e();wu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},yi=kt();Su(yi,{recursive:!0});at=class{};at=wu([bu({providers:[{provide:oe,useFactory:()=>gi({dataDir:yi})}],exports:[oe]})],at)});import{index as Iu,sqliteTable as ju,text as pe}from"drizzle-orm/sqlite-core";var $e,qr=d(()=>{"use strict";$e=ju("workflow_definitions",{id:pe("id").primaryKey(),name:pe("name").notNull(),description:pe("description"),appliesTo:pe("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:pe("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:pe("input_schema",{mode:"json"}).$type().notNull(),steps:pe("steps",{mode:"json"}).$type().notNull(),notificationPolicy:pe("notification_policy",{mode:"json"}).$type().notNull(),createdAt:pe("created_at").notNull(),updatedAt:pe("updated_at").notNull()},n=>[Iu("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as wi,integer as vu,sqliteTable as _u,text as Ce}from"drizzle-orm/sqlite-core";var le,$r=d(()=>{"use strict";le=_u("subject_views",{id:Ce("id").primaryKey(),name:Ce("name").notNull(),subjectType:Ce("subject_type").$type().notNull(),workflowId:Ce("workflow_id").notNull(),query:Ce("query",{mode:"json"}).$type().notNull(),description:Ce("description"),queryTemplate:Ce("query_template",{mode:"json"}).$type(),providerInstanceId:Ce("provider_instance_id").notNull().default(""),order:vu("order").notNull().default(0)},n=>[wi("subject_views_subject_type_idx").on(n.subjectType),wi("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as bi,integer as xu,sqliteTable as Eu,text as fe}from"drizzle-orm/sqlite-core";var De,nn=d(()=>{"use strict";De=Eu("job_batches",{id:fe("id").primaryKey(),workflowId:fe("workflow_id").notNull(),selection:fe("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:fe("resolved_subjects",{mode:"json"}).$type().notNull(),status:fe("status",{enum:["running","completed","completed_with_issues","failed"]}).notNull(),triggeredBy:fe("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:fe("schedule_id"),notificationOverride:fe("notification_override",{mode:"json"}).$type(),notificationSent:xu("notification_sent",{mode:"boolean"}).notNull(),createdAt:fe("created_at").notNull(),completedAt:fe("completed_at")},n=>[bi("job_batches_workflow_id_idx").on(n.workflowId),bi("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as rn,integer as Pu,sqliteTable as Ru,text as C}from"drizzle-orm/sqlite-core";var B,Tt=d(()=>{"use strict";nn();B=Ru("jobs",{id:C("id").primaryKey(),workflowId:C("workflow_id").notNull(),status:C("status").$type().notNull(),selection:C("selection",{mode:"json"}).$type(),batchId:C("batch_id").references(()=>De.id),parentJobId:C("parent_job_id"),parentStepExecutionId:C("parent_step_execution_id"),fanOutIndex:Pu("fan_out_index"),retryOf:C("retry_of"),workflowSnapshot:C("workflow_snapshot",{mode:"json"}).$type(),context:C("context",{mode:"json"}).$type().notNull(),worktreePath:C("worktree_path"),branch:C("branch"),currentStepId:C("current_step_id"),currentStepExecutionId:C("current_step_execution_id"),createdAt:C("created_at").notNull(),updatedAt:C("updated_at").notNull(),completedAt:C("completed_at")},n=>[rn("jobs_workflow_id_idx").on(n.workflowId),rn("jobs_status_idx").on(n.status),rn("jobs_batch_id_idx").on(n.batchId),rn("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as Si,sqliteTable as Au,text as Ot}from"drizzle-orm/sqlite-core";var me,Cr=d(()=>{"use strict";Tt();me=Au("job_subjects",{id:Ot("id").primaryKey(),jobId:Ot("job_id").notNull().references(()=>B.id),subjectType:Ot("subject_type").$type().notNull(),subjectId:Ot("subject_id").notNull(),snapshot:Ot("snapshot",{mode:"json"}).$type().notNull()},n=>[Si("job_subjects_job_id_idx").on(n.jobId),Si("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as Ii,integer as ku,sqliteTable as Tu,text as ie}from"drizzle-orm/sqlite-core";var ze,Dr=d(()=>{"use strict";Tt();ze=Tu("job_step_executions",{id:ie("id").primaryKey(),jobId:ie("job_id").notNull().references(()=>B.id),stepDefinitionId:ie("step_definition_id").notNull(),type:ie("type").$type().notNull(),status:ie("status").$type().notNull(),startedAt:ie("started_at"),completedAt:ie("completed_at"),output:ie("output",{mode:"json"}).$type(),error:ie("error"),childJobIds:ie("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:ie("parent_step_execution_id").references(()=>ze.id),iterationIndex:ku("iteration_index")},n=>[Ii("job_step_executions_job_id_idx").on(n.jobId),Ii("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as Ou,integer as qu,sqliteTable as $u,text as Be}from"drizzle-orm/sqlite-core";var Ne,Br=d(()=>{"use strict";Ne=$u("schedules",{id:Be("id").primaryKey(),viewId:Be("view_id").notNull(),triggerType:Be("trigger_type",{enum:["cron"]}).notNull(),cadence:Be("cadence").notNull(),notificationOverride:Be("notification_override",{mode:"json"}).$type(),missedFirePolicy:Be("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:qu("enabled",{mode:"boolean"}).notNull(),lastFiredAt:Be("last_fired_at"),createdAt:Be("created_at").notNull()},n=>[Ou("schedules_enabled_idx").on(n.enabled)])});import{integer as Cu,sqliteTable as Du,text as qt}from"drizzle-orm/sqlite-core";var he,Nr=d(()=>{"use strict";he=Du("workflow_shortcuts",{id:qt("id").primaryKey(),name:qt("name").notNull(),workflowId:qt("workflow_id").notNull(),inputValues:qt("input_values",{mode:"json"}).$type().notNull(),lastJobId:qt("last_job_id"),order:Cu("order").notNull().default(0)})});import{sqliteTable as Bu,text as ji}from"drizzle-orm/sqlite-core";var $t,ct,Fr=d(()=>{"use strict";$t="default",ct=Bu("settings",{id:ji("id").primaryKey(),data:ji("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Nu}from"drizzle-orm";var Fu,vi,_i=d(()=>{"use strict";qr();$r();Tt();Cr();Dr();nn();Br();Nr();Fr();Fu={workflowDefinitions:$e,subjectViews:le,jobs:B,jobSubjects:me,jobStepExecutions:ze,jobBatches:De,schedules:Ne,workflowShortcuts:he,settings:ct},vi=Nu(Fu,n=>({workflowDefinitions:{},subjectViews:{},schedules:{},workflowShortcuts:{},settings:{},jobs:{subjects:n.many.jobSubjects({from:n.jobs.id,to:n.jobSubjects.jobId}),stepExecutions:n.many.jobStepExecutions({from:n.jobs.id,to:n.jobStepExecutions.jobId}),batch:n.one.jobBatches({from:n.jobs.batchId,to:n.jobBatches.id})},jobSubjects:{job:n.one.jobs({from:n.jobSubjects.jobId,to:n.jobs.id})},jobStepExecutions:{job:n.one.jobs({from:n.jobStepExecutions.jobId,to:n.jobs.id}),parent:n.one.jobStepExecutions({from:n.jobStepExecutions.parentStepExecutionId,to:n.jobStepExecutions.id,alias:"job_step_executions_parent"}),children:n.many.jobStepExecutions({from:n.jobStepExecutions.id,to:n.jobStepExecutions.parentStepExecutionId,alias:"job_step_executions_children"})},jobBatches:{jobs:n.many.jobs({from:n.jobBatches.id,to:n.jobs.batchId})}}))});import{drizzle as Ju}from"drizzle-orm/node-sqlite";import{DatabaseSync as cg}from"node:sqlite";function xi(n){return n.exec("PRAGMA foreign_keys = ON;"),Ju({client:n,relations:vi})}var Ei=d(()=>{"use strict";_i()});import{existsSync as Pi,readdirSync as Uu}from"node:fs";import{dirname as Mu,join as Jr}from"node:path";import{fileURLToPath as Hu}from"node:url";function Ri(){let n=Mu(Hu(import.meta.url)),e=[Jr(n,"persistence/migrations"),Jr(n,"migrations")];for(let t of e)if(Lu(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function Lu(n){return Pi(n)?Uu(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&Pi(Jr(n,e.name,"migration.sql"))):!1}var Ai=d(()=>{"use strict"});import{migrate as ki}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as Ku}from"drizzle-orm/migrator";function Hr(n,e){let t=Ri(),r=Ku({migrationsFolder:t});if(r.length===0)throw new X(`No SQL migrations in ${t}`);let o=Ur(n,Xe),i=Oi.filter(u=>Ur(n,u));if(!o&&i.length===0){ki(e,{migrationsFolder:t}),Ti(n);return}if(!o){let u=Mr(n);if(u.length>0)throw new X(`existing database has a partial schema and cannot be upgraded automatically (${u.join("; ")}). Restore a backup or start from an empty database.`);Gu(n,r);return}Vu(n,r);let s=Mr(n),a=$i(n);if(a.length===0&&i.length>0)throw new X("migrations table exists but is empty while application tables are present \u2014 treating this as an interrupted update");if(a.length>0&&s.length>0)throw new X(`migrations journal is present but the schema is incomplete (${s.join("; ")}) \u2014 treating this as an interrupted update`);ki(e,{migrationsFolder:t}),Ti(n)}function Ur(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function qi(n,e){return n.prepare(`PRAGMA table_info(${e})`).all().map(r=>r.name)}function Mr(n){let e=[];for(let t of Oi){if(!Ur(n,t)){e.push(`missing table '${t}'`);continue}let r=new Set(qi(n,t));for(let o of Wu[t])r.has(o)||e.push(`table '${t}' is missing column '${o}'`)}return e}function Ti(n){let e=Mr(n);if(e.length>0)throw new X(`schema is incomplete after migrate (${e.join("; ")})`)}function $i(n){let e=new Set(qi(n,Xe));if(!e.has("hash"))throw new X(`migrations table '${Xe}' is missing required columns`);if(!e.has("name"))throw new X(`migrations table '${Xe}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${Xe}`).all()}function Vu(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of $i(n)){if(r.name==null||r.name==="")throw new X("migrations journal has a row with no name \u2014 treating this as an interrupted update");let o=t.get(r.name);if(!o)throw new X(`database has unknown migration '${r.name}' that is not in this Engine build`);if(r.hash!=null&&r.hash!==o.hash)throw new X(`migration '${r.name}' hash does not match this Engine build \u2014 treating this as a corrupt or interrupted update`)}}function Gu(n,e){n.exec(`
3
- CREATE TABLE IF NOT EXISTS ${Xe} (
2
+ var l=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as fd,Get as md}from"@nestjs/common";var da,ri,Sn,fa=l(()=>{"use strict";da=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ri=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Sn=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};da([md(),ri("design:type",Function),ri("design:paramtypes",[]),ri("design:returntype",Object)],Sn.prototype,"getHealth",null);Sn=da([fd("health")],Sn)});import{Module as yd}from"@nestjs/common";var hd,tr,ma=l(()=>{"use strict";hd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},tr=class{};tr=hd([yd({})],tr)});import{Module as wd}from"@nestjs/common";var gd,nr,ha=l(()=>{"use strict";gd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},nr=class{};nr=gd([wd({})],nr)});var xn,oi=l(()=>{"use strict";xn=Symbol("NOTIFICATION_PROVIDER")});var rr,ya=l(()=>{"use strict";rr=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});import{existsSync as ga}from"node:fs";import{dirname as bd,join as vn}from"node:path";import{fileURLToPath as Sd}from"node:url";function jn(){let n=bd(Sd(import.meta.url)),e=vn(n,"../data"),t=vn(n,"../../data");return ga(vn(e,"kno.db"))?e:ga(vn(t,"kno.db"))?t:e}function wa(){return vn(jn(),"kno.db")}var or=l(()=>{"use strict"});import{createCipheriv as xd,createDecipheriv as vd,randomBytes as ba}from"node:crypto";import{mkdir as Sa,readFile as xa,writeFile as va}from"node:fs/promises";import{join as si}from"node:path";function Ht(n){return`kno.${n}.apiKey`}function Pd(n){return si(n,"secrets")}function Ia(n){return new ai(Pd(n.dataDir),n.keyring)}function Ed(n){try{return n(ir,"__kno_probe__").getPassword(),!0}catch(e){return ci(e)}}function ci(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var ir,ja,jd,ii,Id,_d,ai,oe,Ce=l(()=>{"use strict";ir="kno-flows";ja="aes-256-gcm",jd=12,ii=32,Id="master.key",_d="store.json",ai=class{secretsDir;keyring;keyringResolved=!1;masterKey=null;constructor(e,t){this.secretsDir=e,this.keyring=t,t!==void 0&&(this.keyringResolved=!0)}async get(e){let t=await this.resolveKeyring();if(t)try{let r=t(ir,e).getPassword();if(r!=null)return r}catch(r){ci(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(ir,e).setPassword(t),await this.fileDelete(e);return}catch{this.disableKeyring()}await this.fileSet(e,t)}async delete(e){let t=await this.resolveKeyring();if(t)try{t(ir,e).deletePassword()}catch(r){ci(r)||this.disableKeyring()}await this.fileDelete(e)}disableKeyring(){this.keyring=null,this.keyringResolved=!0}async resolveKeyring(){if(this.keyringResolved)return this.keyring??null;this.keyringResolved=!0;try{let{Entry:e}=await import("@napi-rs/keyring"),t=(r,o)=>new e(r,o);return Ed(t)?(this.keyring=t,t):(this.keyring=null,null)}catch{return this.keyring=null,null}}async fileGet(e){let r=(await this.readStore())[e];return r?this.decrypt(r):null}async fileSet(e,t){let r=await this.readStore();r[e]=await this.encrypt(t),await this.writeStore(r)}async fileDelete(e){let t=await this.readStore();e in t&&(delete t[e],await this.writeStore(t))}async readStore(){try{let e=await xa(this.storePath(),"utf8"),t=JSON.parse(e);if(t==null||typeof t!="object"||Array.isArray(t))throw new Error(`Corrupt secret store at ${this.storePath()}`);return t}catch(e){if(e.code==="ENOENT")return{};throw e}}async writeStore(e){await Sa(this.secretsDir,{recursive:!0}),await va(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=ba(jd),o=xd(ja,t,r),i=Buffer.concat([o.update(e,"utf8"),o.final()]);return{iv:r.toString("base64"),tag:o.getAuthTag().toString("base64"),ciphertext:i.toString("base64")}}async decrypt(e){let t=await this.loadOrCreateMasterKey(),r=vd(ja,t,Buffer.from(e.iv,"base64"));return r.setAuthTag(Buffer.from(e.tag,"base64")),Buffer.concat([r.update(Buffer.from(e.ciphertext,"base64")),r.final()]).toString("utf8")}async loadOrCreateMasterKey(){if(this.masterKey)return this.masterKey;await Sa(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await xa(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==ii)throw new Error(`Secret store master key at ${e} is not ${ii} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=ba(ii);return await va(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return si(this.secretsDir,_d)}masterKeyPath(){return si(this.secretsDir,Id)}};oe=Symbol("SECRET_STORE")});import{Module as Rd}from"@nestjs/common";import{mkdirSync as Ad}from"node:fs";var kd,_a,Vt,ui=l(()=>{"use strict";or();Ce();kd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},_a=jn();Ad(_a,{recursive:!0});Vt=class{};Vt=kd([Rd({providers:[{provide:oe,useFactory:()=>Ia({dataDir:_a})}],exports:[oe]})],Vt)});import{index as Cd,sqliteTable as Td,text as Te}from"drizzle-orm/sqlite-core";var tt,li=l(()=>{"use strict";tt=Td("workflow_definitions",{id:Te("id").primaryKey(),name:Te("name").notNull(),description:Te("description"),appliesTo:Te("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:Te("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:Te("input_schema",{mode:"json"}).$type().notNull(),steps:Te("steps",{mode:"json"}).$type().notNull(),notificationPolicy:Te("notification_policy",{mode:"json"}).$type().notNull(),createdAt:Te("created_at").notNull(),updatedAt:Te("updated_at").notNull()},n=>[Cd("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as Pa,integer as $d,sqliteTable as Od,text as nt}from"drizzle-orm/sqlite-core";var $e,pi=l(()=>{"use strict";$e=Od("subject_views",{id:nt("id").primaryKey(),name:nt("name").notNull(),subjectType:nt("subject_type").$type().notNull(),workflowId:nt("workflow_id").notNull(),query:nt("query",{mode:"json"}).$type().notNull(),description:nt("description"),queryTemplate:nt("query_template",{mode:"json"}).$type(),providerInstanceId:nt("provider_instance_id").notNull().default(""),order:$d("order").notNull().default(0)},n=>[Pa("subject_views_subject_type_idx").on(n.subjectType),Pa("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as Ea,integer as qd,sqliteTable as Dd,text as Oe}from"drizzle-orm/sqlite-core";var rt,sr=l(()=>{"use strict";rt=Dd("job_batches",{id:Oe("id").primaryKey(),workflowId:Oe("workflow_id").notNull(),selection:Oe("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:Oe("resolved_subjects",{mode:"json"}).$type().notNull(),status:Oe("status",{enum:["running","completed","completed_with_issues","failed","cancelled"]}).notNull(),triggeredBy:Oe("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:Oe("schedule_id"),notificationOverride:Oe("notification_override",{mode:"json"}).$type(),notificationSent:qd("notification_sent",{mode:"boolean"}).notNull(),createdAt:Oe("created_at").notNull(),completedAt:Oe("completed_at")},n=>[Ea("job_batches_workflow_id_idx").on(n.workflowId),Ea("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as ar,integer as Bd,sqliteTable as Fd,text as M}from"drizzle-orm/sqlite-core";var H,In=l(()=>{"use strict";sr();H=Fd("jobs",{id:M("id").primaryKey(),workflowId:M("workflow_id").notNull(),status:M("status").$type().notNull(),selection:M("selection",{mode:"json"}).$type(),batchId:M("batch_id").references(()=>rt.id),parentJobId:M("parent_job_id"),parentStepExecutionId:M("parent_step_execution_id"),fanOutIndex:Bd("fan_out_index"),retryOf:M("retry_of"),workflowSnapshot:M("workflow_snapshot",{mode:"json"}).$type(),context:M("context",{mode:"json"}).$type().notNull(),worktreePath:M("worktree_path"),branch:M("branch"),worktreeDeletedAt:M("worktree_deleted_at"),currentStepId:M("current_step_id"),currentStepExecutionId:M("current_step_execution_id"),createdAt:M("created_at").notNull(),updatedAt:M("updated_at").notNull(),completedAt:M("completed_at")},n=>[ar("jobs_workflow_id_idx").on(n.workflowId),ar("jobs_status_idx").on(n.status),ar("jobs_batch_id_idx").on(n.batchId),ar("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as ka,sqliteTable as Nd,text as _n}from"drizzle-orm/sqlite-core";var qe,di=l(()=>{"use strict";In();qe=Nd("job_subjects",{id:_n("id").primaryKey(),jobId:_n("job_id").notNull().references(()=>H.id),subjectType:_n("subject_type").$type().notNull(),subjectId:_n("subject_id").notNull(),snapshot:_n("snapshot",{mode:"json"}).$type().notNull()},n=>[ka("job_subjects_job_id_idx").on(n.jobId),ka("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as Ra,integer as Ld,sqliteTable as Jd,text as ue}from"drizzle-orm/sqlite-core";var It,fi=l(()=>{"use strict";In();It=Jd("job_step_executions",{id:ue("id").primaryKey(),jobId:ue("job_id").notNull().references(()=>H.id),stepDefinitionId:ue("step_definition_id").notNull(),type:ue("type").$type().notNull(),status:ue("status").$type().notNull(),startedAt:ue("started_at"),completedAt:ue("completed_at"),output:ue("output",{mode:"json"}).$type(),error:ue("error"),failureDetails:ue("failure_details",{mode:"json"}).$type(),childJobIds:ue("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:ue("parent_step_execution_id").references(()=>It.id),iterationIndex:Ld("iteration_index")},n=>[Ra("job_step_executions_job_id_idx").on(n.jobId),Ra("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as Ud,integer as Md,sqliteTable as Wd,text as ot}from"drizzle-orm/sqlite-core";var it,mi=l(()=>{"use strict";it=Wd("schedules",{id:ot("id").primaryKey(),viewId:ot("view_id").notNull(),triggerType:ot("trigger_type",{enum:["cron"]}).notNull(),cadence:ot("cadence").notNull(),notificationOverride:ot("notification_override",{mode:"json"}).$type(),missedFirePolicy:ot("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:Md("enabled",{mode:"boolean"}).notNull(),lastFiredAt:ot("last_fired_at"),createdAt:ot("created_at").notNull()},n=>[Ud("schedules_enabled_idx").on(n.enabled)])});import{integer as Kd,sqliteTable as Hd,text as Pn}from"drizzle-orm/sqlite-core";var De,hi=l(()=>{"use strict";De=Hd("workflow_shortcuts",{id:Pn("id").primaryKey(),name:Pn("name").notNull(),workflowId:Pn("workflow_id").notNull(),inputValues:Pn("input_values",{mode:"json"}).$type().notNull(),lastJobId:Pn("last_job_id"),order:Kd("order").notNull().default(0)})});import{sqliteTable as Vd,text as En}from"drizzle-orm/sqlite-core";var st,yi=l(()=>{"use strict";st=Vd("context_files",{id:En("id").primaryKey(),name:En("name").notNull(),description:En("description"),tier:En("tier").$type().notNull(),path:En("path").notNull()})});import{sqliteTable as Gd,text as kn}from"drizzle-orm/sqlite-core";var at,gi=l(()=>{"use strict";at=Gd("local_repositories",{id:kn("id").primaryKey(),name:kn("name").notNull(),localPath:kn("local_path").notNull(),worktreeBasePath:kn("worktree_base_path"),defaultBranch:kn("default_branch")})});import{sqliteTable as Qd,text as Aa}from"drizzle-orm/sqlite-core";var Rn,Gt,wi=l(()=>{"use strict";Rn="default",Gt=Qd("settings",{id:Aa("id").primaryKey(),data:Aa("data",{mode:"json"}).$type().notNull()})});import{defineRelations as zd}from"drizzle-orm";var Yd,Ca,Ta=l(()=>{"use strict";li();pi();In();di();fi();sr();mi();hi();yi();gi();wi();Yd={workflowDefinitions:tt,subjectViews:$e,jobs:H,jobSubjects:qe,jobStepExecutions:It,jobBatches:rt,schedules:it,workflowShortcuts:De,contextFiles:st,localRepositories:at,settings:Gt},Ca=zd(Yd,n=>({workflowDefinitions:{},subjectViews:{},schedules:{},workflowShortcuts:{},contextFiles:{},localRepositories:{},settings:{},jobs:{subjects:n.many.jobSubjects({from:n.jobs.id,to:n.jobSubjects.jobId}),stepExecutions:n.many.jobStepExecutions({from:n.jobs.id,to:n.jobStepExecutions.jobId}),batch:n.one.jobBatches({from:n.jobs.batchId,to:n.jobBatches.id})},jobSubjects:{job:n.one.jobs({from:n.jobSubjects.jobId,to:n.jobs.id})},jobStepExecutions:{job:n.one.jobs({from:n.jobStepExecutions.jobId,to:n.jobs.id}),parent:n.one.jobStepExecutions({from:n.jobStepExecutions.parentStepExecutionId,to:n.jobStepExecutions.id,alias:"job_step_executions_parent"}),children:n.many.jobStepExecutions({from:n.jobStepExecutions.id,to:n.jobStepExecutions.parentStepExecutionId,alias:"job_step_executions_children"})},jobBatches:{jobs:n.many.jobs({from:n.jobBatches.id,to:n.jobs.batchId})}}))});import{drizzle as Xd}from"drizzle-orm/node-sqlite";import{DatabaseSync as sx}from"node:sqlite";function $a(n){return n.exec("PRAGMA foreign_keys = ON;"),Xd({client:n,relations:Ca})}var Oa=l(()=>{"use strict";Ta()});import{existsSync as qa,readdirSync as Zd}from"node:fs";import{dirname as ef,join as bi}from"node:path";import{fileURLToPath as tf}from"node:url";function Da(){let n=ef(tf(import.meta.url)),e=[bi(n,"persistence/migrations"),bi(n,"migrations")];for(let t of e)if(nf(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function nf(n){return qa(n)?Zd(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&qa(bi(n,e.name,"migration.sql"))):!1}var Ba=l(()=>{"use strict"});import{migrate as Fa}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as rf}from"drizzle-orm/migrator";function xi(n,e,t={}){let r=t.log??(()=>{}),o=Da(),i=rf({migrationsFolder:o});if(i.length===0)throw new be(`No SQL migrations in ${o}`);let s=sf(i),a=Tn(n,_t),u=of.filter(x=>Tn(n,x));if(!a&&u.length===0){Fa(e,{migrationsFolder:o}),Si(n,s);return}if(!a){lf(n,s,r),df(n,i),Si(n,s);return}pf(n,i);let c=La(n,s),p=Ja(n);if(p.length===0&&u.length>0)throw new be("migrations table exists but is empty while application tables are present \u2014 treating this as an interrupted update");let m=new Set(p.map(x=>x.name).filter(x=>x!=null&&x!==""));if(i.filter(x=>!m.has(x.name)).length===0&&c.length>0)throw new be(`migrations journal is present but the schema is incomplete (${c.join("; ")}) \u2014 treating this as an interrupted update`);Fa(e,{migrationsFolder:o}),Si(n,s)}function sf(n){let e=[],t=[],r=[];for(let o of n)for(let i of o.sql){let s=i.trim().replace(/;+\s*$/,"");if(!s)continue;let a=af(s);if(a){e.push(a);continue}let u=cf(s);if(u){r.push(u);continue}let c=uf(s);c&&t.push(c)}return{tables:e,indexes:t,alterColumns:r}}function af(n){let e=n.match(/^CREATE TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s*\(/i);if(!e)return null;let t=n.indexOf("("),r=n.lastIndexOf(")");if(t<0||r<t)return null;let o=[];for(let i of n.slice(t+1,r).split(`
3
+ `)){let s=i.trim().replace(/,+\s*$/,"");if(!s||/^(CONSTRAINT|PRIMARY KEY|UNIQUE|FOREIGN KEY|CHECK)\b/i.test(s))continue;let a=s.match(/^(`[^`]+`|"[^"]+"|\w+)\s+(\w+)/);a&&o.push({name:Cn(a[1]),type:a[2]})}return{name:Cn(e[1]),createSql:`${n};`,columns:o}}function cf(n){let e=n.match(/^ALTER TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s+ADD(?:\s+COLUMN)?\s+(`[^`]+`|"[^"]+"|\w+)\s+(\w+)/i);return e?{table:Cn(e[1]),name:Cn(e[2]),type:e[3]}:null}function uf(n){let e=n.match(/^CREATE INDEX\s+(?:IF NOT EXISTS\s+)?(`[^`]+`|"[^"]+"|\w+)/i);if(!e)return null;let t=/^CREATE INDEX\s+IF NOT EXISTS\b/i.test(n)?n:n.replace(/^CREATE INDEX\b/i,"CREATE INDEX IF NOT EXISTS");return{name:Cn(e[1]),sql:`${t};`}}function Cn(n){return n.replace(/^["`]|["`]$/g,"")}function An(n){return`\`${n.replace(/`/g,"")}\``}function lf(n,e,t){t("Legacy push-mode database detected (application tables present, no migration journal). Reconciling schema in place.");let r=[],o=[],i=[];n.exec("BEGIN");try{for(let s of e.tables){if(!Tn(n,s.name)){n.exec(s.createSql),r.push(s.name);continue}let a=new Set(cr(n,s.name));for(let u of s.columns)a.has(u.name)||(n.exec(`ALTER TABLE ${An(s.name)} ADD COLUMN ${An(u.name)} ${u.type}`),a.add(u.name),o.push(`${s.name}.${u.name}`))}for(let s of e.alterColumns)Tn(n,s.table)&&(cr(n,s.table).includes(s.name)||(n.exec(`ALTER TABLE ${An(s.table)} ADD COLUMN ${An(s.name)} ${s.type}`),o.push(`${s.table}.${s.name}`)));for(let s of e.indexes)Na(n,s.name)||(n.exec(s.sql),i.push(s.name));n.exec("COMMIT")}catch(s){throw n.exec("ROLLBACK"),s}for(let s of r)t(`Reconciliation: created table '${s}'`);for(let s of o)t(`Reconciliation: added column ${s}`);for(let s of i)t(`Reconciliation: created index '${s}'`);r.length===0&&o.length===0&&i.length===0&&t("Reconciliation: schema already matched the current baseline; nothing to add."),t("Reconciliation complete. Recording baseline as applied; future startups use normal migrations.")}function Tn(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function Na(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'index' AND name = ?").get(e)!=null}function cr(n,e){return n.prepare(`PRAGMA table_info(${An(e)})`).all().map(r=>r.name)}function La(n,e){let t=[],r=new Map;for(let o of e.tables)r.set(o.name,new Set(o.columns.map(i=>i.name)));for(let o of e.alterColumns){let i=r.get(o.table)??new Set;i.add(o.name),r.set(o.table,i)}for(let[o,i]of r){if(!Tn(n,o)){t.push(`missing table '${o}'`);continue}let s=new Set(cr(n,o));for(let a of i)s.has(a)||t.push(`table '${o}' is missing column '${a}'`)}for(let o of e.indexes)Na(n,o.name)||t.push(`missing index '${o.name}'`);return t}function Si(n,e){let t=La(n,e);if(t.length>0)throw new be(`schema is incomplete after migrate (${t.join("; ")})`)}function Ja(n){let e=new Set(cr(n,_t));if(!e.has("hash"))throw new be(`migrations table '${_t}' is missing required columns`);if(!e.has("name"))throw new be(`migrations table '${_t}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${_t}`).all()}function pf(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of Ja(n)){if(r.name==null||r.name==="")throw new be("migrations journal has a row with no name \u2014 treating this as an interrupted update");let o=t.get(r.name);if(!o)throw new be(`database has unknown migration '${r.name}' that is not in this Engine build`);if(r.hash!=null&&r.hash!==o.hash)throw new be(`migration '${r.name}' hash does not match this Engine build \u2014 treating this as a corrupt or interrupted update`)}}function df(n,e){n.exec(`
4
+ CREATE TABLE IF NOT EXISTS ${_t} (
4
5
  id INTEGER PRIMARY KEY,
5
6
  hash text NOT NULL,
6
7
  created_at numeric,
7
8
  name text,
8
9
  applied_at TEXT
9
10
  )
10
- `);let t=n.prepare(`INSERT INTO ${Xe} (hash, created_at, name, applied_at) VALUES (?, ?, ?, ?)`),r=new Date().toISOString();n.exec("BEGIN");try{for(let o of e)t.run(o.hash,o.folderMillis,o.name,r);n.exec("COMMIT")}catch(o){throw n.exec("ROLLBACK"),o}}var Xe,X,Oi,Wu,Ci=d(()=>{"use strict";Ai();Xe="__drizzle_migrations",X=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},Oi=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","settings"],Wu={workflow_definitions:["id","subject_handling","steps","notification_policy"],subject_views:["id","workflow_id","query_template","provider_instance_id","order"],job_batches:["id","resolved_subjects","schedule_id"],jobs:["id","fan_out_index","current_step_execution_id","workflow_snapshot","batch_id"],job_subjects:["id","job_id","subject_id","snapshot"],job_step_executions:["id","job_id","parent_step_execution_id","iteration_index"],schedules:["id","view_id","cadence","enabled"],workflow_shortcuts:["id","workflow_id","order"],settings:["id","data"]}});import{Injectable as Xu}from"@nestjs/common";import{mkdirSync as Zu}from"node:fs";import{dirname as Yu}from"node:path";import{DatabaseSync as Di}from"node:sqlite";var Qu,zu,Z,Bi=d(()=>{"use strict";en();Ei();Ci();Qu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=class{sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??di();t===":memory:"?this.sqlite=new Di(":memory:"):(Zu(Yu(t),{recursive:!0}),this.sqlite=new Di(t)),this.db=xi(this.sqlite),Hr(this.sqlite,this.db)}async onModuleInit(){Hr(this.sqlite,this.db)}getDb(){return this.db}getSqlite(){return this.sqlite}};Z=Qu([Xu(),zu("design:paramtypes",[])],Z)});import{Injectable as nd}from"@nestjs/common";import{eq as Ni}from"drizzle-orm";var ed,td,q,ut=d(()=>{"use strict";qr();ed=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},td=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},q=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){let t=new Date().toISOString();return await this.db.insert($e).values({id:e.id,name:e.name,description:e.description??null,appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy,createdAt:t,updatedAt:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowDefinitions.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update($e).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,appliesTo:t.appliesTo??r.appliesTo,subjectHandling:t.subjectHandling??r.subjectHandling,inputSchema:t.inputSchema??r.inputSchema,steps:t.steps??r.steps,notificationPolicy:t.notificationPolicy??r.notificationPolicy,updatedAt:new Date().toISOString()}).where(Ni($e.id,e)),this.get(e)):null}async list(e={}){return(e.subjectHandling?await this.db.query.workflowDefinitions.findMany({where:{subjectHandling:e.subjectHandling}}):await this.db.query.workflowDefinitions.findMany()).map(r=>this.toDomain(r))}async delete(e){if(!await this.get(e))return!1;try{this.sqlite?.exec("PRAGMA foreign_keys = OFF"),await this.db.delete($e).where(Ni($e.id,e))}finally{this.sqlite?.exec("PRAGMA foreign_keys = ON")}return!0}toDomain(e){return{id:e.id,name:e.name,...e.description!=null?{description:e.description}:{},appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy}}};q=ed([nd(),td("design:paramtypes",[Object,Function])],q)});import{Injectable as id}from"@nestjs/common";import{eq as Lr}from"drizzle-orm";var rd,od,Fi,Y,on=d(()=>{"use strict";$r();rd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},od=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Fi=["ticket","pull_request","documentation"],Y=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert(le).values({id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,query:e.query,description:e.description??null,queryTemplate:e.queryTemplate??null,providerInstanceId:e.providerInstanceId,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.subjectViews.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.queryTemplate!==void 0?t.queryTemplate:t.query!==void 0?void 0:r.queryTemplate;return await this.db.update(le).set({name:t.name??r.name,subjectType:t.subjectType??r.subjectType,workflowId:t.workflowId??r.workflowId,query:t.query??r.query,description:t.description!==void 0?t.description??null:r.description??null,queryTemplate:o??null,providerInstanceId:t.providerInstanceId??r.providerInstanceId}).where(Lr(le.id,e)),this.get(e)}async list(e={}){let t=e.subjectType?await this.db.query.subjectViews.findMany({where:{subjectType:e.subjectType}}):await this.db.query.subjectViews.findMany();return this.sortViews(t.map(r=>this.toDomain(r)))}async reorder(e){let t=[];for(let o of e){let i=await this.get(o);if(!i)return[];t.push(i)}let r=t[0].subjectType;if(!t.every(o=>o.subjectType===r))return[];for(let o=0;o<e.length;o+=1)await this.db.update(le).set({order:o}).where(Lr(le.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(le).where(Lr(le.id,e)),!0):!1}async nextOrder(e){let t=await this.db.query.subjectViews.findMany({where:{subjectType:e}});return t.length===0?0:Math.max(...t.map(r=>r.order))+1}sortViews(e){return[...e].sort((t,r)=>{let o=Fi.indexOf(t.subjectType)-Fi.indexOf(r.subjectType);return o!==0?o:t.order-r.order})}toDomain(e){return{id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,providerInstanceId:e.providerInstanceId,query:e.query,order:e.order,...e.description!=null?{description:e.description}:{},...e.queryTemplate!=null?{queryTemplate:e.queryTemplate}:{}}}};Y=rd([id(),od("design:paramtypes",[Object])],Y)});import{Injectable as cd}from"@nestjs/common";import{and as ud,desc as dd,eq as Ct,inArray as pd}from"drizzle-orm";import{randomUUID as ld}from"node:crypto";function fd(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function md(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function Ui(n,e,t=null,r=null){let o=[];for(let i of e)if(o.push({id:i.id,jobId:n,stepDefinitionId:i.stepDefinitionId,type:i.type,status:i.status,startedAt:i.startedAt??null,completedAt:i.completedAt??null,output:i.output??null,error:i.error??null,childJobIds:i.childJobIds??null,parentStepExecutionId:t,iterationIndex:r}),i.iterations)for(let s of i.iterations)o.push(...Ui(n,s.stepExecutions,i.id,s.index));return o}function hd(n){let e=new Map;for(let o of n){let i=o.parentStepExecutionId,s=e.get(i)??[];s.push(o),e.set(i,s)}let t=o=>{let i=e.get(o)??[];if(i.length===0)return;let s=new Map;for(let a of i){if(a.iterationIndex==null)continue;let u=s.get(a.iterationIndex)??[];u.push(a),s.set(a.iterationIndex,u)}if(s.size!==0)return[...s.entries()].sort(([a],[u])=>a-u).map(([a,u])=>{let c=u.map(f=>Ji(f,t(f.id)));return{index:a,stepExecutions:c,startedAt:gd(c),...wd(c)?{completedAt:yd(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Ji(o,t(o.id)))}function Ji(n,e){return{id:n.id,stepDefinitionId:n.stepDefinitionId,type:n.type,status:n.status,...n.startedAt!=null?{startedAt:n.startedAt}:{},...n.completedAt!=null?{completedAt:n.completedAt}:{},...n.output!==null&&n.output!==void 0?{output:n.output}:{},...n.error!=null?{error:n.error}:{},...n.childJobIds!=null?{childJobIds:n.childJobIds}:{},...e&&e.length>0?{iterations:e}:{}}}function gd(n){let e=n.map(t=>t.startedAt).filter(t=>t!=null);return e.length===0?"":e.reduce((t,r)=>t<r?t:r)}function yd(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function wd(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function bd(n){return n==="completed"||n==="failed"||n==="cancelled"}var sd,ad,H,Dt=d(()=>{"use strict";Tt();Cr();Dr();sd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ad=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},H=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){return await this.withoutForeignKeys(async()=>{await this.db.insert(B).values(this.jobToRow(e)),await this.replaceSubjects(e.id,e.subjectContext),await this.replaceStepExecutions(e.id,e.stepHistory)}),await this.get(e.id)}async get(e){let t=await this.db.query.jobs.findFirst({where:{id:e},with:{subjects:!0,stepExecutions:!0}});return t?this.toDomain(t,t.subjects,t.stepExecutions):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o={...r,...t,id:e,context:t.context??r.context,stepHistory:t.stepHistory??r.stepHistory,updatedAt:t.updatedAt??new Date().toISOString()};return await this.withoutForeignKeys(async()=>{await this.db.update(B).set({workflowId:o.workflowId,status:o.status,selection:o.selection??null,batchId:o.batchId??null,parentJobId:o.parentJobId??null,parentStepExecutionId:o.parentStepExecutionId??null,fanOutIndex:o.fanOutIndex??null,retryOf:o.retryOf??null,workflowSnapshot:o.workflowSnapshot??null,context:o.context,worktreePath:o.worktreePath??null,branch:o.branch??null,currentStepId:o.currentStepId??null,currentStepExecutionId:o.currentStepExecutionId??null,createdAt:o.createdAt,updatedAt:o.updatedAt,completedAt:o.completedAt??null}).where(Ct(B.id,e)),t.subjectContext!==void 0&&await this.replaceSubjects(e,t.subjectContext),t.stepHistory!==void 0&&await this.replaceStepExecutions(e,t.stepHistory)}),this.get(e)}async list(e={}){let t={};e.workflowId!==void 0&&(t.workflowId=e.workflowId),e.status!==void 0&&(t.status=e.status),e.batchId!==void 0&&(t.batchId=e.batchId),e.parentJobId!==void 0&&(t.parentJobId=e.parentJobId),e.parentStepExecutionId!==void 0&&(t.parentStepExecutionId=e.parentStepExecutionId);let o=(Object.keys(t).length>0?await this.db.query.jobs.findMany({where:t,with:{subjects:!0,stepExecutions:!0}}):await this.db.query.jobs.findMany({with:{subjects:!0,stepExecutions:!0}})).map(s=>this.toDomain(s,s.subjects,s.stepExecutions)),i=e.topLevelOnly?o.filter(s=>s.batchId==null&&s.parentJobId==null):o;return e.terminal===void 0?i:i.filter(s=>bd(s.status)===e.terminal)}async latestBySubject(e,t){let r={};for(let c of t)r[c]=null;if(t.length===0)return r;let o=await this.db.select({subjectId:me.subjectId,jobId:B.id,createdAt:B.createdAt}).from(me).innerJoin(B,Ct(me.jobId,B.id)).where(ud(Ct(B.workflowId,e),pd(me.subjectId,t))).orderBy(dd(B.createdAt)),i=new Map;for(let c of o)i.has(c.subjectId)||i.set(c.subjectId,c.jobId);let s=[...new Set(i.values())],a=await Promise.all(s.map(c=>this.get(c))),u=new Map(a.filter(c=>c!=null).map(c=>[c.id,c]));for(let[c,f]of i)r[c]=u.get(f)??null;return r}async withoutForeignKeys(e){if(!this.sqlite){await e();return}try{this.sqlite.exec("PRAGMA foreign_keys = OFF"),await e()}finally{this.sqlite.exec("PRAGMA foreign_keys = ON")}}jobToRow(e){return{id:e.id,workflowId:e.workflowId,status:e.status,selection:e.selection??null,batchId:e.batchId??null,parentJobId:e.parentJobId??null,parentStepExecutionId:e.parentStepExecutionId??null,fanOutIndex:e.fanOutIndex??null,retryOf:e.retryOf??null,workflowSnapshot:e.workflowSnapshot??null,context:e.context,worktreePath:e.worktreePath??null,branch:e.branch??null,currentStepId:e.currentStepId??null,currentStepExecutionId:e.currentStepExecutionId??null,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt??null}}async replaceSubjects(e,t){await this.db.delete(me).where(Ct(me.jobId,e));let r=fd(t);r.length!==0&&await this.db.insert(me).values(r.map(o=>({id:ld(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(ze).where(Ct(ze.jobId,e));let r=Ui(e,t);r.length!==0&&await this.db.insert(ze).values(r)}toDomain(e,t,r){let o=md(t.map(s=>s.snapshot)),i=hd(r);return{id:e.id,workflowId:e.workflowId,status:e.status,...o?{subjectContext:o}:{},...e.selection!=null?{selection:e.selection}:{},...e.batchId!=null?{batchId:e.batchId}:{},...e.parentJobId!=null?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId!=null?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf!=null?{retryOf:e.retryOf}:{},...e.workflowSnapshot!=null?{workflowSnapshot:e.workflowSnapshot}:{},context:e.context,...e.worktreePath!=null?{worktreePath:e.worktreePath}:{},...e.branch!=null?{branch:e.branch}:{},...e.currentStepId!=null?{currentStepId:e.currentStepId}:{},...e.currentStepExecutionId!=null?{currentStepExecutionId:e.currentStepExecutionId}:{},stepHistory:i,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};H=sd([cd(),ad("design:paramtypes",[Object,Function])],H)});import{Injectable as jd}from"@nestjs/common";import{eq as vd}from"drizzle-orm";var Sd,Id,ee,sn=d(()=>{"use strict";nn();Sd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Id=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ee=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(De).values({id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,status:e.status,triggeredBy:e.triggeredBy,scheduleId:e.scheduleId??null,notificationOverride:e.notificationOverride??null,notificationSent:e.notificationSent,createdAt:e.createdAt,completedAt:e.completedAt??null}),await this.get(e.id)}async get(e){let t=await this.db.query.jobBatches.findFirst({where:{id:e},with:{jobs:!0}});return t?this.toDomain(t,t.jobs.map(r=>r.id)):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(De).set({workflowId:t.workflowId??r.workflowId,selection:t.selection??r.selection,resolvedSubjects:t.resolvedSubjects??r.resolvedSubjects,status:t.status??r.status,triggeredBy:t.triggeredBy??r.triggeredBy,scheduleId:t.scheduleId!==void 0?t.scheduleId??null:r.scheduleId??null,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,notificationSent:t.notificationSent??r.notificationSent,createdAt:t.createdAt??r.createdAt,completedAt:t.completedAt!==void 0?t.completedAt??null:r.completedAt??null}).where(vd(De.id,e)),this.get(e)):null}async list(e={}){return(e.workflowId?await this.db.query.jobBatches.findMany({where:{workflowId:e.workflowId},with:{jobs:!0}}):await this.db.query.jobBatches.findMany({with:{jobs:!0}})).map(r=>this.toDomain(r,r.jobs.map(o=>o.id)))}toDomain(e,t){return{id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,jobIds:t,status:e.status,triggeredBy:e.triggeredBy,...e.scheduleId!=null?{scheduleId:e.scheduleId}:{},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},notificationSent:e.notificationSent,createdAt:e.createdAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};ee=Sd([jd(),Id("design:paramtypes",[Object])],ee)});import{Injectable as Ed}from"@nestjs/common";import{eq as Mi}from"drizzle-orm";var _d,xd,xe,Kr=d(()=>{"use strict";Br();_d=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(Ne).values({id:e.id,viewId:e.viewId,triggerType:e.trigger.type,cadence:e.trigger.cadence,notificationOverride:e.notificationOverride??null,missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,lastFiredAt:e.lastFiredAt??null,createdAt:e.createdAt}),await this.get(e.id)}async get(e){let t=await this.db.query.schedules.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.trigger??r.trigger;return await this.db.update(Ne).set({viewId:t.viewId??r.viewId,triggerType:o.type,cadence:o.cadence,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,missedFirePolicy:t.missedFirePolicy??r.missedFirePolicy,enabled:t.enabled??r.enabled,lastFiredAt:t.lastFiredAt!==void 0?t.lastFiredAt??null:r.lastFiredAt??null,createdAt:t.createdAt??r.createdAt}).where(Mi(Ne.id,e)),this.get(e)}async list(e={}){return(e.enabled!==void 0?await this.db.query.schedules.findMany({where:{enabled:e.enabled}}):await this.db.query.schedules.findMany()).map(r=>this.toDomain(r))}async delete(e){return await this.get(e)?(await this.db.delete(Ne).where(Mi(Ne.id,e)),!0):!1}async findDue(e){return(await this.list({enabled:!0})).filter(r=>r.lastFiredAt==null||r.lastFiredAt<e)}toDomain(e){return{id:e.id,viewId:e.viewId,trigger:{type:"cron",cadence:e.cadence},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,...e.lastFiredAt!=null?{lastFiredAt:e.lastFiredAt}:{},createdAt:e.createdAt}}};xe=_d([Ed(),xd("design:paramtypes",[Object])],xe)});import{Injectable as Ad}from"@nestjs/common";import{eq as Wr}from"drizzle-orm";var Pd,Rd,Ee,Vr=d(()=>{"use strict";Nr();Pd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Rd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ee=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(he).values({id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,lastJobId:e.lastJobId??null,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowShortcuts.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(he).set({name:t.name??r.name,workflowId:t.workflowId??r.workflowId,inputValues:t.inputValues??r.inputValues,lastJobId:t.lastJobId!==void 0?t.lastJobId??null:r.lastJobId??null}).where(Wr(he.id,e)),this.get(e)):null}async list(){return(await this.db.query.workflowShortcuts.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.order-r.order)}async reorder(e){let t=[];for(let r of e){let o=await this.get(r);if(!o)return[];t.push(o)}for(let r=0;r<e.length;r+=1)await this.db.update(he).set({order:r}).where(Wr(he.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(he).where(Wr(he.id,e)),!0):!1}async nextOrder(){let e=await this.db.query.workflowShortcuts.findMany();return e.length===0?0:Math.max(...e.map(t=>t.order))+1}toDomain(e){return{id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,order:e.order,...e.lastJobId!=null?{lastJobId:e.lastJobId}:{}}}};Ee=Pd([Ad(),Rd("design:paramtypes",[Object])],Ee)});import{z as _}from"zod";var Hi,Li,Ki,Gr,an,Wi,Qr=d(()=>{"use strict";Hi=_.object({name:_.string().min(1),label:_.string().min(1),type:_.enum(["string","select"]),options:_.array(_.string()).optional(),required:_.boolean()}),Li=_.object({id:_.string().min(1),label:_.string().min(1),params:_.array(Hi)}),Ki=_.object({actionId:_.string().min(1),label:_.string().min(1),params:_.array(Hi)}),Gr=_.object({templateId:_.string().min(1),params:_.record(_.string(),_.unknown())}),an=_.object({params:_.record(_.string(),_.unknown())}),Wi=_.object({query:_.record(_.string(),_.unknown())})});import{z as K}from"zod";var G,cn,un,dn,pn,ln=d(()=>{"use strict";Qr();G=K.enum(["ticket","pull_request","documentation"]),cn=K.object({id:K.string().min(1),name:K.string().min(1),subjectType:G,workflowId:K.string().min(1),providerInstanceId:K.string().min(1),query:K.record(K.string(),K.unknown()),description:K.string().optional(),queryTemplate:Gr.optional(),order:K.number().int().nonnegative()}),un=cn.omit({order:!0}),dn=cn.partial().omit({id:!0,order:!0}).extend({queryTemplate:Gr.nullable().optional()}),pn=K.object({viewIds:K.array(K.string().min(1)).min(1)})});var Vi=d(()=>{"use strict";ln()});var Gi=d(()=>{"use strict";Qr()});function kd(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function Qi(n,e){let t=e instanceof Set?e:new Set(e),r=kd(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function zi(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&zi(t.steps,e)}function Xi(n){let e=[];zi(n,e);let t=new Map;for(let r of e)t.set(r,(t.get(r)??0)+1);return[...t.entries()].filter(([,r])=>r>1).map(([r])=>r)}function Zi(n){let e=new Set,t=r=>{for(let o of r)o.id&&e.add(o.id),o.type==="loop"&&Array.isArray(o.steps)&&t(o.steps)};return t(n),e}var zr=d(()=>{"use strict"});import{z as l}from"zod";var Td,Bt,Od,Fe,Yi,es,ts,ns,rs,os,is,ss,qd,as,cs,dt,$d,Cd,Dd,Bd,Nd,Fd,Jd,us,pt,ds=d(()=>{"use strict";ln();zr();Td=l.enum(["on_fail","on_complete","on_needs_input"]),Bt=l.object({triggers:l.array(Td),messageTemplate:l.string().optional()}),Od=l.object({name:l.string().min(1),label:l.string().min(1),type:l.enum(["string","number","boolean","select"]),options:l.array(l.string()).optional(),required:l.boolean(),defaultValue:l.unknown().optional()}),Fe=l.string().min(1),Yi=l.object({type:l.literal("agent"),id:l.string().min(1),name:Fe,objective:l.string().min(1),knowledgeScope:l.array(l.enum(["user","organization","project"])).optional(),outputFormat:l.enum(["questionnaire","confirmation","comment_suggestions","free_text"]),agentInstanceId:l.string().min(1).optional()}),es=l.object({type:l.literal("interaction"),id:l.string().min(1),name:Fe,interaction:l.union([l.literal("questionnaire"),l.literal("confirmation"),l.literal("conversation")]),notify:l.boolean().optional()}),ts=l.object({type:l.literal("shell"),id:l.string().min(1),name:Fe,command:l.string().min(1)}),ns=l.object({type:l.literal("git"),id:l.string().min(1),name:Fe,operation:l.enum(["create_worktree","checkout","create_branch","commit","push"]),params:l.record(l.string(),l.unknown())}),rs=l.object({type:l.literal("provider_action"),id:l.string().min(1),name:Fe,action:l.enum(["get_subject","get_comments","post_comment","update_status","get_content"]),params:l.record(l.string(),l.unknown()).optional(),extendedAction:l.object({providerId:l.string().min(1),actionId:l.string().min(1),params:l.record(l.string(),l.unknown()).optional()}).optional(),target:l.object({subjectType:G,source:l.string().min(1),subjectId:l.string().min(1)}).optional()}),os=l.object({type:l.literal("sub_workflow"),id:l.string().min(1),name:Fe,workflowId:l.string().min(1),forEach:l.literal("selection")}),is=l.discriminatedUnion("type",[l.object({type:l.literal("field_empty"),stepId:l.string().min(1),field:l.string().min(1)}),l.object({type:l.literal("field_equals"),stepId:l.string().min(1),field:l.string().min(1),value:l.unknown()})]),ss=l.discriminatedUnion("action",[l.object({action:l.literal("fail")}),l.object({action:l.literal("continue")}),l.object({action:l.literal("ask_human")})]),qd=l.object({type:l.literal("loop"),id:l.string().min(1),name:Fe,steps:l.array(l.lazy(()=>as)),until:is,maxIterations:l.number().int().nonnegative(),onMaxIterations:ss}),as=l.lazy(()=>l.discriminatedUnion("type",[ns,rs,ts,Yi,es,os,qd])),cs=l.object({id:l.string().min(1),name:l.string().min(1),description:l.string().optional(),appliesTo:l.union([G,l.array(G),l.literal("none")]),subjectHandling:l.enum(["per-subject","collection"]),inputSchema:l.array(Od),steps:l.array(as),notificationPolicy:Bt}),dt=cs.superRefine((n,e)=>{let t=Xi(n.steps);t.length!==0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`})}),$d=Yi.extend({id:l.string().min(1).optional()}),Cd=es.extend({id:l.string().min(1).optional()}),Dd=ts.extend({id:l.string().min(1).optional()}),Bd=ns.extend({id:l.string().min(1).optional()}),Nd=rs.extend({id:l.string().min(1).optional()}),Fd=os.extend({id:l.string().min(1).optional()}),Jd=l.object({type:l.literal("loop"),id:l.string().min(1).optional(),name:Fe,steps:l.array(l.lazy(()=>us)),until:is,maxIterations:l.number().int().nonnegative(),onMaxIterations:ss}),us=l.lazy(()=>l.discriminatedUnion("type",[Bd,Nd,Dd,$d,Cd,Fd,Jd])),pt=cs.omit({id:!0,steps:!0}).extend({id:l.string().min(1).optional(),steps:l.array(us)})});function Ud(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function ps(n,e){return Ud(n).includes(e)}var ls=d(()=>{"use strict"});var fs=d(()=>{"use strict";ds();zr();ls()});var ms=d(()=>{"use strict"});var hs=d(()=>{"use strict";ms()});var gs=d(()=>{"use strict"});var ys=d(()=>{"use strict";gs()});var ws=d(()=>{"use strict"});var bs=d(()=>{"use strict";ws()});import{z as W}from"zod";var lt,Ss=d(()=>{"use strict";lt=W.object({id:W.string().min(1),viewId:W.string().min(1),trigger:W.object({type:W.literal("cron"),cadence:W.string().min(1)}),notificationOverride:W.object({triggers:W.array(W.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:W.string().optional()}).optional(),missedFirePolicy:W.enum(["skip","catch_up"]),enabled:W.boolean(),lastFiredAt:W.string().optional(),createdAt:W.string()})});var Is=d(()=>{"use strict";Ss()});import{z as te}from"zod";var fn,mn,hn,gn,js=d(()=>{"use strict";fn=te.object({id:te.string().min(1),name:te.string().min(1),workflowId:te.string().min(1),inputValues:te.record(te.string(),te.unknown()),lastJobId:te.string().min(1).optional(),order:te.number().int().nonnegative()}),mn=fn.omit({order:!0}),hn=fn.partial().omit({id:!0,order:!0}),gn=te.object({shortcutIds:te.array(te.string().min(1)).min(1)})});var vs=d(()=>{"use strict";js()});import{z as w}from"zod";function Ze(n){return n.kind==="subject"}function ft(n){return n.kind==="agent"}var Md,_s,xs,Es,Ps,yn,wn,bn,Sn,In,jn,Rs,As,ks=d(()=>{"use strict";ln();Md=w.enum(["jira","bitbucket","github","confluence","manual"]),_s=w.enum(["claude","cursor"]),xs={id:w.string().min(1),displayName:w.string().min(1),config:w.record(w.string(),w.unknown()),secretKey:w.string().min(1),expiresOn:w.string().min(1).optional()},Es=w.object({...xs,kind:w.literal("subject"),type:Md,subjectType:G}),Ps=w.object({...xs,kind:w.literal("agent"),type:_s}),yn=w.discriminatedUnion("kind",[Es,Ps]),wn=w.object({providerInstances:w.array(yn).default([]),defaultAgentInstanceId:w.string().min(1).optional()}),bn=w.object({providerInstances:w.array(yn).optional(),defaultAgentInstanceId:w.string().min(1).nullable().optional()}),Sn=w.discriminatedUnion("kind",[Es.extend({defaultAgent:w.boolean().optional()}),Ps.extend({defaultAgent:w.boolean().optional()})]),In=w.object({displayName:w.string().min(1).optional(),config:w.record(w.string(),w.unknown()).optional(),secretKey:w.string().min(1).optional(),expiresOn:w.union([w.string().min(1),w.null()]).optional(),defaultAgent:w.boolean().optional()}),jn=w.object({type:_s,apiKey:w.string().min(1).optional(),instanceId:w.string().min(1).optional()}),Rs=w.object({id:w.string().min(1),displayName:w.string().min(1)}),As={providerInstances:[]}});var Ts=d(()=>{"use strict";ks()});var Os=d(()=>{"use strict"});var qs=d(()=>{"use strict";Os()});var A=d(()=>{"use strict";Vi();Gi();fs();hs();ys();bs();Is();vs();Ts();qs()});import{Injectable as Kd}from"@nestjs/common";import{eq as Wd}from"drizzle-orm";function Vd(n,e){let t=e.providerInstances!==void 0?e.providerInstances:n.providerInstances,r=e.defaultAgentInstanceId===null?void 0:e.defaultAgentInstanceId!==void 0?e.defaultAgentInstanceId:n.defaultAgentInstanceId;return Xr({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function Xr(n){return{providerInstances:n.providerInstances??As.providerInstances,...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function $s(n){return n.providerInstances!==void 0}var Hd,Ld,x,ge=d(()=>{"use strict";A();Fr();Hd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ld=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},x=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:$t}});return Xr(e?e.data:{})}async update(e){let t=Vd(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:$t}})?await this.db.update(ct).set({data:t}).where(Wd(ct.id,$t)):await this.db.insert(ct).values({id:$t,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};x=Hd([Kd(),Ld("design:paramtypes",[Object])],x)});import{Module as Qd}from"@nestjs/common";var Gd,zd,ye,Nt=d(()=>{"use strict";Bi();ut();on();Dt();sn();Kr();Vr();ge();Gd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zd=[q,Y,H,ee,xe,Ee,x],ye=class{};ye=Gd([Qd({providers:[Z,{provide:q,useFactory:n=>new q(n.getDb(),n.getSqlite()),inject:[Z]},{provide:Y,useFactory:n=>new Y(n.getDb()),inject:[Z]},{provide:H,useFactory:n=>new H(n.getDb(),n.getSqlite()),inject:[Z]},{provide:ee,useFactory:n=>new ee(n.getDb()),inject:[Z]},{provide:xe,useFactory:n=>new xe(n.getDb()),inject:[Z]},{provide:Ee,useFactory:n=>new Ee(n.getDb()),inject:[Z]},{provide:x,useFactory:n=>new x(n.getDb()),inject:[Z]}],exports:[Z,...zd]})],ye)});import{Injectable as Yd,Logger as ep,Inject as Ds}from"@nestjs/common";async function Bs(n,e){let t=[];for(let r of e){let o=await n.get(r.secretKey);t.push({providerId:r.id,secretKey:r.secretKey,configured:typeof o=="string"&&o.length>0})}return t}async function tp(n,e,t){let r=await Bs(n,e);for(let o of r)o.configured||t(`Provider instance '${o.providerId}' API key not configured (looked up as '${o.secretKey}'). GET /api/providers/status lists what's missing; store a key with: POST /api/secrets/${o.secretKey} or npm --workspace apps/engine run set-secret -- ${o.secretKey} <value>`)}var Xd,Zd,Cs,Zr,Je,Yr=d(()=>{"use strict";ge();_e();Xd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Cs=function(n,e){return function(t,r){e(t,r,n)}};Je=Zr=class{secrets;settings;logger=new ep(Zr.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await tp(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return Bs(this.secrets,e.providerInstances??[])}};Je=Zr=Xd([Yd(),Cs(0,Ds(oe)),Cs(1,Ds(x)),Zd("design:paramtypes",[Function,x])],Je)});function vn(n,e=st(n)){let t=ip[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function Ns(n){let e=new Map;for(let r of n){let o=r.content.trim();if(!o)continue;let i=e.get(r.tier)??[];i.push(o),e.set(r.tier,i)}let t=[];for(let r of rp){let o=e.get(r);o?.length&&t.push(`## ${np[r]}
11
+ `);let t=n.prepare(`INSERT INTO ${_t} (hash, created_at, name, applied_at) VALUES (?, ?, ?, ?)`),r=new Date().toISOString();n.exec("BEGIN");try{for(let o of e)t.run(o.hash,o.folderMillis,o.name,r);n.exec("COMMIT")}catch(o){throw n.exec("ROLLBACK"),o}}var _t,be,of,Ua=l(()=>{"use strict";Ba();_t="__drizzle_migrations",be=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},of=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","context_files","local_repositories","settings"]});import{Injectable as hf,Logger as yf}from"@nestjs/common";import{mkdirSync as gf}from"node:fs";import{dirname as wf}from"node:path";import{DatabaseSync as Ma}from"node:sqlite";var ff,mf,vi,Z,Wa=l(()=>{"use strict";or();Oa();Ua();ff=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},mf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=vi=class{logger=new yf(vi.name);sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??wa();t===":memory:"?this.sqlite=new Ma(":memory:"):(gf(wf(t),{recursive:!0}),this.sqlite=new Ma(t)),this.db=$a(this.sqlite),xi(this.sqlite,this.db,{log:r=>this.logger.log(r)})}async onModuleInit(){xi(this.sqlite,this.db,{log:e=>this.logger.log(e)})}getDb(){return this.db}getSqlite(){return this.sqlite}};Z=vi=ff([hf(),mf("design:paramtypes",[])],Z)});import{Injectable as xf}from"@nestjs/common";import{eq as Ka}from"drizzle-orm";var bf,Sf,D,Pt=l(()=>{"use strict";li();bf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Sf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},D=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){let t=new Date().toISOString();return await this.db.insert(tt).values({id:e.id,name:e.name,description:e.description??null,appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy,createdAt:t,updatedAt:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowDefinitions.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(tt).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,appliesTo:t.appliesTo??r.appliesTo,subjectHandling:t.subjectHandling??r.subjectHandling,inputSchema:t.inputSchema??r.inputSchema,steps:t.steps??r.steps,notificationPolicy:t.notificationPolicy??r.notificationPolicy,updatedAt:new Date().toISOString()}).where(Ka(tt.id,e)),this.get(e)):null}async list(e={}){return(e.subjectHandling?await this.db.query.workflowDefinitions.findMany({where:{subjectHandling:e.subjectHandling}}):await this.db.query.workflowDefinitions.findMany()).map(r=>this.toDomain(r))}async delete(e){if(!await this.get(e))return!1;try{this.sqlite?.exec("PRAGMA foreign_keys = OFF"),await this.db.delete(tt).where(Ka(tt.id,e))}finally{this.sqlite?.exec("PRAGMA foreign_keys = ON")}return!0}toDomain(e){return{id:e.id,name:e.name,...e.description!=null?{description:e.description}:{},appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy}}};D=bf([xf(),Sf("design:paramtypes",[Object,Function])],D)});import{Injectable as If}from"@nestjs/common";import{eq as ji}from"drizzle-orm";var vf,jf,Ha,le,ur=l(()=>{"use strict";pi();vf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},jf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ha=["ticket","pull_request","documentation"],le=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert($e).values({id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,query:e.query,description:e.description??null,queryTemplate:e.queryTemplate??null,providerInstanceId:e.providerInstanceId,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.subjectViews.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.queryTemplate!==void 0?t.queryTemplate:t.query!==void 0?void 0:r.queryTemplate;return await this.db.update($e).set({name:t.name??r.name,subjectType:t.subjectType??r.subjectType,workflowId:t.workflowId??r.workflowId,query:t.query??r.query,description:t.description!==void 0?t.description??null:r.description??null,queryTemplate:o??null,providerInstanceId:t.providerInstanceId??r.providerInstanceId}).where(ji($e.id,e)),this.get(e)}async list(e={}){let t=e.subjectType?await this.db.query.subjectViews.findMany({where:{subjectType:e.subjectType}}):await this.db.query.subjectViews.findMany();return this.sortViews(t.map(r=>this.toDomain(r)))}async reorder(e){let t=[];for(let o of e){let i=await this.get(o);if(!i)return[];t.push(i)}let r=t[0].subjectType;if(!t.every(o=>o.subjectType===r))return[];for(let o=0;o<e.length;o+=1)await this.db.update($e).set({order:o}).where(ji($e.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete($e).where(ji($e.id,e)),!0):!1}async nextOrder(e){let t=await this.db.query.subjectViews.findMany({where:{subjectType:e}});return t.length===0?0:Math.max(...t.map(r=>r.order))+1}sortViews(e){return[...e].sort((t,r)=>{let o=Ha.indexOf(t.subjectType)-Ha.indexOf(r.subjectType);return o!==0?o:t.order-r.order})}toDomain(e){return{id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,providerInstanceId:e.providerInstanceId,query:e.query,order:e.order,...e.description!=null?{description:e.description}:{},...e.queryTemplate!=null?{queryTemplate:e.queryTemplate}:{}}}};le=vf([If(),jf("design:paramtypes",[Object])],le)});import{Injectable as Ef}from"@nestjs/common";import{and as kf,desc as Rf,eq as $n,inArray as Af}from"drizzle-orm";import{randomUUID as Cf}from"node:crypto";function Tf(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function $f(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function Ga(n,e,t=null,r=null){let o=[];for(let i of e)if(o.push({id:i.id,jobId:n,stepDefinitionId:i.stepDefinitionId,type:i.type,status:i.status,startedAt:i.startedAt??null,completedAt:i.completedAt??null,output:i.output??null,error:i.error??null,failureDetails:i.failureDetails??null,childJobIds:i.childJobIds??null,parentStepExecutionId:t,iterationIndex:r}),i.iterations)for(let s of i.iterations)o.push(...Ga(n,s.stepExecutions,i.id,s.index));return o}function Of(n){let e=new Map;for(let o of n){let i=o.parentStepExecutionId,s=e.get(i)??[];s.push(o),e.set(i,s)}let t=o=>{let i=e.get(o)??[];if(i.length===0)return;let s=new Map;for(let a of i){if(a.iterationIndex==null)continue;let u=s.get(a.iterationIndex)??[];u.push(a),s.set(a.iterationIndex,u)}if(s.size!==0)return[...s.entries()].sort(([a],[u])=>a-u).map(([a,u])=>{let c=u.map(p=>Va(p,t(p.id)));return{index:a,stepExecutions:c,startedAt:qf(c),...Bf(c)?{completedAt:Df(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Va(o,t(o.id)))}function Va(n,e){return{id:n.id,stepDefinitionId:n.stepDefinitionId,type:n.type,status:n.status,...n.startedAt!=null?{startedAt:n.startedAt}:{},...n.completedAt!=null?{completedAt:n.completedAt}:{},...n.output!==null&&n.output!==void 0?{output:n.output}:{},...n.error!=null?{error:n.error}:{},...n.failureDetails!=null?{failureDetails:n.failureDetails}:{},...n.childJobIds!=null?{childJobIds:n.childJobIds}:{},...e&&e.length>0?{iterations:e}:{}}}function qf(n){let e=n.map(t=>t.startedAt).filter(t=>t!=null);return e.length===0?"":e.reduce((t,r)=>t<r?t:r)}function Df(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function Bf(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function Ff(n){return n==="completed"||n==="failed"||n==="cancelled"}var _f,Pf,Y,On=l(()=>{"use strict";In();di();fi();_f=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Pf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Y=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){return await this.withoutForeignKeys(async()=>{await this.db.insert(H).values(this.jobToRow(e)),await this.replaceSubjects(e.id,e.subjectContext),await this.replaceStepExecutions(e.id,e.stepHistory)}),await this.get(e.id)}async get(e){let t=await this.db.query.jobs.findFirst({where:{id:e},with:{subjects:!0,stepExecutions:!0}});return t?this.toDomain(t,t.subjects,t.stepExecutions):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o={...r,...t,id:e,context:t.context??r.context,stepHistory:t.stepHistory??r.stepHistory,updatedAt:t.updatedAt??new Date().toISOString()};return await this.withoutForeignKeys(async()=>{await this.db.update(H).set({workflowId:o.workflowId,status:o.status,selection:o.selection??null,batchId:o.batchId??null,parentJobId:o.parentJobId??null,parentStepExecutionId:o.parentStepExecutionId??null,fanOutIndex:o.fanOutIndex??null,retryOf:o.retryOf??null,workflowSnapshot:o.workflowSnapshot??null,context:o.context,worktreePath:o.worktreePath??null,branch:o.branch??null,worktreeDeletedAt:o.worktreeDeletedAt??null,currentStepId:o.currentStepId??null,currentStepExecutionId:o.currentStepExecutionId??null,createdAt:o.createdAt,updatedAt:o.updatedAt,completedAt:o.completedAt??null}).where($n(H.id,e)),t.subjectContext!==void 0&&await this.replaceSubjects(e,t.subjectContext),t.stepHistory!==void 0&&await this.replaceStepExecutions(e,t.stepHistory)}),this.get(e)}async list(e={}){let t={};e.workflowId!==void 0&&(t.workflowId=e.workflowId),e.status!==void 0&&(t.status=e.status),e.batchId!==void 0&&(t.batchId=e.batchId),e.parentJobId!==void 0&&(t.parentJobId=e.parentJobId),e.parentStepExecutionId!==void 0&&(t.parentStepExecutionId=e.parentStepExecutionId);let o=(Object.keys(t).length>0?await this.db.query.jobs.findMany({where:t,with:{subjects:!0,stepExecutions:!0}}):await this.db.query.jobs.findMany({with:{subjects:!0,stepExecutions:!0}})).map(s=>this.toDomain(s,s.subjects,s.stepExecutions)),i=e.topLevelOnly?o.filter(s=>s.batchId==null&&s.parentJobId==null):o;return e.liveWorktree&&(i=i.filter(s=>s.worktreePath!=null&&s.worktreeDeletedAt==null)),e.terminal===void 0?i:i.filter(s=>Ff(s.status)===e.terminal)}async latestBySubject(e,t){let r={};for(let c of t)r[c]=null;if(t.length===0)return r;let o=await this.db.select({subjectId:qe.subjectId,jobId:H.id,createdAt:H.createdAt}).from(qe).innerJoin(H,$n(qe.jobId,H.id)).where(kf($n(H.workflowId,e),Af(qe.subjectId,t))).orderBy(Rf(H.createdAt)),i=new Map;for(let c of o)i.has(c.subjectId)||i.set(c.subjectId,c.jobId);let s=[...new Set(i.values())],a=await Promise.all(s.map(c=>this.get(c))),u=new Map(a.filter(c=>c!=null).map(c=>[c.id,c]));for(let[c,p]of i)r[c]=u.get(p)??null;return r}async withoutForeignKeys(e){if(!this.sqlite){await e();return}try{this.sqlite.exec("PRAGMA foreign_keys = OFF"),await e()}finally{this.sqlite.exec("PRAGMA foreign_keys = ON")}}jobToRow(e){return{id:e.id,workflowId:e.workflowId,status:e.status,selection:e.selection??null,batchId:e.batchId??null,parentJobId:e.parentJobId??null,parentStepExecutionId:e.parentStepExecutionId??null,fanOutIndex:e.fanOutIndex??null,retryOf:e.retryOf??null,workflowSnapshot:e.workflowSnapshot??null,context:e.context,worktreePath:e.worktreePath??null,branch:e.branch??null,worktreeDeletedAt:e.worktreeDeletedAt??null,currentStepId:e.currentStepId??null,currentStepExecutionId:e.currentStepExecutionId??null,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt??null}}async replaceSubjects(e,t){await this.db.delete(qe).where($n(qe.jobId,e));let r=Tf(t);r.length!==0&&await this.db.insert(qe).values(r.map(o=>({id:Cf(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(It).where($n(It.jobId,e));let r=Ga(e,t);r.length!==0&&await this.db.insert(It).values(r)}toDomain(e,t,r){let o=$f(t.map(s=>s.snapshot)),i=Of(r);return{id:e.id,workflowId:e.workflowId,status:e.status,...o?{subjectContext:o}:{},...e.selection!=null?{selection:e.selection}:{},...e.batchId!=null?{batchId:e.batchId}:{},...e.parentJobId!=null?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId!=null?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf!=null?{retryOf:e.retryOf}:{},...e.workflowSnapshot!=null?{workflowSnapshot:e.workflowSnapshot}:{},context:e.context,...e.worktreePath!=null?{worktreePath:e.worktreePath}:{},...e.branch!=null?{branch:e.branch}:{},...e.worktreeDeletedAt!=null?{worktreeDeletedAt:e.worktreeDeletedAt}:{},...e.currentStepId!=null?{currentStepId:e.currentStepId}:{},...e.currentStepExecutionId!=null?{currentStepExecutionId:e.currentStepExecutionId}:{},stepHistory:i,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};Y=_f([Ef(),Pf("design:paramtypes",[Object,Function])],Y)});import{Injectable as Jf}from"@nestjs/common";import{eq as Uf}from"drizzle-orm";var Nf,Lf,pe,lr=l(()=>{"use strict";sr();Nf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Lf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},pe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(rt).values({id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,status:e.status,triggeredBy:e.triggeredBy,scheduleId:e.scheduleId??null,notificationOverride:e.notificationOverride??null,notificationSent:e.notificationSent,createdAt:e.createdAt,completedAt:e.completedAt??null}),await this.get(e.id)}async get(e){let t=await this.db.query.jobBatches.findFirst({where:{id:e},with:{jobs:!0}});return t?this.toDomain(t,t.jobs.map(r=>r.id)):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(rt).set({workflowId:t.workflowId??r.workflowId,selection:t.selection??r.selection,resolvedSubjects:t.resolvedSubjects??r.resolvedSubjects,status:t.status??r.status,triggeredBy:t.triggeredBy??r.triggeredBy,scheduleId:t.scheduleId!==void 0?t.scheduleId??null:r.scheduleId??null,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,notificationSent:t.notificationSent??r.notificationSent,createdAt:t.createdAt??r.createdAt,completedAt:t.completedAt!==void 0?t.completedAt??null:r.completedAt??null}).where(Uf(rt.id,e)),this.get(e)):null}async list(e={}){return(e.workflowId?await this.db.query.jobBatches.findMany({where:{workflowId:e.workflowId},with:{jobs:!0}}):await this.db.query.jobBatches.findMany({with:{jobs:!0}})).map(r=>this.toDomain(r,r.jobs.map(o=>o.id)))}toDomain(e,t){return{id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,jobIds:t,status:e.status,triggeredBy:e.triggeredBy,...e.scheduleId!=null?{scheduleId:e.scheduleId}:{},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},notificationSent:e.notificationSent,createdAt:e.createdAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};pe=Nf([Jf(),Lf("design:paramtypes",[Object])],pe)});import{Injectable as Kf}from"@nestjs/common";import{eq as Qa}from"drizzle-orm";var Mf,Wf,We,Ii=l(()=>{"use strict";mi();Mf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Wf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},We=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(it).values({id:e.id,viewId:e.viewId,triggerType:e.trigger.type,cadence:e.trigger.cadence,notificationOverride:e.notificationOverride??null,missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,lastFiredAt:e.lastFiredAt??null,createdAt:e.createdAt}),await this.get(e.id)}async get(e){let t=await this.db.query.schedules.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.trigger??r.trigger;return await this.db.update(it).set({viewId:t.viewId??r.viewId,triggerType:o.type,cadence:o.cadence,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,missedFirePolicy:t.missedFirePolicy??r.missedFirePolicy,enabled:t.enabled??r.enabled,lastFiredAt:t.lastFiredAt!==void 0?t.lastFiredAt??null:r.lastFiredAt??null,createdAt:t.createdAt??r.createdAt}).where(Qa(it.id,e)),this.get(e)}async list(e={}){return(e.enabled!==void 0?await this.db.query.schedules.findMany({where:{enabled:e.enabled}}):await this.db.query.schedules.findMany()).map(r=>this.toDomain(r))}async delete(e){return await this.get(e)?(await this.db.delete(it).where(Qa(it.id,e)),!0):!1}async findDue(e){return(await this.list({enabled:!0})).filter(r=>r.lastFiredAt==null||r.lastFiredAt<e)}toDomain(e){return{id:e.id,viewId:e.viewId,trigger:{type:"cron",cadence:e.cadence},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,...e.lastFiredAt!=null?{lastFiredAt:e.lastFiredAt}:{},createdAt:e.createdAt}}};We=Mf([Kf(),Wf("design:paramtypes",[Object])],We)});import{Injectable as Gf}from"@nestjs/common";import{eq as _i}from"drizzle-orm";var Hf,Vf,Ke,Pi=l(()=>{"use strict";hi();Hf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Vf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ke=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(De).values({id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,lastJobId:e.lastJobId??null,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowShortcuts.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(De).set({name:t.name??r.name,workflowId:t.workflowId??r.workflowId,inputValues:t.inputValues??r.inputValues,lastJobId:t.lastJobId!==void 0?t.lastJobId??null:r.lastJobId??null}).where(_i(De.id,e)),this.get(e)):null}async list(){return(await this.db.query.workflowShortcuts.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.order-r.order)}async reorder(e){let t=[];for(let r of e){let o=await this.get(r);if(!o)return[];t.push(o)}for(let r=0;r<e.length;r+=1)await this.db.update(De).set({order:r}).where(_i(De.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(De).where(_i(De.id,e)),!0):!1}async nextOrder(){let e=await this.db.query.workflowShortcuts.findMany();return e.length===0?0:Math.max(...e.map(t=>t.order))+1}toDomain(e){return{id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,order:e.order,...e.lastJobId!=null?{lastJobId:e.lastJobId}:{}}}};Ke=Hf([Gf(),Vf("design:paramtypes",[Object])],Ke)});import{Injectable as Yf}from"@nestjs/common";import{eq as za}from"drizzle-orm";var Qf,zf,de,pr=l(()=>{"use strict";yi();Qf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},de=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(st).values({id:e.id,name:e.name,description:e.description??null,tier:e.tier,path:e.path}),await this.get(e.id)}async get(e){let t=await this.db.query.contextFiles.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(st).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,tier:t.tier??r.tier,path:t.path??r.path}).where(za(st.id,e)),this.get(e)):null}async list(){return(await this.db.query.contextFiles.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.name.localeCompare(r.name))}async delete(e){return await this.get(e)?(await this.db.delete(st).where(za(st.id,e)),!0):!1}toDomain(e){return{id:e.id,name:e.name,tier:e.tier,path:e.path,...e.description!=null&&e.description!==""?{description:e.description}:{}}}};de=Qf([Yf(),zf("design:paramtypes",[Object])],de)});import{Injectable as em}from"@nestjs/common";import{eq as Ya}from"drizzle-orm";var Xf,Zf,fe,dr=l(()=>{"use strict";gi();Xf=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(at).values({id:e.id,name:e.name,localPath:e.localPath,worktreeBasePath:e.worktreeBasePath??null,defaultBranch:e.defaultBranch??null}),await this.get(e.id)}async get(e){let t=await this.db.query.localRepositories.findFirst({where:{id:e}});return t?this.toDomain(t):null}async findByLocalPath(e){let r=(await this.db.query.localRepositories.findMany()).find(o=>o.localPath===e);return r?this.toDomain(r):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(at).set({name:t.name??r.name,localPath:t.localPath??r.localPath,worktreeBasePath:t.worktreeBasePath!==void 0?t.worktreeBasePath??null:r.worktreeBasePath??null,defaultBranch:t.defaultBranch!==void 0?t.defaultBranch??null:r.defaultBranch??null}).where(Ya(at.id,e)),this.get(e)):null}async list(){return(await this.db.query.localRepositories.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.name.localeCompare(r.name))}async delete(e){return await this.get(e)?(await this.db.delete(at).where(Ya(at.id,e)),!0):!1}toDomain(e){return{id:e.id,name:e.name,localPath:e.localPath,...e.worktreeBasePath!=null&&e.worktreeBasePath!==""?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch!=null&&e.defaultBranch!==""?{defaultBranch:e.defaultBranch}:{}}}};fe=Xf([em(),Zf("design:paramtypes",[Object])],fe)});import{z as A}from"zod";var Xa,Za,ec,Ei,fr,tc,ki=l(()=>{"use strict";Xa=A.object({name:A.string().min(1),label:A.string().min(1),type:A.enum(["string","select","string[]"]),options:A.array(A.string()).optional(),required:A.boolean()}),Za=A.object({id:A.string().min(1),label:A.string().min(1),params:A.array(Xa)}),ec=A.object({actionId:A.string().min(1),label:A.string().min(1),params:A.array(Xa)}),Ei=A.object({templateId:A.string().min(1),params:A.record(A.string(),A.unknown())}),fr=A.object({params:A.record(A.string(),A.unknown())}),tc=A.object({query:A.record(A.string(),A.unknown())})});import{z as ee}from"zod";var ie,mr,hr,yr,gr,wr=l(()=>{"use strict";ki();ie=ee.enum(["ticket","pull_request","documentation"]),mr=ee.object({id:ee.string().min(1),name:ee.string().min(1),subjectType:ie,workflowId:ee.string().min(1),providerInstanceId:ee.string().min(1),query:ee.record(ee.string(),ee.unknown()),description:ee.string().optional(),queryTemplate:Ei.optional(),order:ee.number().int().nonnegative()}),hr=mr.omit({order:!0}),yr=mr.partial().omit({id:!0,order:!0}).extend({queryTemplate:Ei.nullable().optional()}),gr=ee.object({viewIds:ee.array(ee.string().min(1)).min(1)})});var nc=l(()=>{"use strict";wr()});var rc=l(()=>{"use strict";ki()});function Ri(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function oc(n,e){let t=e instanceof Set?e:new Set(e),r=Ri(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function ic(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&ic(t.steps,e)}function sc(n){let e=[];ic(n,e);let t=new Map;for(let r of e)t.set(r,(t.get(r)??0)+1);return[...t.entries()].filter(([,r])=>r>1).map(([r])=>r)}function ac(n){let e=new Set,t=r=>{for(let o of r)o.id&&e.add(o.id),o.type==="loop"&&Array.isArray(o.steps)&&t(o.steps)};return t(n),e}var Ai=l(()=>{"use strict"});import{z as f}from"zod";function cc(n){return typeof n=="object"&&typeof n.source=="string"}function sm(n){return!!(n.path?.trim()||n.pattern?.trim())}function am(n,e){let t=e.sourceStepIds??[];if(t.length===0)return`comment_review step '${e.id}' requires sourceStepIds`;let r=Ci(n),o=r.findIndex(s=>s.id===e.id),i=new Map((o>=0?r.slice(0,o):r).map(s=>[s.id,s]));for(let s of t){let a=i.get(s);if(!a||a.type!=="agent"||a.outputFormat!=="comment_suggestions")return`comment_review step '${e.id}' source '${s}' is not a prior comment_suggestions agent step`}return null}function Ci(n){let e=[];for(let t of n)e.push(t),t.type==="loop"&&e.push(...Ci(t.steps));return e}var tm,qn,nm,He,Be,uc,lc,pc,dc,fc,mc,rm,hc,yc,om,im,gc,br,wc,Dn,cm,um,lm,pm,dm,fm,mm,hm,bc,ct,Sc=l(()=>{"use strict";wr();Ai();tm=f.enum(["on_fail","on_complete","on_needs_input"]),qn=f.object({triggers:f.array(tm),messageTemplate:f.string().optional()}),nm=f.object({name:f.string().min(1),label:f.string().min(1),type:f.enum(["string","number","boolean","select","localRepository"]),options:f.array(f.string()).optional(),required:f.boolean(),defaultValue:f.unknown().optional()}),He=f.string().min(1),Be=f.discriminatedUnion("type",[f.object({type:f.literal("field_empty"),stepId:f.string().min(1),field:f.string().min(1)}),f.object({type:f.literal("field_equals"),stepId:f.string().min(1),field:f.string().min(1),value:f.unknown()})]),uc=Be,lc=f.object({type:f.literal("agent"),id:f.string().min(1),name:He,objective:f.string().min(1),contextFileIds:f.array(f.string().min(1)).optional(),outputFormat:f.enum(["questionnaire","confirmation","comment_suggestions","free_text"]),agentInstanceId:f.string().min(1).optional(),condition:Be.optional()}),pc=f.object({type:f.literal("interaction"),id:f.string().min(1),name:He,interaction:f.union([f.literal("questionnaire"),f.literal("confirmation"),f.literal("conversation"),f.literal("comment_review")]),notify:f.boolean().optional(),sourceStepIds:f.array(f.string().min(1)).optional(),condition:Be.optional()}),dc=f.object({type:f.literal("shell"),id:f.string().min(1),name:He,command:f.string().min(1),condition:Be.optional()}),fc=f.object({type:f.literal("git"),id:f.string().min(1),name:He,operation:f.enum(["create_worktree","checkout","create_branch","commit","push"]),params:f.record(f.string(),f.unknown()),condition:Be.optional()}),mc=f.object({type:f.literal("provider_action"),id:f.string().min(1),name:He,action:f.enum(["get_subject","get_comments","post_comment","update_status","get_content"]),params:f.record(f.string(),f.unknown()).optional(),extendedAction:f.object({providerId:f.string().min(1),actionId:f.string().min(1),params:f.record(f.string(),f.unknown()).optional()}).optional(),target:f.object({subjectType:ie,source:f.string().min(1),subjectId:f.string().min(1)}).optional(),condition:Be.optional()}),rm=f.union([f.literal("selection"),f.object({source:f.string().min(1)})]),hc=f.object({type:f.literal("sub_workflow"),id:f.string().min(1),name:He,workflowId:f.string().min(1),forEach:rm,condition:Be.optional()}),yc=f.discriminatedUnion("action",[f.object({action:f.literal("fail")}),f.object({action:f.literal("continue")}),f.object({action:f.literal("ask_human")})]),om=f.object({type:f.literal("loop"),id:f.string().min(1),name:He,steps:f.array(f.lazy(()=>br)),until:uc,maxIterations:f.number().int().nonnegative(),onMaxIterations:yc,condition:Be.optional()}),im=f.enum(["fail","empty","ask_human"]),gc=f.object({type:f.literal("extract"),id:f.string().min(1),name:He,source:f.string(),path:f.string().optional(),pattern:f.string().optional(),onNoMatch:im,condition:Be.optional()}),br=f.lazy(()=>f.discriminatedUnion("type",[fc,mc,dc,lc,pc,hc,om,gc])),wc=f.object({id:f.string().min(1),name:f.string().min(1),description:f.string().optional(),appliesTo:f.union([ie,f.array(ie),f.literal("none")]),subjectHandling:f.enum(["per-subject","collection"]),inputSchema:f.array(nm),steps:f.array(br),notificationPolicy:qn}),Dn=wc.superRefine((n,e)=>{let t=sc(n.steps);t.length>0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`});for(let r of Ci(n.steps))if(r.type==="extract"&&!sm(r)&&e.addIssue({code:"custom",path:["steps"],message:`Extract step '${r.id}' must set at least one of path or pattern`}),r.type==="interaction"&&r.interaction==="comment_review"){let o=am(n.steps,r);o&&e.addIssue({code:"custom",path:["steps"],message:o})}});cm=lc.extend({id:f.string().min(1).optional()}),um=pc.extend({id:f.string().min(1).optional()}),lm=dc.extend({id:f.string().min(1).optional()}),pm=fc.extend({id:f.string().min(1).optional()}),dm=mc.extend({id:f.string().min(1).optional()}),fm=hc.extend({id:f.string().min(1).optional()}),mm=f.object({type:f.literal("loop"),id:f.string().min(1).optional(),name:He,steps:f.array(f.lazy(()=>bc)),until:uc,maxIterations:f.number().int().nonnegative(),onMaxIterations:yc,condition:Be.optional()}),hm=gc.extend({id:f.string().min(1).optional()}),bc=f.lazy(()=>f.discriminatedUnion("type",[pm,dm,lm,cm,um,fm,mm,hm])),ct=wc.omit({id:!0,steps:!0}).extend({id:f.string().min(1).optional(),steps:f.array(bc)})});function ym(n,e){let t=e[n.stepId],r=t!=null&&typeof t=="object"?t[n.field]:void 0;return{stepOutput:t,fieldValue:r}}function Sr(n,e){let t=e[n.stepId];if(t==null||typeof t!="object")return n.type==="field_empty";let r=t[n.field];return n.type==="field_empty"?r==null?!0:typeof r=="string"||Array.isArray(r)?r.length===0:!1:r===n.value}function xc(n,e){return{condition:n,inputs:ym(n,e)}}var vc=l(()=>{"use strict"});function Ti(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function jc(n,e){return Ti(n).includes(e)}var $i=l(()=>{"use strict"});var Ic=l(()=>{"use strict"});function _c(n,e="none"){switch(n.type){case"agent":return wm(n.outputFormat);case"shell":return{isScalar:!1,fields:["exitCode","stdout","stderr"]};case"git":return Sm(n);case"provider_action":return bm(n,e);case"interaction":return n.interaction==="comment_review"?{isScalar:!1,fields:["finalComments"]}:{isScalar:!1,opaque:!0};case"sub_workflow":return{isScalar:!1,fields:["fanOutIndex","jobId","output"],isArray:!0};case"loop":return{isScalar:!1};case"extract":return{isScalar:!0}}}function Pc(n,e){let t=[];return Ec(n,e,t,!1)?t:[]}function wm(n){switch(n){case"free_text":return{isScalar:!0};case"questionnaire":return{isScalar:!1,fields:["questions"]};case"confirmation":return{isScalar:!1,fields:["approved"]};case"comment_suggestions":return{isScalar:!1,fields:["suggestions"],isArray:!1}}}function bm(n,e){if(n.extendedAction)return{isScalar:!1,opaque:!0};switch(n.action){case"get_subject":{let t=n.target?.subjectType;if(t)return{isScalar:!1,fields:Bn[t]};let r=Ti(e),o=[],i=new Set;for(let s of r)for(let a of Bn[s])i.has(a)||(i.add(a),o.push(a));return{isScalar:!1,fields:o,...r.length>1?{fieldsDependOnSubjectType:!0}:{}}}case"get_comments":return{isScalar:!1,fields:[...gm],isArray:!0};case"get_content":return{isScalar:!0};case"post_comment":case"update_status":return{isScalar:!1,fields:[]}}}function Sm(n){switch(n.operation){case"create_worktree":return{isScalar:!1,fields:["worktreePath","branch"]};case"commit":return{isScalar:!1,fields:["sha"]};case"checkout":case"create_branch":case"push":return{isScalar:!1,fields:[]}}}function xm(n,e){if(n===e)return!0;let t="_key"in n?n._key:void 0,r="_key"in e?e._key:void 0;return typeof t=="string"&&t.length>0&&t===r}function Ec(n,e,t,r){for(let o of n){if(xm(o,e))return!0;if(o.type==="loop"&&Array.isArray(o.steps)){if(Ec(o.steps,e,t,!0))return!0}else t.push({step:o,inLoop:r})}return!1}var Bn,gm,Oi=l(()=>{"use strict";$i();Bn={ticket:["id","source","title","description","status","assignee","url"],pull_request:["id","source","title","description","sourceBranch","targetBranch","author","url"],documentation:["id","source","title","url"]},gm=["id","subjectId","author","body","createdAt"]});function kc(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return typeof e.id!="string"||e.id.trim()===""||typeof e.file!="string"||e.file.trim()===""||typeof e.line!="number"||!Number.isInteger(e.line)||typeof e.body!="string"?null:{id:e.id.trim(),file:e.file.trim(),line:e.line,body:e.body}}function vm(n){if(Array.isArray(n)){let r=[];for(let o of n){let i=kc(o);if(!i)return null;r.push(i)}return r}if(!n||typeof n!="object")return null;let e=n.suggestions;if(!Array.isArray(e))return null;let t=[];for(let r of e){let o=kc(r);if(!o)return null;t.push(o)}return t}function jm(n){let e=[];for(let t of n)for(let r of t.suggestions)e.push({...r,id:`${t.stepId}-${r.id}`});return e}function Im(n,e){return Pc(n,e).map(t=>t.step).filter(t=>t.type==="agent"&&"outputFormat"in t&&t.outputFormat==="comment_suggestions")}function Rc(n,e,t){if(n.interaction!=="comment_review")throw new Error(`Step '${n.id}' is not a comment_review interaction`);let r=n.sourceStepIds??[];if(r.length===0)throw new Error(`comment_review step '${n.id}' requires sourceStepIds`);let o=new Set(Im(e,n).map(s=>s.id)),i=[];for(let s of r){if(!o.has(s))throw new Error(`comment_review step '${n.id}' source '${s}' is not a prior comment_suggestions agent step`);if(!Object.prototype.hasOwnProperty.call(t,s))throw new Error(`comment_review step '${n.id}' source '${s}' has no stored output`);let a=vm(t[s]);if(!a)throw new Error(`comment_review step '${n.id}' source '${s}' output is not comment_suggestions-shaped`);i.push({stepId:s,suggestions:a})}return jm(i)}function Ac(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n.finalComments;if(!Array.isArray(e))return null;let t=[];for(let r of e){if(!r||typeof r!="object"||Array.isArray(r))return null;let o=r;if(typeof o.file!="string"||o.file.trim()===""||typeof o.line!="number"||!Number.isInteger(o.line)||typeof o.body!="string")return null;t.push({file:o.file.trim(),line:o.line,body:o.body})}return{finalComments:t}}var Cc=l(()=>{"use strict";Oi()});var Tc=l(()=>{"use strict";Sc();vc();Ai();$i();Ic();Oi();Cc()});import{z as Et}from"zod";var _m,xr,vr,jr,$c=l(()=>{"use strict";_m=Et.enum(["user","organization","project"]),xr=Et.object({id:Et.string().min(1),name:Et.string().min(1),description:Et.string().optional(),tier:_m,path:Et.string().min(1)}),vr=xr.omit({id:!0}).extend({id:Et.string().min(1).optional()}),jr=xr.partial().omit({id:!0})});var Oc=l(()=>{"use strict";$c()});import{z as kt}from"zod";var Ir,_r,Pr,qc=l(()=>{"use strict";Ir=kt.object({id:kt.string().min(1),name:kt.string().min(1),localPath:kt.string().min(1),worktreeBasePath:kt.string().min(1).optional(),defaultBranch:kt.string().min(1).optional()}),_r=Ir.omit({id:!0}).extend({id:kt.string().min(1).optional()}),Pr=Ir.partial().omit({id:!0})});var Dc=l(()=>{"use strict";qc()});var Bc=l(()=>{"use strict"});function Pm(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return typeof e.file!="string"||e.file.trim()===""||typeof e.line!="number"||!Number.isInteger(e.line)||typeof e.body!="string"?null:{file:e.file.trim(),line:e.line,body:e.body}}function Fc(n){let e=n;if(typeof e=="string"){let r=e.trim();if(!r)return[];try{e=JSON.parse(r)}catch{return null}}if(!Array.isArray(e))return null;let t=[];for(let r of e){let o=Pm(r);if(!o)return null;t.push(o)}return t}function Nc(n,e){if(!n||typeof n!="object"||!e?.failureDetails)return!1;let t=n;if(t.type!=="provider_action"||t.action!=="post_comment")return!1;let r=t.params;return r!=null&&typeof r=="object"&&!Array.isArray(r)&&Object.prototype.hasOwnProperty.call(r,"comments")}var Lc=l(()=>{"use strict"});var Jc=l(()=>{"use strict";Bc();Lc()});var Uc=l(()=>{"use strict"});var Mc=l(()=>{"use strict";Uc()});import{z as te}from"zod";var Qt,Wc=l(()=>{"use strict";Qt=te.object({id:te.string().min(1),viewId:te.string().min(1),trigger:te.object({type:te.literal("cron"),cadence:te.string().min(1)}),notificationOverride:te.object({triggers:te.array(te.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:te.string().optional()}).optional(),missedFirePolicy:te.enum(["skip","catch_up"]),enabled:te.boolean(),lastFiredAt:te.string().optional(),createdAt:te.string()})});var Kc=l(()=>{"use strict";Wc()});import{z as me}from"zod";var Er,kr,Rr,Ar,Hc=l(()=>{"use strict";Er=me.object({id:me.string().min(1),name:me.string().min(1),workflowId:me.string().min(1),inputValues:me.record(me.string(),me.unknown()),lastJobId:me.string().min(1).optional(),order:me.number().int().nonnegative()}),kr=Er.omit({order:!0}),Rr=Er.partial().omit({id:!0,order:!0}),Ar=me.object({shortcutIds:me.array(me.string().min(1)).min(1)})});var Vc=l(()=>{"use strict";Hc()});import{z as S}from"zod";function tu(n){return Zc.safeParse(n).success}function Rt(n){return n.kind==="subject"}function Fe(n){return n.kind==="agent"}function ru(n){return n.maxConcurrent??Fn}var Em,Gc,Qc,zc,Fn,Yc,Cr,Tr,$r,Or,qr,Dr,Xc,Zc,Br,eu,nu,ou=l(()=>{"use strict";wr();Em=S.enum(["jira","bitbucket","github","confluence","manual"]),Gc=S.enum(["claude","cursor"]),Qc={id:S.string().min(1),displayName:S.string().min(1),config:S.record(S.string(),S.unknown()),secretKey:S.string().min(1),expiresOn:S.string().min(1).optional()},zc=S.object({...Qc,kind:S.literal("subject"),type:Em,subjectType:ie}),Fn=2,Yc=S.object({...Qc,kind:S.literal("agent"),type:Gc,maxConcurrent:S.number().int().min(1).optional()}),Cr=S.discriminatedUnion("kind",[zc,Yc]),Tr=S.object({providerInstances:S.array(Cr).default([]),defaultAgentInstanceId:S.string().min(1).optional()}),$r=S.object({providerInstances:S.array(Cr).optional(),defaultAgentInstanceId:S.string().min(1).nullable().optional()}),Or=S.discriminatedUnion("kind",[zc.extend({defaultAgent:S.boolean().optional()}),Yc.extend({defaultAgent:S.boolean().optional()})]),qr=S.object({displayName:S.string().min(1).optional(),config:S.record(S.string(),S.unknown()).optional(),secretKey:S.string().min(1).optional(),expiresOn:S.union([S.string().min(1),S.null()]).optional(),defaultAgent:S.boolean().optional(),maxConcurrent:S.number().int().min(1).optional()}),Dr=S.object({type:Gc,apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),Xc=S.object({id:S.string().min(1),displayName:S.string().min(1)}),Zc=S.enum(["jira","bitbucket","github","confluence","claude","cursor"]),Br=S.object({type:Zc,config:S.record(S.string(),S.unknown()).optional(),apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),eu=S.object({success:S.boolean(),message:S.string().optional(),identityMismatch:S.boolean().optional()});nu={providerInstances:[]}});var iu=l(()=>{"use strict";ou()});var su=l(()=>{"use strict"});function au(n,e){switch(n){case"questionnaire":return qi(e);case"confirmation":return km(e);case"conversation":return Rm(e);case"comment_review":return Am(e);default:return n}}function qi(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n.questions;return Array.isArray(e)?e.map(t=>typeof t=="string"?t.trim():t&&typeof t=="object"&&"prompt"in t?String(t.prompt).trim():"").filter(Boolean):[]}function km(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","summary","question"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"approved"in e&&!("questions"in e)?[]:qi(n)}function Rm(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","text"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"suggestions"in e?[]:"questions"in e?qi(n):[]}function Am(n){if(!n||typeof n!="object")return[];let e=Array.isArray(n)?n:n.suggestions;return Array.isArray(e)?e.map(t=>{if(!t||typeof t!="object")return"";let r=t;return typeof r.file!="string"||r.file.trim()===""||typeof r.line!="number"||!Number.isInteger(r.line)?"":`${r.file.trim()}:${r.line}`}).filter(Boolean):[]}var cu=l(()=>{"use strict"});var uu=l(()=>{"use strict";su();cu()});var C=l(()=>{"use strict";nc();rc();Tc();Oc();Dc();Jc();Mc();Kc();Vc();iu();uu()});import{Injectable as $m}from"@nestjs/common";import{eq as Om}from"drizzle-orm";function qm(n,e){let t=e.providerInstances!==void 0?e.providerInstances:n.providerInstances,r=e.defaultAgentInstanceId===null?void 0:e.defaultAgentInstanceId!==void 0?e.defaultAgentInstanceId:n.defaultAgentInstanceId;return Di({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function Di(n){return{providerInstances:(n.providerInstances??nu.providerInstances).map(Dm),...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function Dm(n){return!Fe(n)||n.maxConcurrent!=null?n:{...n,maxConcurrent:Fn}}function lu(n){return n.providerInstances!==void 0}var Cm,Tm,I,he=l(()=>{"use strict";C();wi();Cm=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Tm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},I=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:Rn}});return Di(e?e.data:{})}async update(e){let t=qm(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:Rn}})?await this.db.update(Gt).set({data:t}).where(Om(Gt.id,Rn)):await this.db.insert(Gt).values({id:Rn,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};I=Cm([$m(),Tm("design:paramtypes",[Object])],I)});import{Module as Fm}from"@nestjs/common";var Bm,Nm,Ne,Nn=l(()=>{"use strict";Wa();Pt();ur();On();lr();Ii();Pi();pr();dr();he();Bm=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Nm=[D,le,Y,pe,We,Ke,de,fe,I],Ne=class{};Ne=Bm([Fm({providers:[Z,{provide:D,useFactory:n=>new D(n.getDb(),n.getSqlite()),inject:[Z]},{provide:le,useFactory:n=>new le(n.getDb()),inject:[Z]},{provide:Y,useFactory:n=>new Y(n.getDb(),n.getSqlite()),inject:[Z]},{provide:pe,useFactory:n=>new pe(n.getDb()),inject:[Z]},{provide:We,useFactory:n=>new We(n.getDb()),inject:[Z]},{provide:Ke,useFactory:n=>new Ke(n.getDb()),inject:[Z]},{provide:de,useFactory:n=>new de(n.getDb()),inject:[Z]},{provide:fe,useFactory:n=>new fe(n.getDb()),inject:[Z]},{provide:I,useFactory:n=>new I(n.getDb()),inject:[Z]}],exports:[Z,...Nm]})],Ne)});import{Injectable as Um,Logger as Mm,Inject as du}from"@nestjs/common";async function fu(n,e){let t=[];for(let r of e){let o=await n.get(r.secretKey);t.push({providerId:r.id,secretKey:r.secretKey,configured:typeof o=="string"&&o.length>0})}return t}async function Wm(n,e,t){let r=await fu(n,e);for(let o of r)o.configured||t(`Provider instance '${o.providerId}' API key not configured (looked up as '${o.secretKey}'). GET /api/providers/status lists what's missing; store a key with: POST /api/secrets/${o.secretKey} or npm --workspace apps/engine run set-secret -- ${o.secretKey} <value>`)}var Lm,Jm,pu,Bi,ut,Fi=l(()=>{"use strict";he();Ce();Lm=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Jm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},pu=function(n,e){return function(t,r){e(t,r,n)}};ut=Bi=class{secrets;settings;logger=new Mm(Bi.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Wm(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return fu(this.secrets,e.providerInstances??[])}};ut=Bi=Lm([Um(),pu(0,du(oe)),pu(1,du(I)),Jm("design:paramtypes",[Function,I])],ut)});function Fr(n,e=Ht(n)){let t=Gm[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function mu(n){let e=new Map;for(let r of n){let o=r.content.trim();if(!o)continue;let i=e.get(r.tier)??[];i.push(o),e.set(r.tier,i)}let t=[];for(let r of Hm){let o=e.get(r);o?.length&&t.push(`## ${Km[r]}
11
12
  ${o.join(`
12
13
 
13
14
  `)}`)}return t.join(`
14
15
 
15
- `)}function Ft(n){let e=[],t=Ns(n.knowledge);return t&&e.push(t),e.push(`# Objective
16
+ `)}function Ln(n){let e=[],t=mu(n.knowledge);return t&&e.push(t),e.push(`# Objective
16
17
  ${n.objective}`),e.push(`# Output format
17
- ${op[n.outputFormat]}`),e.join(`
18
+ ${Vm[n.outputFormat]}`),e.join(`
18
19
 
19
- `)}function Jt(n,e){return e==="free_text"?n:Fs(n)}function Fs(n){let e=[...n.matchAll(/```json\s*([\s\S]*?)```/gi)].map(o=>o[1].trim()),t=[...n.matchAll(/```\s*([\s\S]*?)```/g)].map(o=>o[1].trim()),r=[...e].reverse();r.length===0&&r.push(...[...t].reverse()),r.push(n.trim());for(let o of r)if(o)try{return JSON.parse(o)}catch{continue}throw new Error("No valid JSON block found in agent response")}var np,rp,op,ip,_n=d(()=>{"use strict";_e();np={user:"User preferences",organization:"Organization guidelines",project:"Project context"},rp=["user","organization","project"],op={questionnaire:'Respond with a single fenced JSON block matching this shape exactly: {"questions":[{"id":"<string>","prompt":"<string>"}]}. No other prose outside the fence.',confirmation:'Respond with a single fenced JSON block matching this shape exactly: {"approved":<boolean>}. No other prose outside the fence.',comment_suggestions:'Respond with a single fenced JSON block matching this shape exactly: {"suggestions":[{"body":"<string>"}]}. No other prose outside the fence.',free_text:"Respond in plain text. Do not wrap the answer in a JSON object."},ip={anthropic:"Anthropic",cursor:"Cursor"}});async function*ap(n){let{query:e}=await import("@anthropic-ai/claude-agent-sdk"),t=n.options;yield*e({prompt:n.prompt,options:{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,...t?.cwd?{cwd:t.cwd}:{},...t?.resume?{resume:t.resume}:{},...t?.model?{model:t.model}:{},...t?.env?{env:t.env}:{}}})}var sp,xn,Js=d(()=>{"use strict";_n();_e();_n();sp=st("anthropic"),xn=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ft(e),o={permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,env:{...process.env,ANTHROPIC_API_KEY:t}};e.cwd&&(o.cwd=e.cwd),e.sessionId&&(o.resume=e.sessionId),this.options.model&&(o.model=this.options.model);let i=this.options.queryFn??ap,s,a,u;for await(let c of i({prompt:r,options:o}))c.session_id&&(s=c.session_id),c.type==="result"&&(c.subtype==="success"&&typeof c.result=="string"?a=c.result:u=c.errors?.join("; ")||c.subtype||"Claude agent returned an error result");if(u)throw new Error(`Claude agent failed: ${u}`);if(a==null)throw new Error("Claude agent returned no result text");if(!s)throw new Error("Claude agent returned no session id");return{raw:a,parsed:Jt(a,e.outputFormat),sessionId:s}}async requireApiKey(){let e=this.options.secretKey?.trim()||sp,t=await this.secrets.get(e);if(!t)throw vn("anthropic",e);return t}}});function up(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function dp(){let{Agent:n}=await import("@cursor/sdk");return{create:e=>n.create({apiKey:e.apiKey,...e.model?{model:e.model}:{},local:{...e.local?.cwd?{cwd:e.local.cwd}:{},settingSources:[]}}),resume:(e,t)=>n.resume(e,{apiKey:t.apiKey,...t.model?{model:t.model}:{},local:{...t.local?.cwd?{cwd:t.local.cwd}:{},settingSources:[]}})}}var cp,En,Us=d(()=>{"use strict";_n();_e();cp=st("cursor"),En=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ft(e),o=this.options.sdk??await dp(),i=up(t,e.cwd,this.options.model),s=e.sessionId?await o.resume(e.sessionId,i):await o.create(i);try{let u=await(await s.send(r)).wait();if(u.status!=="finished")throw new Error(u.error?.message||`Cursor agent ended with status '${u.status}'`);let c=u.result??"";return{raw:c,parsed:Jt(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async requireApiKey(){let e=this.options.secretKey?.trim()||cp,t=await this.secrets.get(e);if(!t)throw vn("cursor",e);return t}}});function Ms(n){return typeof n=="object"&&n!=null&&typeof n.listExtendedActions=="function"&&typeof n.executeExtendedAction=="function"}function Pn(n,e){let t=n.params.filter(r=>r.required).filter(r=>{let o=e[r.name];return o==null||typeof o=="string"&&o.trim()===""}).map(r=>r.name);if(t.length>0)throw new Error(`Extended action '${n.actionId}' is missing required params: ${t.join(", ")}`)}function mt(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var Rn=d(()=>{"use strict"});function Ut(n){return n==null?"":typeof n=="string"?n:Hs(n).replace(/\n+$/,"")}function An(n){return{version:1,type:"doc",content:n.split(`
20
- `).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function Hs(n){if(n==null||typeof n!="object")return"";let e=n;if(e.type==="text")return e.text??"";if(e.type==="hardBreak")return`
21
- `;let t=(e.content??[]).map(Hs).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
22
- `:t}var eo=d(()=>{"use strict"});function mp(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function Ks(n){return{representation:"atlas_doc_format",value:JSON.stringify(An(n))}}function Vs(n){return Ut(hp(n))}function hp(n){if(n==null||typeof n!="object")return n;let e=n.atlas_doc_format;if(e!=null){if(typeof e=="object"&&e!==null&&"value"in e){let t=e.value;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}return e}}function Ws(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:gp(e,n),raw:n}}function gp(n,e){let t=n.replace(/\/$/,""),r=e._links?.webui?.trim();if(r)return r.startsWith("http://")||r.startsWith("https://")?r:r.startsWith("/wiki")?`${t}${r}`:`${t}/wiki${r.startsWith("/")?r:`/${r}`}`;let o=e.id!=null?String(e.id):"";return o?`${t}/wiki/pages/${encodeURIComponent(o)}`:t}function yp(n,e){return{id:String(n.id??""),subjectId:e,body:Vs(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var pp,lp,fp,Ls,kn,Tn,to=d(()=>{"use strict";Rn();eo();pp="kno.confluence.apiToken",lp=50,fp=10,Ls=500,kn=[{actionId:"create_page",label:"Create Confluence page",params:[{name:"spaceKey",label:"Space key",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"content",label:"Content",type:"string",required:!0}]}],Tn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||pp}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Ws(r,t,this.instanceId)}async getContent(e){await this.requireConfig();let t=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}?body-format=atlas_doc_format`);return Vs(t.body)}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){await this.requireConfig();let t=[],r=`/wiki/api/v2/pages/${encodeURIComponent(e)}/footer-comments?body-format=atlas_doc_format&limit=${lp}`,o=new Set;for(let i=0;i<fp&&t.length<Ls&&!(!r||o.has(r));i++){o.add(r);let s=await this.request("GET",r),a=Array.isArray(s.results)?s.results:[];for(let c of a){if(t.length>=Ls)break;t.push(yp(c,e))}let u=typeof s._links?.next=="string"?s._links.next:void 0;if(!u||a.length===0)break;r=u}return t}async postComment(e,t){await this.requireConfig(),await this.request("POST","/wiki/api/v2/footer-comments",{body:{pageId:e,body:Ks(t)}})}listExtendedActions(){return kn}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${mt(this.listExtendedActions())}`)}async createPage(e){let t=kn[0];Pn(t,e);let r=String(e.spaceKey).trim(),o=String(e.title).trim(),i=String(e.content),{baseUrl:s}=await this.requireConfig(),a=await this.resolveSpaceId(r),u=await this.request("POST","/wiki/api/v2/pages",{body:{spaceId:a,status:"current",title:o,body:Ks(i)}});return Ws(u,s,this.instanceId)}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Confluence instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=mp(o,t),u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Confluence ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as wp}from"node:crypto";var bp,On,Gs=d(()=>{"use strict";bp=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),On=class{pages;contentById;comments;instanceId;type;constructor(e=[],t){this.pages=new Map,this.contentById=new Map,this.comments=new Map,this.instanceId=t?.instanceId,this.type=t?.type;for(let r of e){let{content:o,...i}=r;this.pages.set(i.id,structuredClone(i)),o!==void 0&&this.contentById.set(i.id,o)}}async get(e){let t=this.pages.get(e);if(!t)throw new Error(`Documentation page not found: ${e}`);return this.withSource(structuredClone(t))}async getContent(e){await this.get(e);let t=this.contentById.get(e);if(t===void 0)throw new Error(`Documentation content not found: ${e}`);return t}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){let t=await this.get(e);return this.assertCommentsSupported(t),structuredClone(this.comments.get(e)??[])}async postComment(e,t){let r=await this.get(e);this.assertCommentsSupported(r);let o=this.comments.get(e)??[];o.push({id:wp(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(bp.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function no(){return Ip.replace(/\/$/,"")}function Mt(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' (e.g. 'kno-engine#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1);if(!/^\d+$/.test(o))throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' with a numeric PR number, got '${n}'`);return{repoSlug:r,prNumber:o}}function jp(n,e){return`${n}#${e}`}function vp(n){let e=n.repoSlug;if(typeof e!="string"||e.trim().length===0)throw new Error("Bitbucket query requires filter.repoSlug or filter.role \u2014 repo-scoped listing needs repoSlug; workspace-wide listing needs role (author|reviewer)");return e.trim()}function _p(n){if(typeof n.repoSlug=="string"&&n.repoSlug.trim().length>0||!Xs(n.role))return;let e=String(n.role).trim().toLowerCase();if(e!=="author"&&e!=="reviewer")throw new Error(`Bitbucket query filter.role must be 'author' or 'reviewer', got '${String(n.role)}'`);return e}function zs(n){if(!Xs(n))return;let e=String(n).trim().toUpperCase();if(e!=="OPEN"&&e!=="MERGED"&&e!=="DECLINED")throw new Error(`Bitbucket query filter.state must be OPEN, MERGED, or DECLINED, got '${String(n)}'`);return e}function xp(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=zs(n.state);if(e)return`state="${e}"`}function Ep(n){let e=n.destination?.repository?.name;if(typeof e=="string"&&e.trim().length>0)return e.trim();let t=n.destination?.repository?.full_name;if(typeof t=="string"&&t.includes("/"))return t.slice(t.lastIndexOf("/")+1);throw new Error("Bitbucket workspace pull request is missing destination.repository slug")}function Pp(n){let e=n.trim().toLowerCase();if(e==="approved")return"approve";if(e==="declined"||e==="rejected")return"decline";if(e==="merged")return"merge";throw new Error(`No Bitbucket action for status '${n}'. Accepted: approved, declined/rejected, merged`)}function Xs(n){return n!=null&&n!==""}function io(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function qn(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:jp(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},sourceBranch:String(n.source?.branch?.name??""),targetBranch:String(n.destination?.branch?.name??""),...n.author?.display_name?{author:n.author.display_name}:{},...n.links?.html?.href?{url:n.links.html.href}:{},raw:n}}function Rp(n,e){let t=n.user?.display_name??n.author?.display_name;return{id:String(n.id??""),subjectId:e,body:n.content?.raw??"",...t?{author:t}:{},createdAt:n.created_on??"",raw:n}}var Sp,Ip,ro,Qs,oo,so,$n,ao=d(()=>{"use strict";Rn();Sp="kno.bitbucket.apiToken",Ip="https://api.bitbucket.org/2.0";ro=50,Qs=10,oo=500,so=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],$n=class{secrets;fetchFn;instanceId;email;workspace;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.email=t.email?.trim()||void 0,this.workspace=t.workspace?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Sp}async get(e){let{repoSlug:t,prNumber:r}=Mt(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return qn(i,t,this.instanceId)}async query(e){let t=_p(e);if(t)return this.queryWorkspacePullRequests(t,e);let r=vp(e),{workspace:o}=await this.requireConfig(),i=xp(e),s=new URLSearchParams({pagelen:String(ro)});i&&s.set("q",i);let a=`${no()}/repositories/${encodeURIComponent(o)}/${encodeURIComponent(r)}/pullrequests?${s.toString()}`;return this.collectPullRequests(a,r)}async queryWorkspacePullRequests(e,t){let{workspace:r}=await this.requireConfig(),o=await this.selectedUser(),i=new URLSearchParams({pagelen:String(ro)}),s=zs(t.state);s&&i.set("state",s),e==="reviewer"&&i.set("role","REVIEWER");let a=`${no()}/workspaces/${encodeURIComponent(r)}/pullrequests/${encodeURIComponent(o)}?${i.toString()}`;return this.collectPullRequests(a)}selectedUserCache;async selectedUser(){let{email:e}=await this.requireConfig();if(this.selectedUserCache?.email===e)return this.selectedUserCache.id;let t=await this.request("GET","/user"),r=io(t.uuid,t.account_id,t.username);if(!r)throw new Error("Bitbucket GET /user did not return uuid, account_id, or username \u2014 cannot list workspace pull requests");return this.selectedUserCache={email:e,id:r},r}async collectPullRequests(e,t){let r=[],o=new Set,i=e;for(let s=0;s<Qs&&r.length<oo&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),u=Array.isArray(a.values)?a.values:[];for(let f of u){if(r.length>=oo)break;r.push(qn(f,t??Ep(f),this.instanceId))}let c=typeof a.next=="string"&&a.next.length>0?a.next:void 0;if(!c||u.length===0)break;i=c}return r}async getComments(e){let{repoSlug:t,prNumber:r}=Mt(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${ro}`;for(let u=0;u<Qs&&i.length<oo&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),f=Array.isArray(c.values)?c.values:[];for(let j of f)i.push(Rp(j,e));let m=typeof c.next=="string"&&c.next.length>0?c.next:void 0;if(!m||f.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=Mt(e),{workspace:i}=await this.requireConfig();await this.request("POST",`${this.prPath(i,r,o)}/comments`,{body:{content:{raw:t}}})}async updateStatus(e,t){let{repoSlug:r,prNumber:o}=Mt(e),{workspace:i}=await this.requireConfig(),s=Pp(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return so}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${mt(this.listExtendedActions())}`)}async addReviewer(e){let t=typeof e.subjectId=="string"?e.subjectId.trim():"";if(!t)throw new Error("Bitbucket action 'add_reviewer' requires params.subjectId");let r=typeof e.username=="string"?e.username.trim():"";if(!r)throw new Error("Bitbucket action 'add_reviewer' requires params.username");let{repoSlug:o,prNumber:i}=Mt(t),{workspace:s}=await this.requireConfig(),a=await this.request("GET",this.prPath(s,o,i)),u=await this.request("GET",`/users/${encodeURIComponent(r)}`),c=io(u.uuid),f=io(u.account_id);if(!c&&!f)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(E=>c!=null&&E.uuid===c||f!=null&&E.account_id===f))return qn(a,o,this.instanceId);let S=[...m.map(E=>E.uuid?{uuid:E.uuid}:{account_id:E.account_id}),c?{uuid:c}:{account_id:f}],D=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:S}});return qn(D,o,this.instanceId)}prPath(e,t,r){return`/repositories/${encodeURIComponent(e)}/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}`}async requireConfig(){let e=this.email,t=this.workspace,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.email"),t||o.push("config.workspace"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Bitbucket instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set email and workspace on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{email:e,workspace:t,token:r}}async request(e,t,r={}){let{email:o,token:i}=await this.requireConfig(),s=t.startsWith("http://")||t.startsWith("https://")?t:`${no()}${t.startsWith("/")?t:`/${t}`}`,a={Authorization:`Basic ${Buffer.from(`${o}:${i}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(a["Content-Type"]="application/json");let u=await this.fetchFn(s,{method:e,headers:a,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let f=await u.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${u.status}): ${f||u.statusText}`)}if(u.status===204)return;let c=await u.text();if(c)return JSON.parse(c)}}});import{randomUUID as Ap}from"node:crypto";function kp(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Cn,Zs=d(()=>{"use strict";Cn=class{pullRequests;comments;instanceId;constructor(e=[],t){this.pullRequests=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.pullRequests.get(e);if(!t)throw new Error(`Pull request not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.pullRequests.values()].filter(t=>kp(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:Ap(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.pullRequests.get(e);if(!r)throw new Error(`Pull request not found: ${e}`);r.raw={...r.raw??{},status:t}}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function co(n){return n.pull_request!=null}function Dn(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1),{owner:i,name:s}=Ys(r);if(!/^\d+$/.test(o))throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);return{owner:i,repo:s,issueNumber:o}}function Cp(n,e,t){return`${n}/${e}#${t}`}function Ys(n){let e=n.trim(),t=e.indexOf("/");if(t<=0||t===e.length-1||e.indexOf("/",t+1)!==-1)throw new Error(`GitHub repo must be '{owner}/{name}', got '${n}'`);return{owner:e.slice(0,t),name:e.slice(t+1)}}function Dp(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function Bp(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function Np(n){let e=n.trim().toLowerCase();if(e==="open")return{state:"open"};if(e==="closed"||e==="done"||e==="completed")return{state:"closed",state_reason:"completed"};if(e==="not_planned"||e==="wontfix")return{state:"closed",state_reason:"not_planned"};throw new Error(`No GitHub Issues mapping for status '${n}'. Accepted: ${$p.join(", ")}`)}function Fp(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function uo(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:Cp(o??"",i??"",r),source:e,title:String(n.title??""),...s?{description:s}:{},status:String(n.state??""),...n.assignee?.login?{assignee:n.assignee.login}:{},...n.html_url?{url:n.html_url}:{},raw:n}}function Jp(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function Bn(n){return n!=null&&n!==""}var Tp,Op,qp,$p,Nn,ea=d(()=>{"use strict";Tp="2026-03-10",Op="https://api.github.com",qp="kno.github.apiToken",$p=["open","closed/done/completed","not_planned/wontfix"],Nn=class{secrets;fetchFn;instanceId;username;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.username=t.username?.trim()||void 0,this.secretKey=t.secretKey?.trim()||qp}async get(e){let{owner:t,repo:r,issueNumber:o}=Dn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(co(i))throw new Error(`Ticket not found: ${e}`);return uo(i,this.instanceId,`${t}/${r}`)}async query(e){let t=typeof e.repo=="string"?e.repo.trim():"";if(t)return this.queryRepoIssues(t,e);let r=Dp(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repo ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=Dn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>Jp(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=Dn(e);await this.request("POST",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}/comments`,{body:{body:t}})}async updateStatus(e,t){let{owner:r,repo:o,issueNumber:i}=Dn(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:Np(t)})}async queryRepoIssues(e,t){let{owner:r,name:o}=Ys(e),i=[],s=new URLSearchParams;s.set("per_page",String(100)),Bn(t.state)&&s.set("state",String(t.state)),Bn(t.labels)&&s.set("labels",String(t.labels)),Bn(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=10&&i.length<500;a++){s.set("page",String(a));let u=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues?${s.toString()}`),c=Array.isArray(u)?u:[];if(c.length===0)break;for(let f of c)if(!co(f)){if(i.length>=500)break;i.push(uo(f,this.instanceId,`${r}/${o}`))}if(c.length<100)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[Bp(e,r),"is:issue"];Bn(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=10&&s.length<500;a++){let u=new URLSearchParams({q:i,per_page:String(100),page:String(a)}),c=await this.request("GET",`/search/issues?${u.toString()}`),f=Array.isArray(c.items)?c.items:[];if(f.length===0)break;for(let m of f)if(!co(m)){if(s.length>=500)break;s.push(uo(m,this.instanceId,Fp(m)))}if(f.length<100)break}return s}requireUsername(){if(!this.username)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing config.username`);return this.username}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing SecretStore '${this.secretKey}'. Store the token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`);return e}async request(e,t,r={}){let o=await this.requireToken(),i=`${Op}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":Tp};r.body!==void 0&&(s["Content-Type"]="application/json");let a=await this.fetchFn(i,{method:e,headers:s,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`GitHub ${e} ${t} failed (${a.status}): ${c||a.statusText}`)}if(a.status===204)return;let u=await a.text();if(u)return JSON.parse(u)}}});var Ye,g,h,et,R=d(()=>{"use strict";Ye=class extends Error{constructor(e){super(e),this.name=this.constructor.name}},g=class extends Ye{httpStatus=404},h=class extends Ye{httpStatus=400},et=class extends Ye{httpStatus=409}});function Lp(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(Jn(n.project)&&e.push(`project = ${Un(n.project)}`),Jn(n.status)&&e.push(`status = ${Un(n.status)}`),Jn(n.assignee)&&e.push(`assignee = ${Un(n.assignee)}`),Jn(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${Un(t)}`)}if(e.length===0)throw new h("Jira query requires jql or at least one of project, status, assignee, sprintId");return e.join(" AND ")}function Jn(n){return n!=null&&n!==""}function Un(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function ta(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=Ut(o.description);return{id:r,source:t,title:String(o.summary??""),...i?{description:i}:{},status:String(o.status?.name??""),...o.assignee?.displayName?{assignee:String(o.assignee.displayName)}:{},url:`${e.replace(/\/$/,"")}/browse/${r}`,raw:n}}var Up,Mp,Hp,Fn,Mn,na=d(()=>{"use strict";R();eo();Up="kno.jira.apiToken",Mp=50,Hp=10,Fn=500,Mn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Up}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return ta(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=Lp(e),o=[],i,s=new Set;for(let a=0;a<Hp&&o.length<Fn;a++){let u={jql:r,maxResults:Math.min(Mp,Fn-o.length),fields:["summary","description","status","assignee"]};i&&(u.nextPageToken=i);let c=await this.request("POST","/rest/api/3/search/jql",{body:u}),f=Array.isArray(c.issues)?c.issues:[];for(let j of f){if(o.length>=Fn)break;o.push(ta(j,t,this.instanceId))}let m=typeof c.nextPageToken=="string"?c.nextPageToken:void 0;if(c.isLast===!0||!m||f.length===0||m===i||s.has(m))break;s.add(m),i=m}return o}async getComments(e){let t=[],r=0,o=100,i=Fn;for(;t.length<i;){let s=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/comment?startAt=${r}&maxResults=${o}`),a=Array.isArray(s.comments)?s.comments:[];for(let u of a)t.push({id:String(u.id??""),subjectId:e,body:Ut(u.body),...u.author?.displayName?{author:u.author.displayName}:{},createdAt:u.created??"",raw:u});if(r+=a.length,a.length===0||typeof s.total=="number"&&r>=s.total||a.length<o)break}return t}async postComment(e,t){await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/comment`,{body:{body:An(t)}})}async updateStatus(e,t){let r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`),o=Array.isArray(r.transitions)?r.transitions:[],i=t.trim().toLowerCase(),s=o.find(a=>(a.to?.name??"").trim().toLowerCase()===i);if(!s?.id){let a=o.map(c=>c.to?.name).filter(c=>typeof c=="string"&&c.length>0),u=a.length>0?a.join(", "):"(none)";throw new Error(`No Jira transition to status '${t}' from the current state. Available: ${u}`)}await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`,{body:{transition:{id:s.id}}})}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Jira instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=`${o.replace(/\/$/,"")}${t}`,u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Jira ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as Kp}from"node:crypto";function Wp(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var Hn,ra=d(()=>{"use strict";Hn=class{tickets;comments;instanceId;constructor(e=[],t){this.tickets=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.tickets.get(e);if(!t)throw new Error(`Ticket not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.tickets.values()].filter(t=>Wp(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:Kp(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.tickets.get(e);if(!r)throw new Error(`Ticket not found: ${e}`);r.status=t}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Pe(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function Ln(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function Vp(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var ib,$,ht=d(()=>{"use strict";A();Js();Us();to();Gs();ao();Zs();ea();na();ra();ib=Symbol("PROVIDER_REGISTRY");$=class n{tickets=new Map;repos=new Map;documentation=new Map;agents=new Map;instances=[];constructor(){}static fromSettings(e,t){let r=new n;return r.load(e,t),r}static fromMaps(e){let t=new n;for(let[r,o]of Object.entries(e.tickets??{}))t.tickets.set(r,o);for(let[r,o]of Object.entries(e.repos??{}))t.repos.set(r,o);for(let[r,o]of Object.entries(e.documentation??{}))t.documentation.set(r,o);for(let[r,o]of Object.entries(e.agents??{}))t.agents.set(r,o);return t.instances.push(...e.instances??[]),t}load(e,t){let r=new Set;for(let o of e){if(r.has(o.id))throw new Error(`Duplicate provider instance id '${o.id}'`);r.add(o.id),this.instances.push(o),this.instantiate(o,t)}}instantiate(e,t){if(ft(e)){let o=Pe(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new xn(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new En(t,{secretKey:e.secretKey,model:o}));return}if(!Ze(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=Vp(e.type);if(r!=="any"&&e.subjectType!==r)throw new Error(`Provider instance '${e.id}' type '${e.type}' cannot serve subjectType '${e.subjectType}'`);if(e.type==="jira"){this.tickets.set(e.id,new Mn(t,{instanceId:e.id,baseUrl:Pe(e.config,"baseUrl"),email:Pe(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new Nn(t,{instanceId:e.id,username:Pe(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new $n(t,{instanceId:e.id,email:Pe(e.config,"email"),workspace:Pe(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new Tn(t,{instanceId:e.id,baseUrl:Pe(e.config,"baseUrl"),email:Pe(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new Hn([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new Cn([],e.id));return}this.documentation.set(e.id,new On([],{instanceId:e.id,type:Pe(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw Ln(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw Ln(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw Ln(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw Ln(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>Ze(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function ia(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{role:"reviewer",state:"OPEN"};case"repo-open-prs":{let t=typeof e.repoSlug=="string"?e.repoSlug.trim():"";if(!t)throw new h("Bitbucket template 'repo-open-prs' requires params.repoSlug");return{repoSlug:t,state:"OPEN"}}default:throw new g(`Unknown Bitbucket query template: ${n}`)}}var oa,sa=d(()=>{"use strict";R();oa=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[{name:"repoSlug",label:"Repository",type:"string",required:!0}]}]});function ca(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":{let t=typeof e.repo=="string"?e.repo.trim():"";if(!t)throw new h("GitHub template 'repo-open-issues' requires params.repo");return{repo:t,state:"open"}}default:throw new g(`Unknown GitHub query template: ${n}`)}}var aa,ua=d(()=>{"use strict";R();aa=[{id:"my-open-issues",label:"My open issues",params:[]},{id:"created-by-me",label:"Issues I created",params:[]},{id:"repo-open-issues",label:"Open issues in a repository",params:[{name:"repo",label:"Repository (owner/name)",type:"string",required:!0}]}]});function ma(n,e){switch(n){case"my-open-tickets":return{jql:"assignee = currentUser() AND statusCategory != Done"};case"created-by-me":return{jql:"reporter = currentUser() AND statusCategory != Done"};case"project-open-tickets":return{jql:`project = ${la(pa(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${la(pa(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new g(`Unknown Jira query template: ${n}`)}}function pa(n,e){let t=typeof e.project=="string"?e.project.trim():"";if(!t)throw new h(`Jira template '${n}' requires params.project`);return t}function la(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var da,fa,ha=d(()=>{"use strict";R();da={name:"project",label:"Project key",type:"string",required:!0},fa=[{id:"my-open-tickets",label:"My open tickets",params:[]},{id:"created-by-me",label:"Tickets I created",params:[]},{id:"project-open-tickets",label:"Open tickets in a project",params:[da]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[da]}]});import{Inject as ya,Injectable as zp}from"@nestjs/common";var Gp,Qp,ga,wa,Ue,po=d(()=>{"use strict";A();R();ge();ht();sa();ua();ha();Gp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Qp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ga=function(n,e){return function(t,r){e(t,r,n)}},wa={bitbucket:{list:()=>oa,resolve:ia},github:{list:()=>aa,resolve:ca},jira:{list:()=>fa,resolve:ma}},Ue=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?wa[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?wa[o]:void 0;if(!i)throw new g(`No query templates for provider instance '${e}'`);let s=i.list().find(a=>a.id===t);if(!s)throw new g(`Unknown query template '${t}' for provider instance '${e}'`);for(let a of s.params){if(!a.required)continue;let u=r[a.name];if(u==null||typeof u=="string"&&u.trim()==="")throw new h(`Template '${t}' requires params.${a.name}`)}return i.resolve(t,r)}async providerType(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);if(!(!r||!Ze(r)))return r.type}};Ue=Gp([zp(),ga(0,ya(x)),ga(1,ya($)),Qp("design:paramtypes",[x,$])],Ue)});import{Inject as Sa,Injectable as Yp}from"@nestjs/common";var Xp,Zp,ba,el,Me,lo=d(()=>{"use strict";A();ge();to();ao();ht();Xp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ba=function(n,e){return function(t,r){e(t,r,n)}},el={bitbucket:()=>so,confluence:()=>kn},Me=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);return!r||!Ze(r)?[]:el[r.type]?.()??[]}};Me=Xp([Yp(),ba(0,Sa(x)),ba(1,Sa($)),Zp("design:paramtypes",[x,$])],Me)});async function Ia(n){let e=n.fetchFn??fetch;return n.type==="claude"?ol(n.apiKey,e):il(n.apiKey,e)}async function ol(n,e){let t=await e(tl,{method:"GET",headers:{"x-api-key":n,"anthropic-version":rl}});if(!t.ok)throw ja("Claude",t.status);let r=await t.json();return(Array.isArray(r.data)?r.data:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.display_name=="string"&&s.display_name.trim()?s.display_name:a;return[{id:a,displayName:u}]})}async function il(n,e){let t=await e(nl,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw ja("Cursor",t.status);let r=await t.json();return(Array.isArray(r.items)?r.items:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.displayName=="string"&&s.displayName.trim()?s.displayName:a;return[{id:a,displayName:u}]})}function ja(n,e){let t=new Error(`${n} rejected the API key (HTTP ${e}). Check the key and try again.`);return t.name="PreviewModelsAuthError",t}var tl,nl,rl,va=d(()=>{"use strict";tl="https://api.anthropic.com/v1/models",nl="https://api.cursor.com/v1/models",rl="2023-06-01"});import{Inject as mo,Injectable as cl}from"@nestjs/common";var sl,al,fo,Kn,He,ho=d(()=>{"use strict";A();ge();_e();R();va();sl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},al=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fo=function(n,e){return function(t,r){e(t,r,n)}},Kn="PREVIEW_MODELS_FETCH",He=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async preview(e){let t=e.apiKey?.trim();if(t)return this.lookup(e.type,t);let r=e.instanceId?.trim();if(!r)throw new h("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new g(`Provider instance not found: ${r}`);if(!ft(o)||o.type!==e.type)throw new h(`Provider instance '${r}' is not a ${e.type} agent`);let i=await this.secrets.get(o.secretKey);if(!i)throw new h(`No API key stored for instance '${r}'. Enter a key to fetch models.`);return this.lookup(e.type,i)}async lookup(e,t){try{return await Ia({type:e,apiKey:t,fetchFn:this.fetchFn})}catch(r){throw r instanceof Error&&r.name==="PreviewModelsAuthError"?new h(r.message):new h(r instanceof Error?r.message:"Failed to fetch available models")}}};He=sl([cl(),fo(0,mo(x)),fo(1,mo(oe)),fo(2,mo(Kn)),al("design:paramtypes",[x,Function,Function])],He)});import{Module as dl}from"@nestjs/common";import{fileURLToPath as pl}from"node:url";import{dirname as ll,join as fl}from"node:path";var ul,ml,Le,Wn=d(()=>{"use strict";Er();si();Pr();ci();Or();_e();Nt();ge();Yr();ht();po();lo();ho();ul=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ml=fl(ll(pl(import.meta.url)),"../../../knowledge"),Le=class{};Le=ul([dl({imports:[at,ye],providers:[{provide:$,useFactory:async(n,e)=>{let t=await n.get();return $.fromSettings(t.providerInstances??[],e)},inject:[x,oe]},{provide:Pt,useClass:Zt},{provide:Rt,useFactory:()=>new Yt(ml)},Je,Ue,Me,{provide:Kn,useValue:(n,e)=>fetch(n,e)},He],exports:[$,Pt,Rt,Je,Ue,Me,He,Kn]})],Le)});import{Module as gl}from"@nestjs/common";var hl,Vn,_a=d(()=>{"use strict";hl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Vn=class{};Vn=hl([gl({})],Vn)});import{Injectable as wl}from"@nestjs/common";var yl,se,Gn=d(()=>{"use strict";yl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},se=class{listeners=new Set;emit(e){for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};se=yl([wl()],se)});import{Global as Sl,Module as Il}from"@nestjs/common";var bl,Ke,Qn=d(()=>{"use strict";Gn();bl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ke=class{};Ke=bl([Sl(),Il({providers:[se],exports:[se]})],Ke)});import{Injectable as _l}from"@nestjs/common";import{execFile as xl}from"node:child_process";import{mkdirSync as xa}from"node:fs";import{join as go}from"node:path";import{promisify as El}from"node:util";function Ea(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function Pa(n){return go(n,"worktrees")}var jl,vl,Pl,Re,yo=d(()=>{"use strict";jl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},vl=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Pl=El(xl),Re=class{worktreesRoot;constructor(e){this.worktreesRoot=e,xa(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??go(this.worktreesRoot,e);return xa(go(r,".."),{recursive:!0}),await this.git(t.repoPath,["worktree","add","-b",t.branchName,r,t.baseBranch]),{worktreePath:r,branch:t.branchName}}async checkout(e,t){await this.git(e,["checkout",t.branch])}async createBranch(e,t){t.baseBranch?await this.git(e,["checkout","-b",t.branchName,t.baseBranch]):await this.git(e,["checkout","-b",t.branchName])}async commit(e,t){return t.addAll!==!1&&await this.git(e,["add","-A"]),await this.git(e,["commit","-m",t.message]),{sha:(await this.git(e,["rev-parse","HEAD"])).stdout.trim()}}async push(e,t={}){let r=t.remote??"origin";t.branch?await this.git(e,["push",r,t.branch]):await this.git(e,["push",r,"HEAD"])}async git(e,t){try{let r=await Pl("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=Ea(o.stderr),s=Ea(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Re=jl([_l(),vl("design:paramtypes",[String])],Re)});import{Module as Al}from"@nestjs/common";import{mkdirSync as kl}from"node:fs";var Rl,Ra,zn,Aa=d(()=>{"use strict";en();yo();Rl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ra=kt();kl(Ra,{recursive:!0});zn=class{};zn=Rl([Al({providers:[{provide:Re,useFactory:()=>new Re(Pa(Ra))}],exports:[Re]})],zn)});function Ht(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=Tl(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function Tl(n,e){let t=e.split(".").filter(Boolean),r=n;for(let o of t){if(r==null||typeof r!="object")return;r=r[o]}return r}function gt(n,e){return typeof n=="string"?Ht(n,e):Array.isArray(n)?n.map(t=>gt(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,gt(r,e)])):n}var ka=d(()=>{"use strict"});function Ta(n,e){switch(n){case"questionnaire":return wo(e);case"confirmation":return Ol(e);case"conversation":return ql(e);default:return n}}function wo(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n.questions;return Array.isArray(e)?e.map(t=>typeof t=="string"?t.trim():t&&typeof t=="object"&&"prompt"in t?String(t.prompt).trim():"").filter(Boolean):[]}function Ol(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","summary","question"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"approved"in e&&!("questions"in e)?[]:wo(n)}function ql(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","text"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"suggestions"in e?[]:"questions"in e?wo(n):[]}var Oa=d(()=>{"use strict"});function yt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=yt(r.stepExecutions,e);if(o)return o}}}function Lt(n,e,t,r){for(let o=0;o<n.length;o++){let i=n[o];if(i.id===e)return{execution:i,siblings:n,index:o,parentLoopExecutionId:t,iterationIndex:r};if(i.iterations)for(let s of i.iterations){let a=Lt(s.stepExecutions,e,i.id,s.index);if(a)return a}}}function Q(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:Q(o.stepExecutions,e,t)}))}:r)}function bo(n,e,t,r){return t==null?[...n,e]:n.map(o=>{if(o.id===t){let i=[...o.iterations??[]],s=i.find(a=>a.index===r);if(s){let a={...s,stepExecutions:[...s.stepExecutions,e]},u=i.findIndex(c=>c.index===r);i[u]=a}else{let a={index:r,stepExecutions:[e],startedAt:e.startedAt??new Date().toISOString()};i.push(a),i.sort((u,c)=>u.index-c.index)}return{...o,iterations:i}}return o.iterations?{...o,iterations:o.iterations.map(i=>({...i,stepExecutions:bo(i.stepExecutions,e,t,r)}))}:o})}function Kt(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Kt(t.steps,e);if(r)return r}}}function qa(n,e,t){return Q(n,e,r=>{let o=(r.iterations??[]).map(i=>{if(i.index!==t)return i;let s=i.stepExecutions.every(a=>a.completedAt)?i.stepExecutions.map(a=>a.completedAt).reduce((a,u)=>a>u?a:u):void 0;return{...i,...s?{completedAt:s}:{}}});return{...r,iterations:o}})}var $a=d(()=>{"use strict"});import{z as ne}from"zod";function Ca(n,e){let t=Nl[n].safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.length?o.path.join("."):"(root)"}: ${o.message}`).join("; ");throw new Error(`Agent output failed validation for format '${n}': ${r}`)}return t.data}var $l,Cl,Dl,Bl,Nl,Da=d(()=>{"use strict";$l=ne.object({questions:ne.array(ne.object({id:ne.string(),prompt:ne.string()}))}),Cl=ne.object({approved:ne.boolean()}),Dl=ne.object({suggestions:ne.array(ne.object({body:ne.string()}))}),Bl=ne.string(),Nl={questionnaire:$l,confirmation:Cl,comment_suggestions:Dl,free_text:Bl}});function Ba(n){return n==="completed"||n==="failed"||n==="cancelled"}function So(n,e){let t=new Map;for(let o of n){let i=e(o);if(i==null)continue;let s=t.get(i)??[];s.push(o),t.set(i,s)}if(t.size===0)return null;let r=[];for(let o of t.values()){let i=new Set(o.map(a=>a.retryOf).filter(a=>a!=null)),s=o.find(a=>!i.has(a.id));if(!s)return null;r.push(s)}return{activeJobs:r,allTerminal:r.every(o=>Ba(o.status)),groupCount:t.size}}function Na(n){let e=n.every(r=>r.status==="completed"),t=n.every(r=>r.status==="failed"||r.status==="cancelled");return e?"completed":t?"failed":"completed_with_issues"}var Fa=d(()=>{"use strict"});async function Xn(n,e,t){let r=await e.get(n);if(!r)throw new g(`SubjectView not found: ${n}`);if(!r.providerInstanceId)throw new h(`SubjectView '${n}' has no providerInstanceId \u2014 reconfigure the View to pick a provider instance`);if(r.subjectType==="ticket")return(await t.getTicketProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"ticket",...i}));if(r.subjectType==="pull_request")return(await t.getRepoProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"pull_request",...i}));if(r.subjectType==="documentation")return(await t.getDocumentationProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"documentation",...i}));throw new h(`Unsupported subjectType on view: ${r.subjectType}`)}var Io=d(()=>{"use strict";R()});import{Inject as be,Injectable as Ul,Logger as Ml}from"@nestjs/common";import{randomUUID as jo}from"node:crypto";import{exec as Hl}from"node:child_process";import{promisify as Ll}from"node:util";async function vo(n,e,t){if(n.length===0)throw new Error(t);let r;for(let o of n)try{return await e(o)}catch(i){r=i}throw r instanceof Error?r:new Error(t)}function Ja(n,e){let t=e[n.stepId];if(t==null||typeof t!="object")return n.type==="field_empty";let r=t[n.field];return n.type==="field_empty"?r==null?!0:typeof r=="string"||Array.isArray(r)?r.length===0:!1:r===n.value}function Vl(n,e){let t=o=>{let i=[];for(let s of o)i.push(s),s.type==="loop"&&i.push(...t(s.steps));return i},r=o=>{let i=o.findIndex(s=>s.id===e);if(i>=0){for(let s=i-1;s>=0;s--)if(o[s].type==="agent")return o[s].id;return}for(let s of o)if(s.type==="loop"){let a=r(s.steps);if(a!==void 0||s.steps.some(u=>u.id===e))return a}};return r(n.steps)}function wt(n){let e={...n.context};return n.subjectContext?.mode==="single"&&(e.subject=n.subjectContext.subject),n.worktreePath&&(e.worktreePath=n.worktreePath),n.branch&&(e.branch=n.branch),e}function Zn(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function Se(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Gl(n){if(n==="none")throw new Error("normalizeAppliesTo called with none");if(Array.isArray(n)){if(n.length!==1)throw new Error(`Workflow Runner requires appliesTo to be a single SubjectType (got ${JSON.stringify(n)})`);return n[0]}return n}function Ua(n,e){for(let t of n)if(t.required&&(e[t.name]===void 0||e[t.name]===null))throw new h(`Missing required input: ${t.name}`)}var Fl,Jl,we,_o,Kl,Wl,ae,Yn=d(()=>{"use strict";ut();Dt();sn();on();Gn();yo();ge();ht();Er();Pr();Rn();R();ka();Oa();$a();Da();Fa();Io();Fl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Jl=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},we=function(n,e){return function(t,r){e(t,r,n)}},Kl=Ll(Hl),Wl=["user","organization","project"],ae=_o=class{workflows;jobs;batches;views;events;providers;notifications;knowledge;git;settings;logger=new Ml(_o.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,f){this.workflows=e,this.jobs=t,this.batches=r,this.views=o,this.events=i,this.providers=s,this.notifications=a,this.knowledge=u,this.git=c,this.settings=f,this.events.subscribe(m=>{let j=m;(j.type==="job_completed"||j.type==="job_failed")&&this.onChildTerminal(j.jobId)})}async start(e){let t=await this.createJob(e);return this.emit({type:"job_started",jobId:t.id,timestamp:new Date().toISOString()}),this.runJob(t.id)}async launch(e){let t=await this.requireWorkflow(e.workflowId);if(t.subjectHandling!=="per-subject"&&t.subjectHandling!=="collection")throw new h(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);Ua(t.inputSchema,e.inputValues);let r=await this.resolveSelection(e.selection);if(t.subjectHandling==="collection"){let a=await this.createJob({workflowId:t.id,subjectContext:{mode:"collection",subjects:r},selection:e.selection,inputValues:e.inputValues});return this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),this.runJob(a.id)}let o=new Date().toISOString(),i=await this.batches.create({id:jo(),workflowId:t.id,selection:e.selection,resolvedSubjects:r,status:"running",triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},notificationSent:!1,createdAt:o}),s=[];for(let a=0;a<r.length;a++){let u=r[a],c=await this.createJob({workflowId:t.id,subjectContext:{mode:"single",subject:u},selection:e.selection,batchId:i.id,fanOutIndex:a,inputValues:e.inputValues});s.push(c)}for(let a of s)this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),await this.runJob(a.id);return await this.batches.get(i.id)}async createJob(e){let t=e.workflowSnapshot?structuredClone(e.workflowSnapshot):await this.workflows.get(e.workflowId);if(!t)throw new g(`Workflow not found: ${e.workflowId}`);if(!e.subjectContext&&t.subjectHandling!=="per-subject")throw new h(`Workflow Runner only supports subjectHandling 'per-subject' at start() without an explicit subjectContext (got '${t.subjectHandling}')`);Ua(t.inputSchema,e.inputValues);let r=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),o=new Date().toISOString();return this.jobs.create({id:jo(),workflowId:t.id,status:"pending",...r?{subjectContext:r}:{},...e.selection?{selection:e.selection}:{},...e.batchId?{batchId:e.batchId}:{},...e.parentJobId?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf?{retryOf:e.retryOf}:{},workflowSnapshot:structuredClone(t),context:{...e.inputValues},stepHistory:[],createdAt:o,updatedAt:o})}async runJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);let r=await this.workflowForJob(t);t.status==="pending"&&(t=await this.persistJob({...t,status:"planning",updatedAt:new Date().toISOString()}));let o=await this.executeStepSequence(t,r,r.steps,void 0,void 0,0);return o.outcome==="paused"||o.outcome==="failed"?o.job:this.completeJob(o.job,r)}async resume(e,t){let r=await this.jobs.get(e);if(!r)throw new g(`Job not found: ${e}`);if(r.status!=="waiting_for_human")throw new et(`Job ${e} is not waiting for human input (status: ${r.status})`);let o=await this.workflowForJob(r),i=r.currentStepExecutionId;if(!i)throw new Error(`Job ${e} is waiting_for_human but has no currentStepExecutionId`);let s=yt(r.stepHistory,i);if(!s)throw new Error(`Paused execution ${i} not found on job ${e}`);if(s.type==="loop")return this.resumeAskHuman(r,o,s,t);if(s.type!=="interaction")throw new Error(`Paused execution ${i} has type '${s.type}'; expected interaction or loop`);let a=new Date().toISOString(),u=Q(r.stepHistory,i,D=>({...D,status:"completed",completedAt:a,output:t})),c=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{response:t};r=await this.persistJob({...r,status:"planning",context:{...r.context,[s.stepDefinitionId]:t},stepHistory:u,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a}),this.emit({type:"human_answered",jobId:r.id,answers:c,timestamp:a});let f=Lt(r.stepHistory,i);if(!f)throw new Error(`Could not locate frame for execution ${i}`);let m=this.sequenceForFrameOnJob(r,o,f),j=f.index+1,S=await this.executeStepSequence(r,o,m,f.parentLoopExecutionId,f.iterationIndex,j);return S.outcome==="paused"||S.outcome==="failed"?S.job:f.parentLoopExecutionId!=null&&f.iterationIndex!=null?this.continueLoopAfterBody(S.job,o,f.parentLoopExecutionId,f.iterationIndex):this.completeJob(S.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);if(t.status!=="failed")throw new et(`Job ${e} is not failed (status: ${t.status})`);let r=t.parentJobId!=null&&t.parentStepExecutionId!=null&&t.fanOutIndex!=null,o=t.batchId!=null&&t.fanOutIndex!=null;if(!r&&!o)throw new h(`Job ${e} is not a retryable sub_workflow child or batch member`);if(r){let a=await this.jobs.get(t.parentJobId);if(!a)throw new g(`Parent job not found: ${t.parentJobId}`);let u=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,inputValues:{},parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId,fanOutIndex:t.fanOutIndex,retryOf:t.id,workflowSnapshot:t.workflowSnapshot}),c=Q(a.stepHistory,t.parentStepExecutionId,f=>({...f,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...f.childJobIds??[],u.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:c,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emit({type:"job_started",jobId:u.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:u.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(u.id),u}let i=await this.batches.get(t.batchId);if(!i)throw new g(`JobBatch not found: ${t.batchId}`);i.status!=="running"&&await this.batches.update(i.id,{status:"running",completedAt:null,notificationSent:!1});let s=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,selection:t.selection,batchId:t.batchId,fanOutIndex:t.fanOutIndex,inputValues:{},retryOf:t.id,workflowSnapshot:t.workflowSnapshot});return this.emit({type:"job_started",jobId:s.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:s.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(s.id),s}async executeStepSequence(e,t,r,o,i,s){let a=e;for(let u=s;u<r.length;u++){let c=r[u],f=new Date().toISOString(),m={id:jo(),stepDefinitionId:c.id,type:c.type,status:"running",startedAt:f},j=bo(a.stepHistory,m,o,i);a=await this.persistJob({...a,status:a.status==="pending"?"planning":a.status,currentStepId:c.id,currentStepExecutionId:m.id,stepHistory:j,updatedAt:f}),this.emit({type:"step_started",jobId:a.id,stepDefinitionId:c.id,timestamp:f});try{let S=await this.dispatchStep(a,t,c,m.id,o,i);if(a=S.job,S.outcome==="paused"||S.outcome==="failed")return S}catch(S){return{outcome:"failed",job:await this.failJob(a,t,m.id,c.id,S)}}}return o!=null&&i!=null&&(a=await this.persistJob({...a,stepHistory:qa(a.stepHistory,o,i),updatedAt:new Date().toISOString()})),{outcome:"completed",job:a}}async dispatchStep(e,t,r,o,i,s){switch(r.type){case"agent":return{outcome:"completed",job:await this.executeAgentStep(e,r,o)};case"interaction":return{outcome:"paused",job:await this.pauseForInteraction(e,t,r,o)};case"git":return{outcome:"completed",job:await this.executeGitStep(e,r,o)};case"provider_action":return{outcome:"completed",job:await this.executeProviderActionStep(e,r,o)};case"shell":return{outcome:"completed",job:await this.executeShellStep(e,r,o)};case"loop":return this.runLoopStep(e,t,r,o,i,s);case"sub_workflow":return this.runSubWorkflowStep(e,r,o);default:{let a=r;throw new h(`Step type '${a.type}' not yet supported by the Workflow Runner`)}}}async runLoopStep(e,t,r,o,i,s,a=0,u=r.maxIterations){let c=e,f=a;for(;;){if(f>=u)switch(r.onMaxIterations.action){case"fail":return c=await this.failExecution(c,t,o,r.id,`Loop '${r.id}' exceeded maxIterations (${u})`),{outcome:"failed",job:c};case"continue":return c=await this.finishExecution(c,o,r.id,{iterations:f,exitedOnMaxIterations:!0}),{outcome:"completed",job:c};case"ask_human":{let j={maxIterationsCheckpoint:!0,nextIteration:f,effectiveMaxIterations:u},S=new Date().toISOString(),D=Q(c.stepHistory,o,E=>({...E,status:"pending",output:j}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:D,updatedAt:S}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:j,questions:[`Loop '${r.id}' reached maxIterations (${u}). Extend, continue, or cancel?`],timestamp:S}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} hit max iterations on loop '${r.id}'`,jobId:c.id}),{outcome:"paused",job:c}}default:{let j=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(j)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,f,0);if(c=m.job,m.outcome==="paused")return m;if(m.outcome==="failed")return c=await this.failExecution(c,t,o,r.id,"Loop body failed"),{outcome:"failed",job:c};if(Ja(r.until,c.context))return c=await this.finishExecution(c,o,r.id,{iterations:f+1}),{outcome:"completed",job:c};f+=1}}async resumeAskHuman(e,t,r,o){let i=o,s=r.output;if(!s?.maxIterationsCheckpoint)throw new Error(`Loop execution ${r.id} is not at an ask_human checkpoint`);let a=Kt(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=Lt(e.stepHistory,r.id),c=new Date().toISOString();if(i.action==="cancel")return await this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c},t,r.id,a.id,"Loop cancelled by human at maxIterations checkpoint");if(i.action==="continue"){let D=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(e.stepHistory,r.id,E=>({...E,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:D.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:D.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(D,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(D,t,a.id)}let f=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+f,j=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(e.stepHistory,r.id,D=>({...D,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:j.id,answers:i,timestamp:c});let S=await this.runLoopStep(j,t,a,r.id,u?.parentLoopExecutionId,u?.iterationIndex,s.nextIteration,m);return S.outcome==="paused"||S.outcome==="failed"?S.job:u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(S.job,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(S.job,t,a.id)}async continueLoopAfterBody(e,t,r,o){let i=yt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Kt(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=Lt(e.stepHistory,r),u=i.output?.effectiveMaxIterations??s.maxIterations,c=e;if(Ja(s.until,c.context))c=await this.finishExecution(c,r,s.id,{iterations:o+1});else{let f=o+1,m=await this.runLoopStep(c,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,f,u);if(m.outcome==="paused"||m.outcome==="failed")return m.job;c=m.job}return a?.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(c,t,a.parentLoopExecutionId,a.iterationIndex):this.continueTopLevelAfter(c,t,s.id)}async continueTopLevelAfter(e,t,r){let o=t.steps.findIndex(s=>s.id===r),i=await this.executeStepSequence(e,t,t.steps,void 0,void 0,o+1);return i.outcome==="paused"||i.outcome==="failed"?i.job:this.completeJob(i.job,t)}sequenceForFrameOnJob(e,t,r){if(r.parentLoopExecutionId==null)return t.steps;let o=yt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Kt(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="collection")throw new h(`sub_workflow steps require subjectContext.mode === 'collection' (job ${e.id})`);let o=e.subjectContext.subjects,i=[];for(let f=0;f<o.length;f++){let m=o[f],j=await this.createJob({workflowId:t.workflowId,subjectContext:{mode:"single",subject:m},inputValues:{},parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:f});i.push(j)}let s=i.map(f=>f.id),a=new Date().toISOString(),u=Q(e.stepHistory,r,f=>({...f,status:"waiting_for_children",childJobIds:s})),c=await this.persistJob({...e,status:"waiting_for_children",currentStepId:t.id,currentStepExecutionId:r,stepHistory:u,updatedAt:a});for(let f of i)this.emit({type:"job_started",jobId:f.id,timestamp:a}),this.runJob(f.id);return{outcome:"paused",job:c}}async onChildTerminal(e){let t=await this.jobs.get(e);if(!t?.parentJobId||!t.parentStepExecutionId)return;let r=`${t.parentJobId}:${t.parentStepExecutionId}`;if(!this.childTerminalLocks.has(r)){this.childTerminalLocks.add(r);try{let o=(await this.jobs.list({parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId})).filter(E=>E.parentStepExecutionId===t.parentStepExecutionId),i=So(o,E=>E.fanOutIndex);if(!i?.allTerminal)return;let{activeJobs:s}=i,a=await this.jobs.get(t.parentJobId);if(!a||a.status!=="waiting_for_children"&&a.status!=="failed")return;let u=await this.workflowForJob(a),c=t.parentStepExecutionId,f=yt(a.stepHistory,c);if(!f||f.type!=="sub_workflow")return;if(s.some(E=>E.status==="failed")){await this.failExecution(a,u,c,f.stepDefinitionId,"One or more child jobs failed");return}let j=s.slice().sort((E,eu)=>(E.fanOutIndex??0)-(eu.fanOutIndex??0)).map(E=>({fanOutIndex:E.fanOutIndex,jobId:E.id,output:E.context})),S=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[f.stepDefinitionId]:j},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(a.stepHistory,c,E=>({...E,status:"completed",completedAt:S,output:j})),completedAt:void 0,updatedAt:S}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:f.stepDefinitionId,timestamp:S});let D=await this.continueTopLevelAfter(a,u,f.stepDefinitionId)}finally{this.childTerminalLocks.delete(r)}}}async onBatchMemberTerminal(e){let t=await this.jobs.get(e);if(!t?.batchId)return;let r=t.batchId;if(!this.batchTerminalLocks.has(r)){this.batchTerminalLocks.add(r);try{let o=await this.batches.get(t.batchId);if(!o||o.status!=="running")return;let i=await this.jobs.list({batchId:o.id}),s=So(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=Na(a),c=new Date().toISOString(),f=await this.batches.update(o.id,{status:u,completedAt:c});if(!f)return;if(this.emit({type:"batch_completed",batchId:f.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:c}),!f.notificationSent){let m=await this.workflowForJob(t),j=f.notificationOverride??m.notificationPolicy,S=u==="completed"?"on_complete":"on_fail";j.triggers.includes(S)&&await this.notifications.send({title:`Batch ${u}: ${m.name}`,body:`JobBatch ${f.id} finished with status '${u}' (${a.length} members)`,batchId:f.id}),await this.batches.update(f.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return Xn(e.viewId,this.views,this.providers);let t=[];for(let r of e.subjectIds)if(e.subjectType==="ticket"){let o=await this.getTicketById(r);t.push({subjectType:"ticket",...o})}else if(e.subjectType==="pull_request"){let o=await this.getPullRequestById(r);t.push({subjectType:"pull_request",...o})}else if(e.subjectType==="documentation"){let o=await this.getDocumentationById(r);t.push({subjectType:"documentation",...o})}else throw new h(`Unsupported subjectType: ${e.subjectType}`);return t}async executeAgentStep(e,t,r){let o=t.knowledgeScope?.length?t.knowledgeScope:Wl,i=await this.resolveKnowledge(o),s=wt(e),a=Ht(t.objective,s),u=t.agentInstanceId??(await this.settings.get()).defaultAgentInstanceId;if(!u)throw new Error("No default agent instance configured (set EngineSettings.defaultAgentInstanceId)");let c=await this.providers.getAgentProvider(u).run({objective:a,outputFormat:t.outputFormat,knowledge:i,context:{...s,stepId:t.id},...e.worktreePath?{cwd:e.worktreePath}:{}}),f=Ca(t.outputFormat,c.parsed);return this.finishExecution(e,r,t.id,f)}async executeGitStep(e,t,r){let o=gt(t.params,wt(e));switch(t.operation){case"create_worktree":{let i=await this.git.createWorktree(e.id,{repoPath:Se(o,"repoPath"),baseBranch:Se(o,"baseBranch"),branchName:Se(o,"branchName"),...typeof o.worktreePath=="string"?{worktreePath:o.worktreePath}:{}});return this.finishExecution(e,r,t.id,i,{worktreePath:i.worktreePath,branch:i.branch})}case"create_branch":{let i=Zn(e),s=Se(o,"branchName");return await this.git.createBranch(i,{branchName:s,...typeof o.baseBranch=="string"?{baseBranch:o.baseBranch}:{}}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"checkout":{let i=Zn(e),s=Se(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Zn(e),s=await this.git.commit(i,{message:Se(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Zn(e);return await this.git.push(i,{...typeof o.remote=="string"?{remote:o.remote}:{},...typeof o.branch=="string"?{branch:o.branch}:{}}),this.finishExecution(e,r,t.id,{remote:typeof o.remote=="string"?o.remote:"origin",branch:typeof o.branch=="string"?o.branch:e.branch})}default:{let i=t.operation;throw new Error(`Unknown git operation: ${i}`)}}}async executeProviderActionStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let o=this.resolveProviderActionSubject(e,t);if(t.extendedAction)return this.executeExtendedProviderAction(e,t,r,o);let i=gt(t.params??{},wt(e))??{},s=await this.dispatchPortableProviderAction(o,t.action,i);return this.finishExecution(e,r,t.id,s)}resolveProviderActionSubject(e,t){if(!t.target){let o=e.subjectContext;if(!o||o.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let i=o.subject;return{subjectType:i.subjectType,source:i.source,subjectId:i.id}}let r=Ht(t.target.subjectId,wt(e)).trim();if(!r)throw new Error(`provider_action '${t.id}' target.subjectId interpolated to an empty id`);return{subjectType:t.target.subjectType,source:t.target.source,subjectId:r}}async dispatchPortableProviderAction(e,t,r){let{subjectType:o,source:i,subjectId:s}=e;if(o==="documentation"){let u=this.providers.getDocumentationProvider(i);switch(t){case"get_subject":return u.get(s);case"get_content":return u.getContent(s);case"get_comments":return u.getComments(s);case"post_comment":return await u.postComment(s,Se(r,"body")),{posted:!0};case"update_status":throw new Error(`Provider action '${t}' is not valid for subject type 'documentation'`);default:{let c=t;throw new Error(`Unknown provider action: ${c}`)}}}let a=o==="ticket"?this.providers.getTicketProvider(i):o==="pull_request"?this.providers.getRepoProvider(i):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${o}`);switch(t){case"get_subject":return a.get(s);case"get_comments":return a.getComments(s);case"post_comment":return await a.postComment(s,Se(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Se(r,"status")),{status:Se(r,"status")};case"get_content":throw new Error(`Provider action 'get_content' is not valid for subject type '${o}'`);default:{let u=t;throw new Error(`Unknown provider action: ${u}`)}}}async executeExtendedProviderAction(e,t,r,o){let i=t.extendedAction,s=o.subjectType==="documentation"?this.providers.getDocumentationProvider(i.providerId):o.subjectType==="ticket"?this.providers.getTicketProvider(i.providerId):o.subjectType==="pull_request"?this.providers.getRepoProvider(i.providerId):null;if(!s)throw new Error(`Unsupported subjectType for provider_action: ${o.subjectType}`);if(!Ms(s))throw new Error(`Provider instance '${i.providerId}' does not support extended actions. Available: none`);let a=await s.listExtendedActions(),u=a.find(m=>m.actionId===i.actionId);if(!u)throw new Error(`Provider '${i.providerId}' has no extended action '${i.actionId}'. Available: ${mt(a)}`);let c=gt(i.params??{},wt(e))??{};Pn(u,c);let f=await s.executeExtendedAction(i.actionId,{...c,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,f)}async executeShellStep(e,t,r){let o=Ht(t.command,wt(e)),i=e.worktreePath??process.cwd();try{let s=await Kl(o,{cwd:i,windowsHide:!0});return this.finishExecution(e,r,t.id,{exitCode:0,stdout:String(s.stdout??""),stderr:String(s.stderr??"")})}catch(s){let a=s,u=a.stderr??"",c=a.stdout??"",f=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${f}, cwd=${i}): ${u||c||a.message||o}`)}}async pauseForInteraction(e,t,r,o){let i=new Date().toISOString(),s=Vl(t,r.id),a=s!=null?e.context[s]:void 0,u=Q(e.stepHistory,o,j=>({...j,status:"pending"})),c=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:u,updatedAt:i}),f=Ta(r.interaction,a);return this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:r.interaction,data:a,questions:f,timestamp:i}),t.notificationPolicy.triggers.includes("on_needs_input")&&r.notify!==!1&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} is waiting for human input on step '${r.id}'`,jobId:c.id}),c}async finishExecution(e,t,r,o,i={}){let s=new Date().toISOString(),a=Q(e.stepHistory,t,c=>({...c,status:"completed",completedAt:s,output:o})),u=await this.persistJob({...e,...i,context:{...e.context,[r]:o},stepHistory:a,updatedAt:s});return this.emit({type:"step_completed",jobId:u.id,stepDefinitionId:r,timestamp:s}),u}async failExecution(e,t,r,o,i){return this.failJob(e,t,r,o,new Error(i))}async completeJob(e,t){let r=new Date().toISOString(),o=await this.persistJob({...e,status:"completed",currentStepId:void 0,currentStepExecutionId:void 0,completedAt:r,updatedAt:r});return this.emit({type:"job_completed",jobId:o.id,timestamp:r}),await this.onBatchMemberTerminal(o.id),!o.batchId&&t.notificationPolicy.triggers.includes("on_complete")&&await this.notifications.send({title:`Job completed: ${t.name}`,body:`Job ${o.id} completed successfully`,jobId:o.id}),o}async failJob(e,t,r,o,i){let s=i instanceof Error?i.message:String(i),a=new Date().toISOString(),u=Q(e.stepHistory,r,f=>({...f,status:"failed",completedAt:a,error:s})),c=await this.persistJob({...e,status:"failed",stepHistory:u,completedAt:a,updatedAt:a});return this.emit({type:"step_failed",jobId:c.id,stepDefinitionId:o,error:s,timestamp:a}),this.emit({type:"job_failed",jobId:c.id,error:s,timestamp:a}),await this.onBatchMemberTerminal(c.id),!c.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${c.id} failed on step '${o}': ${s}`,jobId:c.id}),c}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=Gl(e.appliesTo);if(!t)throw new Error(`Workflow '${e.id}' applies to '${r}' but no subjectId was provided`);if(r==="ticket")return{mode:"single",subject:{subjectType:"ticket",...await this.getTicketById(t)}};if(r==="pull_request")return{mode:"single",subject:{subjectType:"pull_request",...await this.getPullRequestById(t)}};if(r==="documentation")return{mode:"single",subject:{subjectType:"documentation",...await this.getDocumentationById(t)}};throw new Error(`Unsupported subjectType for workflow subject resolution: ${r}`)}async resolveKnowledge(e){let t=[];for(let r of e)t.push(...await this.knowledge.resolve(r));return t}async workflowForJob(e){return e.workflowSnapshot?e.workflowSnapshot:(this.logger.warn(`Job ${e.id} has no workflowSnapshot; falling back to live WorkflowDefinition ${e.workflowId}`),this.requireWorkflow(e.workflowId))}async requireWorkflow(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async persistJob(e){let t=await this.jobs.update(e.id,{status:e.status,context:e.context,currentStepId:e.currentStepId,currentStepExecutionId:e.currentStepExecutionId,stepHistory:e.stepHistory,worktreePath:e.worktreePath,branch:e.branch,updatedAt:e.updatedAt,completedAt:e.completedAt});if(!t)throw new Error(`Failed to persist job ${e.id}`);return t}emit(e){this.events.emit(e)}async getTicketById(e){return vo(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return vo(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return vo(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};ae=_o=Fl([Ul(),we(0,be(q)),we(1,be(H)),we(2,be(ee)),we(3,be(Y)),we(4,be(se)),we(5,be($)),we(6,be(Pt)),we(7,be(Rt)),we(8,be(Re)),we(9,be(x)),Jl("design:paramtypes",[q,H,ee,Y,se,$,Object,Object,Re,Object])],ae)});import{Module as zl}from"@nestjs/common";var Ql,bt,xo=d(()=>{"use strict";Nt();Wn();Qn();Aa();Yn();Ql=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},bt=class{};bt=Ql([zl({imports:[ye,Le,Ke,zn],providers:[ae],exports:[ae]})],bt)});import{Catch as Zl}from"@nestjs/common";var Xl,er,Ma=d(()=>{"use strict";R();Xl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},er=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message})}};er=Xl([Zl(Ye)],er)});var I,ce=d(()=>{"use strict";R();I=class{schema;constructor(e){this.schema=e}transform(e){let t=this.schema.safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.join(".")||"(root)"}: ${o.message}`).join("; ");throw new h(`Validation failed: ${r}`)}return t.data}}});import{randomUUID as Yl}from"node:crypto";function ef(){return Yl()}function Eo(n){let e=n.id??ef(),t=Zi(n.steps),r=Ha(n.steps,t);return{...n,id:e,steps:r}}function Ha(n,e){return n.map(t=>{let r=t.id;return r||(r=Qi(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:Ha(t.steps,e)}:{...t,id:r}})}var La=d(()=>{"use strict";A()});function Ka(n,e,t){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo==="none")throw new h(`Cannot bind a View to workflow '${e}' because appliesTo is 'none'`);if(!ps(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function Wa(n,e){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo!=="none")throw new h(`WorkflowShortcut requires appliesTo 'none', got '${String(n.appliesTo)}'`);if(n.subjectHandling!=="per-subject")throw new h(`WorkflowShortcut requires subjectHandling 'per-subject', got '${n.subjectHandling}'`);return n}function Po(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var tr=d(()=>{"use strict";A();R()});import{Body as Va,Controller as tf,Delete as nf,Get as Ga,HttpCode as rf,Inject as of,Param as Ro,Patch as sf,Post as af,Query as cf}from"@nestjs/common";var St,N,tt,Ae,Qa=d(()=>{"use strict";A();ut();R();ce();La();tr();St=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},N=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},tt=function(n,e){return function(t,r){e(t,r,n)}},Ae=class{workflows;constructor(e){this.workflows=e}async list(e){if(e!=null&&e!==""&&e!=="per-subject"&&e!=="collection")throw new h(`Invalid subjectHandling filter: ${e}`);return this.workflows.list(e?{subjectHandling:e}:{})}async get(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async create(e){let t=Eo(e),r=dt.safeParse(t);if(!r.success){let o=r.error.issues.map(i=>`${i.path.join(".")||"(root)"}: ${i.message}`).join("; ");throw new h(`Validation failed: ${o}`)}return Po(r.data),this.workflows.create(r.data)}async update(e,t){let r=Eo({...t,id:e}),o=dt.safeParse(r);if(!o.success){let u=o.error.issues.map(c=>`${c.path.join(".")||"(root)"}: ${c.message}`).join("; ");throw new h(`Validation failed: ${u}`)}Po(o.data);let{id:i,...s}=o.data,a=await this.workflows.update(e,s);if(!a)throw new g(`Workflow not found: ${e}`);return a}async remove(e){if(!await this.workflows.get(e))throw new g(`Workflow not found: ${e}`);if(!await this.workflows.delete(e))throw new g(`Workflow not found: ${e}`)}};St([Ga(),tt(0,cf("subjectHandling")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"list",null);St([Ga(":id"),tt(0,Ro("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"get",null);St([af(),tt(0,Va(new I(pt))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Ae.prototype,"create",null);St([sf(":id"),tt(0,Ro("id")),tt(1,Va(new I(pt))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],Ae.prototype,"update",null);St([nf(":id"),rf(204),tt(0,Ro("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"remove",null);Ae=St([tf("workflows"),tt(0,of(q)),N("design:paramtypes",[q])],Ae)});import{Body as ko,Controller as uf,Delete as df,Get as To,HttpCode as pf,Inject as Ao,Param as nr,Patch as za,Post as lf,Query as ff}from"@nestjs/common";var We,P,ue,de,Xa=d(()=>{"use strict";A();on();ut();R();ce();tr();ht();Io();We=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},P=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ue=function(n,e){return function(t,r){e(t,r,n)}},de=class{views;workflows;providers;constructor(e,t,r){this.views=e,this.workflows=t,this.providers=r}async list(e){if(e!=null&&e!==""){let t=G.safeParse(e);if(!t.success)throw new h(`Invalid subjectType filter: ${e}`);return this.views.list({subjectType:t.data})}return this.views.list({})}async reorder(e){let t=[];for(let i of e.viewIds){let s=await this.views.get(i);if(!s)throw new h(`Unknown view id in reorder: ${i}`);t.push(s)}if(new Set(t.map(i=>i.subjectType)).size!==1)throw new h("All viewIds in a reorder request must share the same subjectType");return await this.views.reorder(e.viewIds)}async listSubjects(e){return Xn(e,this.views,this.providers)}async get(e){let t=await this.views.get(e);if(!t)throw new g(`SubjectView not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId,e.subjectType),this.views.create(e)}async update(e,t){let r=await this.views.get(e);if(!r)throw new g(`SubjectView not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId,t.subjectType??r.subjectType);let o=await this.views.update(e,t);if(!o)throw new g(`SubjectView not found: ${e}`);return o}async remove(e){if(!await this.views.delete(e))throw new g(`SubjectView not found: ${e}`)}async assertBinding(e,t){let r=await this.workflows.get(e);Ka(r,e,t)}};We([To(),ue(0,ff("subjectType")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"list",null);We([za("reorder"),ue(0,ko(new I(pn))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],de.prototype,"reorder",null);We([To(":id/subjects"),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"listSubjects",null);We([To(":id"),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"get",null);We([lf(),ue(0,ko(new I(un))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],de.prototype,"create",null);We([za(":id"),ue(0,nr("id")),ue(1,ko(new I(dn))),P("design:type",Function),P("design:paramtypes",[String,Object]),P("design:returntype",Promise)],de.prototype,"update",null);We([df(":id"),pf(204),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"remove",null);de=We([uf("views"),ue(0,Ao(Y)),ue(1,Ao(q)),ue(2,Ao($)),P("design:paramtypes",[Y,q,$])],de)});import{Body as Oo,Controller as mf,Delete as hf,Get as Ya,HttpCode as gf,Inject as Za,Param as qo,Patch as ec,Post as yf}from"@nestjs/common";var nt,k,Ve,Ie,tc=d(()=>{"use strict";A();Vr();ut();R();ce();tr();nt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},k=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ve=function(n,e){return function(t,r){e(t,r,n)}},Ie=class{shortcuts;workflows;constructor(e,t){this.shortcuts=e,this.workflows=t}async list(){return this.shortcuts.list()}async reorder(e){for(let t of e.shortcutIds)if(!await this.shortcuts.get(t))throw new h(`Unknown shortcut id in reorder: ${t}`);return this.shortcuts.reorder(e.shortcutIds)}async get(e){let t=await this.shortcuts.get(e);if(!t)throw new g(`WorkflowShortcut not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId),this.shortcuts.create(e)}async update(e,t){let r=await this.shortcuts.get(e);if(!r)throw new g(`WorkflowShortcut not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId);let o=await this.shortcuts.update(e,t);if(!o)throw new g(`WorkflowShortcut not found: ${e}`);return o}async remove(e){if(!await this.shortcuts.delete(e))throw new g(`WorkflowShortcut not found: ${e}`)}async assertBinding(e){let t=await this.workflows.get(e);Wa(t,e)}};nt([Ya(),k("design:type",Function),k("design:paramtypes",[]),k("design:returntype",Promise)],Ie.prototype,"list",null);nt([ec("reorder"),Ve(0,Oo(new I(gn))),k("design:type",Function),k("design:paramtypes",[Object]),k("design:returntype",Promise)],Ie.prototype,"reorder",null);nt([Ya(":id"),Ve(0,qo("id")),k("design:type",Function),k("design:paramtypes",[String]),k("design:returntype",Promise)],Ie.prototype,"get",null);nt([yf(),Ve(0,Oo(new I(mn))),k("design:type",Function),k("design:paramtypes",[Object]),k("design:returntype",Promise)],Ie.prototype,"create",null);nt([ec(":id"),Ve(0,qo("id")),Ve(1,Oo(new I(hn))),k("design:type",Function),k("design:paramtypes",[String,Object]),k("design:returntype",Promise)],Ie.prototype,"update",null);nt([hf(":id"),gf(204),Ve(0,qo("id")),k("design:type",Function),k("design:paramtypes",[String]),k("design:returntype",Promise)],Ie.prototype,"remove",null);Ie=nt([mf("workflow-shortcuts"),Ve(0,Za(Ee)),Ve(1,Za(q)),k("design:paramtypes",[Ee,q])],Ie)});function rr(n,e,t=50){let r=n!=null&&n!==""?Number(n):t,o=e!=null&&e!==""?Number(e):0;return!Number.isFinite(r)||r<1?{limit:t,offset:Math.max(0,o||0)}:!Number.isFinite(o)||o<0?{limit:r,offset:0}:{limit:Math.floor(r),offset:Math.floor(o)}}function or(n,e,t){return n.slice(t,t+e)}var $o=d(()=>{"use strict"});import{z as re}from"zod";var ir,sr,ar,Co=d(()=>{"use strict";ir=re.object({workflowId:re.string().min(1),subjectId:re.string().min(1).optional(),inputValues:re.record(re.string(),re.unknown())}),sr=re.object({response:re.unknown()}),ar=re.object({workflowId:re.string().min(1),subjectIds:re.array(re.string().min(1))})});import{Body as Do,Controller as wf,Get as oc,HttpCode as bf,Inject as nc,Param as Bo,Post as cr,Query as Ge}from"@nestjs/common";import"zod";function rc(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var rt,T,F,Sf,je,ic=d(()=>{"use strict";Yn();Dt();R();ce();$o();Co();rt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},T=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},F=function(n,e){return function(t,r){e(t,r,n)}},Sf=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];je=class{jobs;runner;constructor(e,t){this.jobs=e,this.runner=t}async list(e,t,r,o,i,s,a,u){if(t!=null&&t!==""&&!Sf.includes(t))throw new h(`Invalid status filter: ${t}`);let c=rc(i,"topLevelOnly"),f=rc(s,"terminal"),{limit:m,offset:j}=rr(a,u),S=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...c===!0?{topLevelOnly:!0}:{},...f!==void 0?{terminal:f}:{}});return or(S,m,j)}async latestBySubject(e){return this.jobs.latestBySubject(e.workflowId,e.subjectIds)}async get(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);return t}async create(e){return this.runner.start({workflowId:e.workflowId,...e.subjectId?{subjectId:e.subjectId}:{},inputValues:e.inputValues})}async resume(e,t){return this.runner.resume(e,t.response)}async retry(e){return this.runner.retryFailedJob(e)}};rt([oc(),F(0,Ge("workflowId")),F(1,Ge("status")),F(2,Ge("batchId")),F(3,Ge("parentJobId")),F(4,Ge("topLevelOnly")),F(5,Ge("terminal")),F(6,Ge("limit")),F(7,Ge("offset")),T("design:type",Function),T("design:paramtypes",[String,String,String,String,String,String,String,String]),T("design:returntype",Promise)],je.prototype,"list",null);rt([cr("latest-by-subject"),bf(200),F(0,Do(new I(ar))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],je.prototype,"latestBySubject",null);rt([oc(":id"),F(0,Bo("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],je.prototype,"get",null);rt([cr(),F(0,Do(new I(ir))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],je.prototype,"create",null);rt([cr(":id/resume"),F(0,Bo("id")),F(1,Do(new I(sr))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],je.prototype,"resume",null);rt([cr(":id/retry"),F(0,Bo("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],je.prototype,"retry",null);je=rt([wf("jobs"),F(0,nc(H)),F(1,nc(ae)),T("design:paramtypes",[H,ae])],je)});import{z as V}from"zod";var ur,dr,No=d(()=>{"use strict";A();ur=V.discriminatedUnion("mode",[V.object({mode:V.literal("view"),viewId:V.string().min(1)}),V.object({mode:V.literal("manual"),subjectType:G,subjectIds:V.array(V.string().min(1))})]),dr=V.object({workflowId:V.string().min(1),selection:ur,triggeredBy:V.enum(["schedule","view_bulk","multiselect"]),notificationOverride:Bt.optional(),inputValues:V.record(V.string(),V.unknown())})});import{Body as If,Controller as jf,Get as Uo,Inject as Fo,Param as sc,Post as vf,Query as Jo}from"@nestjs/common";import"zod";var Wt,z,ke,Qe,ac=d(()=>{"use strict";Yn();sn();Dt();R();ce();$o();No();Wt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},z=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ke=function(n,e){return function(t,r){e(t,r,n)}},Qe=class{batches;jobs;runner;constructor(e,t,r){this.batches=e,this.jobs=t,this.runner=r}async list(e,t,r){let{limit:o,offset:i}=rr(t,r),s=await this.batches.list(e?{workflowId:e}:{});return or(s,o,i)}async get(e){let t=await this.batches.get(e);if(!t)throw new g(`JobBatch not found: ${e}`);return t}async listJobs(e){if(!await this.batches.get(e))throw new g(`JobBatch not found: ${e}`);return this.jobs.list({batchId:e})}async launch(e){let t=await this.runner.launch({workflowId:e.workflowId,selection:e.selection,triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},inputValues:e.inputValues});return"resolvedSubjects"in t&&"jobIds"in t?{kind:"batch",batch:t}:{kind:"job",job:t}}};Wt([Uo(),ke(0,Jo("workflowId")),ke(1,Jo("limit")),ke(2,Jo("offset")),z("design:type",Function),z("design:paramtypes",[String,String,String]),z("design:returntype",Promise)],Qe.prototype,"list",null);Wt([Uo(":id"),ke(0,sc("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],Qe.prototype,"get",null);Wt([Uo(":id/jobs"),ke(0,sc("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],Qe.prototype,"listJobs",null);Wt([vf(),ke(0,If(new I(dr))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],Qe.prototype,"launch",null);Qe=Wt([jf("batches"),ke(0,Fo(ee)),ke(1,Fo(H)),ke(2,Fo(ae)),z("design:paramtypes",[ee,H,ae])],Qe)});import{Body as cc,Controller as _f,Delete as xf,Get as uc,HttpCode as Ef,Inject as Pf,Param as Mo,Patch as Rf,Post as Af,Query as kf}from"@nestjs/common";var It,J,ot,Te,dc=d(()=>{"use strict";A();Kr();R();ce();It=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},J=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ot=function(n,e){return function(t,r){e(t,r,n)}},Te=class{schedules;constructor(e){this.schedules=e}async list(e){if(e==null||e==="")return this.schedules.list();if(e!=="true"&&e!=="false")throw new h(`Invalid enabled filter: ${e}`);return this.schedules.list({enabled:e==="true"})}async get(e){let t=await this.schedules.get(e);if(!t)throw new g(`Schedule not found: ${e}`);return t}async create(e){return this.schedules.create(e)}async update(e,t){let r=await this.schedules.update(e,t);if(!r)throw new g(`Schedule not found: ${e}`);return r}async remove(e){if(!await this.schedules.delete(e))throw new g(`Schedule not found: ${e}`)}};It([uc(),ot(0,kf("enabled")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"list",null);It([uc(":id"),ot(0,Mo("id")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"get",null);It([Af(),ot(0,cc(new I(lt))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Te.prototype,"create",null);It([Rf(":id"),ot(0,Mo("id")),ot(1,cc(new I(lt.partial().omit({id:!0})))),J("design:type",Function),J("design:paramtypes",[String,Object]),J("design:returntype",Promise)],Te.prototype,"update",null);It([xf(":id"),Ef(204),ot(0,Mo("id")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"remove",null);Te=It([_f("schedules"),ot(0,Pf(xe)),J("design:paramtypes",[xe])],Te)});import{Controller as Tf,Inject as Of,Query as pc,Sse as qf}from"@nestjs/common";import{Observable as fc}from"rxjs";var lc,pr,Ho,Vt,mc=d(()=>{"use strict";Gn();lc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},pr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ho=function(n,e){return function(t,r){e(t,r,n)}},Vt=class{events;constructor(e){this.events=e}stream(e,t){return new fc(r=>{let o=this.events.subscribe(i=>{let s=i;e!=null&&e!==""&&(!("jobId"in s)||s.jobId!==e)||t!=null&&t!==""&&(!("batchId"in s)||s.batchId!==t)||r.next({data:s})});return()=>{o()}})}};lc([qf(),Ho(0,pc("jobId")),Ho(1,pc("batchId")),pr("design:type",Function),pr("design:paramtypes",[String,String]),pr("design:returntype",fc)],Vt.prototype,"stream",null);Vt=lc([Tf("events"),Ho(0,Of(se)),pr("design:paramtypes",[se])],Vt)});import{extendZodWithOpenApi as $f}from"@asteasolutions/zod-to-openapi";import{z as Cf}from"zod";var hc=d(()=>{"use strict";$f(Cf)});import{z as gc}from"zod";var lr,Lo=d(()=>{"use strict";lr=gc.object({value:gc.string().min(1)})});import{z as p}from"zod";function em(n){let e=p.toJSONSchema(n),{$schema:t,...r}=e;return r}function wc(n){let e=(t,r)=>n.registerComponent("schemas",t,em(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",dt),WorkflowDefinitionInput:e("WorkflowDefinitionInput",pt),UpdateWorkflowBody:e("UpdateWorkflowBody",Vf),SubjectView:e("SubjectView",cn),CreateSubjectViewBody:e("CreateSubjectViewBody",un),ReorderViewsBody:e("ReorderViewsBody",pn),UpdateViewBody:e("UpdateViewBody",Gf),WorkflowShortcut:e("WorkflowShortcut",fn),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",mn),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",hn),ReorderShortcutsBody:e("ReorderShortcutsBody",gn),Schedule:e("Schedule",lt),UpdateScheduleBody:e("UpdateScheduleBody",Qf),EngineSettings:e("EngineSettings",wn),UpdateSettingsBody:e("UpdateSettingsBody",Xf),SettingsPatchResponse:e("SettingsPatchResponse",Yf),ProviderInstanceConfig:e("ProviderInstanceConfig",yn),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Sn),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",In),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",Zf),SetSecretBody:e("SetSecretBody",lr),CreateJobBody:e("CreateJobBody",ir),ResumeJobBody:e("ResumeJobBody",sr),LatestBySubjectBody:e("LatestBySubjectBody",ar),LatestBySubjectResponse:e("LatestBySubjectResponse",zf),LaunchBody:e("LaunchBody",dr),Job:e("Job",Ko),JobBatch:e("JobBatch",yc),LaunchResponse:e("LaunchResponse",Mf),HealthResponse:e("HealthResponse",Hf),ProviderStatus:e("ProviderStatus",Lf),QueryTemplate:e("QueryTemplate",Li),ProviderActionDescriptor:e("ProviderActionDescriptor",Ki),PreviewModelsBody:e("PreviewModelsBody",jn),PreviewModel:e("PreviewModel",Rs),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",an),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",Wi),ErrorResponse:e("ErrorResponse",Kf),EngineEvent:e("EngineEvent",Wf),Subject:e("Subject",fr)}}var Df,Bf,Nf,Ff,fr,Jf,Uf,Ko,yc,Mf,Hf,Lf,Kf,Wf,Vf,Gf,Qf,zf,Xf,Zf,Yf,O,Wo,Vo=d(()=>{"use strict";hc();A();Co();No();Lo();Df=p.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),Bf=p.object({subjectType:p.literal("ticket"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),status:p.string(),assignee:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Nf=p.object({subjectType:p.literal("pull_request"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),sourceBranch:p.string(),targetBranch:p.string(),author:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Ff=p.object({subjectType:p.literal("documentation"),id:p.string(),source:p.string().min(1),title:p.string(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),fr=p.discriminatedUnion("subjectType",[Bf,Nf,Ff]),Jf=p.discriminatedUnion("mode",[p.object({mode:p.literal("single"),subject:fr}),p.object({mode:p.literal("collection"),subjects:p.array(fr)})]),Uf=p.object({id:p.string(),stepDefinitionId:p.string(),type:p.string(),status:p.enum(["pending","running","waiting_for_children","completed","failed","skipped"]),startedAt:p.string().optional(),completedAt:p.string().optional(),output:p.unknown().optional(),error:p.string().optional(),childJobIds:p.array(p.string()).optional(),iterations:p.array(p.object({index:p.number().int(),stepExecutions:p.array(p.record(p.string(),p.unknown())),startedAt:p.string(),completedAt:p.string().optional()})).optional()}),Ko=p.object({id:p.string(),workflowId:p.string(),status:Df,subjectContext:Jf.optional(),selection:ur.optional(),batchId:p.string().optional(),parentJobId:p.string().optional(),parentStepExecutionId:p.string().optional(),fanOutIndex:p.number().int().optional(),retryOf:p.string().optional(),workflowSnapshot:dt.optional(),context:p.record(p.string(),p.unknown()),worktreePath:p.string().optional(),branch:p.string().optional(),currentStepId:p.string().optional(),currentStepExecutionId:p.string().optional(),stepHistory:p.array(Uf),createdAt:p.string(),updatedAt:p.string(),completedAt:p.string().optional()}),yc=p.object({id:p.string(),workflowId:p.string(),selection:ur,resolvedSubjects:p.array(fr),jobIds:p.array(p.string()),status:p.enum(["running","completed","completed_with_issues","failed"]),triggeredBy:p.enum(["schedule","view_bulk","multiselect"]),scheduleId:p.string().optional(),notificationOverride:Bt.optional(),notificationSent:p.boolean(),createdAt:p.string(),completedAt:p.string().optional()}),Mf=p.discriminatedUnion("kind",[p.object({kind:p.literal("job"),job:Ko}),p.object({kind:p.literal("batch"),batch:yc})]),Hf=p.object({ok:p.boolean(),service:p.string(),timestamp:p.string()}),Lf=p.object({providerId:p.string(),secretKey:p.string(),configured:p.boolean()}),Kf=p.object({error:p.string()}),Wf=p.object({type:p.string(),timestamp:p.string()}).passthrough(),Vf=pt,Gf=dn,Qf=lt.partial().omit({id:!0}),zf=p.record(p.string(),Ko.nullable()),Xf=bn,Zf=p.object({settings:wn,restartRequired:p.literal(!0)}),Yf=p.object({settings:wn,restartRequired:p.boolean()}),O=p.object({id:p.string().min(1)}),Wo=p.object({limit:p.string().optional().openapi({description:"Max items to return (default 50)"}),offset:p.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as v}from"zod";function y(n,e){return{description:e,content:{"application/json":{schema:n}}}}function L(n){return{type:"array",items:n}}function b(n,...e){let t={400:"Validation error",404:"Resource not found",409:"Conflict"};return Object.fromEntries(e.map(r=>[String(r),y(n.ErrorResponse,t[r]??"Error")]))}function bc(n,e){n.registerPath({method:"get",path:"/health",tags:["Health"],summary:"Health check",responses:{200:y(e.HealthResponse,"Service is healthy")}}),n.registerPath({method:"get",path:"/workflows",tags:["Workflows"],summary:"List workflow definitions",request:{query:v.object({subjectHandling:v.enum(["per-subject","collection"]).optional()})},responses:{200:y(L(e.WorkflowDefinition),"Workflow definitions"),...b(e,400)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:O},responses:{200:y(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflows",tags:["Workflows"],summary:"Create a workflow definition",request:{body:{required:!0,content:{"application/json":{schema:e.WorkflowDefinitionInput}}}},responses:{201:y(e.WorkflowDefinition,"Created workflow definition"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:y(e.WorkflowDefinition,"Updated workflow definition"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflows/{id}",tags:["Workflows"],summary:"Delete a workflow definition",description:"Deletes the live workflow definition. Running Jobs keep executing from the snapshot captured at Job creation.",request:{params:O},responses:{204:{description:"Workflow deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:v.object({subjectType:G.optional()})},responses:{200:y(L(e.SubjectView),"Subject views"),...b(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:O},responses:{200:y(e.SubjectView,"Subject view"),...b(e,404)}}),n.registerPath({method:"get",path:"/views/{id}/subjects",tags:["Views"],summary:"Preview subjects matching a view",description:"Live provider query for the View's saved filter. Same resolution path as launch() for { mode: 'view' }. Does not create Jobs or snapshots.",request:{params:O},responses:{200:y(L(e.Subject),"Matching subjects"),...b(e,404,400)}}),n.registerPath({method:"patch",path:"/views/reorder",tags:["Views"],summary:"Reorder views within a subject type group",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderViewsBody}}}},responses:{200:y(L(e.SubjectView),"Reordered views for the subject type"),...b(e,400)}}),n.registerPath({method:"post",path:"/views",tags:["Views"],summary:"Create a subject view",request:{body:{required:!0,content:{"application/json":{schema:e.CreateSubjectViewBody}}}},responses:{201:y(e.SubjectView,"Created subject view"),...b(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:y(e.SubjectView,"Updated subject view"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/views/{id}",tags:["Views"],summary:"Delete a subject view",request:{params:O},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:Wo.extend({workflowId:v.string().optional(),status:v.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]).optional(),batchId:v.string().optional(),parentJobId:v.string().optional(),topLevelOnly:v.enum(["true","false"]).optional().openapi({description:"When true, exclude jobs that belong to a batch or a parent (sub_workflow) job"}),terminal:v.enum(["true","false"]).optional().openapi({description:"When true, only completed/failed/cancelled jobs. When false, only in-progress jobs. Omitted: no terminality filter."})})},responses:{200:y(L(e.Job),"Jobs"),...b(e,400)}}),n.registerPath({method:"get",path:"/jobs/{id}",tags:["Jobs"],summary:"Get a job",request:{params:O},responses:{200:y(e.Job,"Job"),...b(e,404)}}),n.registerPath({method:"post",path:"/jobs",tags:["Jobs"],summary:"Start a single job",request:{body:{required:!0,content:{"application/json":{schema:e.CreateJobBody}}}},responses:{201:y(e.Job,"Started job"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/jobs/latest-by-subject",tags:["Jobs"],summary:"Latest job per subject for a workflow",request:{body:{required:!0,content:{"application/json":{schema:e.LatestBySubjectBody}}}},responses:{200:y(e.LatestBySubjectResponse,"Latest job keyed by subject id"),...b(e,400)}}),n.registerPath({method:"post",path:"/jobs/{id}/resume",tags:["Jobs"],summary:"Resume a job waiting for human input",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:y(e.Job,"Resumed job"),...b(e,400,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/retry",tags:["Jobs"],summary:"Retry a failed job",request:{params:O},responses:{200:y(e.Job,"Retry job"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:Wo.extend({workflowId:v.string().optional()})},responses:{200:y(L(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:O},responses:{200:y(e.JobBatch,"Job batch"),...b(e,404)}}),n.registerPath({method:"get",path:"/batches/{id}/jobs",tags:["Batches"],summary:"List jobs in a batch",request:{params:O},responses:{200:y(L(e.Job),"Jobs in the batch"),...b(e,404)}}),n.registerPath({method:"post",path:"/batches",tags:["Batches"],summary:"Launch a per-subject batch or collection run",description:"Resolves subject selection and starts a JobBatch for per-subject workflows (even for one subject) or a single Job for collection workflows.",request:{body:{required:!0,content:{"application/json":{schema:e.LaunchBody}}}},responses:{201:y(e.LaunchResponse,"Launch result"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:y(L(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:O},responses:{200:y(e.WorkflowShortcut,"Workflow shortcut"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"Create a workflow shortcut",request:{body:{required:!0,content:{"application/json":{schema:e.CreateWorkflowShortcutBody}}}},responses:{201:y(e.WorkflowShortcut,"Created workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/reorder",tags:["Workflow shortcuts"],summary:"Reorder workflow shortcuts",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderShortcutsBody}}}},responses:{200:y(L(e.WorkflowShortcut),"Reordered workflow shortcuts"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Update a workflow shortcut",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:y(e.WorkflowShortcut,"Updated workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Delete a workflow shortcut",request:{params:O},responses:{204:{description:"Workflow shortcut deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/schedules",tags:["Schedules"],summary:"List schedules",request:{query:v.object({enabled:v.enum(["true","false"]).optional()})},responses:{200:y(L(e.Schedule),"Schedules"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:O},responses:{200:y(e.Schedule,"Schedule"),...b(e,404)}}),n.registerPath({method:"post",path:"/schedules",tags:["Schedules"],summary:"Create a schedule",description:"CRUD only \u2014 creating or enabling a schedule does not cause it to fire yet.",request:{body:{required:!0,content:{"application/json":{schema:e.Schedule}}}},responses:{201:y(e.Schedule,"Created schedule"),...b(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:y(e.Schedule,"Updated schedule"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:O},responses:{204:{description:"Schedule deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/providers/status",tags:["Providers"],summary:"Provider secret configuration status",description:"Reports whether each known provider API key is set. Returns key *names* only \u2014 never secret values.",responses:{200:y(L(e.ProviderStatus),"Provider configuration status")}}),n.registerPath({method:"post",path:"/providers/preview-models",tags:["Providers"],summary:"Preview models available to an agent API key",description:"Lookup only \u2014 does not persist settings or secrets. Send apiKey to try a typed key before save, or instanceId to use the already-stored key (never echoed).",request:{body:{required:!0,content:{"application/json":{schema:e.PreviewModelsBody}}}},responses:{200:y(L(e.PreviewModel),"Models available to the key"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/providers/{providerId}/query-templates",tags:["Providers"],summary:"List query templates for a provider",description:"Named, pre-built query templates owned by the provider. Providers with none yet (e.g. documentation) return an empty list. The client never constructs `query` itself \u2014 it submits templateId + params to the resolve endpoint.",request:{params:v.object({providerId:v.string().min(1)})},responses:{200:y(L(e.QueryTemplate),"Query templates")}}),n.registerPath({method:"get",path:"/providers/{providerId}/actions",tags:["Providers"],summary:"List extended actions for a provider",description:"Opt-in capabilities beyond the portable five ProviderAction operations. Providers that do not implement ExtendedActionProvider return an empty list \u2014 that is a normal, expected case, not an error.",request:{params:v.object({providerId:v.string().min(1)})},responses:{200:y(L(e.ProviderActionDescriptor),"Extended actions")}}),n.registerPath({method:"post",path:"/providers/{providerId}/query-templates/{templateId}/resolve",tags:["Providers"],summary:"Resolve a query template to a concrete query",description:"Provider-specific query-shape knowledge stays server-side. Returns the `query` object to store on a SubjectView, along with template provenance the client attaches separately.",request:{params:v.object({providerId:v.string().min(1),templateId:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.ResolveQueryTemplateBody}}}},responses:{200:y(e.ResolveQueryTemplateResponse,"Resolved query"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/settings",tags:["Settings"],summary:"Get engine settings",description:"Persisted provider configuration. Never includes secret values \u2014 those live in SecretStore.",responses:{200:y(e.EngineSettings,"Current engine settings")}}),n.registerPath({method:"patch",path:"/settings",tags:["Settings"],summary:"Update engine settings",description:"Partial merge. restartRequired is true when providerInstances is in the patch (instance bindings are boot-time). Changing defaultAgentInstanceId takes effect on the next agent step with no restart.",request:{body:{required:!0,content:{"application/json":{schema:e.UpdateSettingsBody}}}},responses:{200:y(e.SettingsPatchResponse,"Updated settings"),...b(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:y(L(e.ProviderInstanceConfig),"Configured provider instances")}}),n.registerPath({method:"post",path:"/provider-instances",tags:["Settings"],summary:"Create a provider instance",description:"Persists the instance. restartRequired is always true \u2014 bindings are boot-time. For agent instances, defaultAgent atomically replaces EngineSettings.defaultAgentInstanceId in the same write.",request:{body:{required:!0,content:{"application/json":{schema:e.CreateProviderInstanceBody}}}},responses:{201:y(e.ProviderInstanceMutationResponse,"Created instance settings"),...b(e,400,409)}}),n.registerPath({method:"get",path:"/provider-instances/{id}",tags:["Settings"],summary:"Get a provider instance",request:{params:v.object({id:v.string().min(1)})},responses:{200:y(e.ProviderInstanceConfig,"Provider instance"),...b(e,404)}}),n.registerPath({method:"patch",path:"/provider-instances/{id}",tags:["Settings"],summary:"Update a provider instance",request:{params:v.object({id:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.UpdateProviderInstanceBody}}}},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated instance settings"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/provider-instances/{id}",tags:["Settings"],summary:"Delete a provider instance",request:{params:v.object({id:v.string().min(1)})},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated settings after delete"),...b(e,404)}}),n.registerPath({method:"post",path:"/secrets/{key}",tags:["Settings"],summary:"Store a secret",description:"Writes to SecretStore. The response never includes the secret value.",request:{params:v.object({key:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.SetSecretBody}}}},responses:{204:{description:"Secret stored"},...b(e,400)}}),n.registerPath({method:"get",path:"/events",tags:["Events"],summary:"Subscribe to engine events (SSE)",description:"Server-Sent Events stream. Each event `data` field is a JSON EngineEvent. Optionally filter by jobId and/or batchId.",request:{query:v.object({jobId:v.string().optional(),batchId:v.string().optional()})},responses:{200:{description:"SSE stream of engine events",content:{"text/event-stream":{schema:e.EngineEvent}}}}})}var Sc=d(()=>{"use strict";A();Vo()});import{OpenAPIRegistry as tm,OpenApiGeneratorV31 as nm}from"@asteasolutions/zod-to-openapi";function Ic(){if(mr)return mr;let n=new tm,e=wc(n);return bc(n,e),mr=new nm(n.definitions).generateDocument({openapi:"3.1.0",info:{title:"Knoflows Engine API",version:"0.1.0",description:"REST API for workflow definitions, jobs, batches, schedules, views, and live events."},servers:[{url:"/api"}]}),mr}var mr,jc=d(()=>{"use strict";Vo();Sc()});import{Controller as rm,Get as om,Header as im}from"@nestjs/common";var vc,Go,Gt,_c=d(()=>{"use strict";jc();vc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Go=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Gt=class{getOpenApiDocument(){return Ic()}};vc([om("openapi.json"),im("Content-Type","application/json"),Go("design:type",Function),Go("design:paramtypes",[]),Go("design:returntype",void 0)],Gt.prototype,"getOpenApiDocument",null);Gt=vc([rm()],Gt)});import{Controller as sm,Get as Qo,Inject as hr,Param as gr,Post as xc,Body as Ec,HttpCode as Pc}from"@nestjs/common";var jt,U,ve,Oe,Rc=d(()=>{"use strict";Yr();po();lo();ho();A();ce();jt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},U=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ve=function(n,e){return function(t,r){e(t,r,n)}},Oe=class{providerStatus;queryTemplates;extendedActions;previewModels;constructor(e,t,r,o){this.providerStatus=e,this.queryTemplates=t,this.extendedActions=r,this.previewModels=o}async status(){return this.providerStatus.list()}previewAvailableModels(e){return this.previewModels.preview(e)}listQueryTemplates(e){return this.queryTemplates.list(e)}listExtendedActions(e){return this.extendedActions.list(e)}async resolveQueryTemplate(e,t,r){return{query:await this.queryTemplates.resolve(e,t,r.params)}}};jt([Qo("status"),U("design:type",Function),U("design:paramtypes",[]),U("design:returntype",Promise)],Oe.prototype,"status",null);jt([xc("preview-models"),Pc(200),ve(0,Ec(new I(jn))),U("design:type",Function),U("design:paramtypes",[Object]),U("design:returntype",Promise)],Oe.prototype,"previewAvailableModels",null);jt([Qo(":providerId/query-templates"),ve(0,gr("providerId")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Oe.prototype,"listQueryTemplates",null);jt([Qo(":providerId/actions"),ve(0,gr("providerId")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Oe.prototype,"listExtendedActions",null);jt([xc(":providerId/query-templates/:templateId/resolve"),Pc(200),ve(0,gr("providerId")),ve(1,gr("templateId")),ve(2,Ec(new I(an))),U("design:type",Function),U("design:paramtypes",[String,String,Object]),U("design:returntype",Promise)],Oe.prototype,"resolveQueryTemplate",null);Oe=jt([sm("providers"),ve(0,hr(Je)),ve(1,hr(Ue)),ve(2,hr(Me)),ve(3,hr(He)),U("design:paramtypes",[Je,Ue,Me,He])],Oe)});import{Body as am,Controller as cm,Get as um,Inject as dm,Patch as pm}from"@nestjs/common";var zo,it,Ac,vt,kc=d(()=>{"use strict";A();ge();ce();zo=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},it=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ac=function(n,e){return function(t,r){e(t,r,n)}},vt=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:$s(e)}}};zo([um(),it("design:type",Function),it("design:paramtypes",[]),it("design:returntype",Promise)],vt.prototype,"get",null);zo([pm(),Ac(0,am(new I(bn))),it("design:type",Function),it("design:paramtypes",[Object]),it("design:returntype",Promise)],vt.prototype,"update",null);vt=zo([cm("settings"),Ac(0,dm(x)),it("design:paramtypes",[x])],vt)});function Xo(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return ft(t)?r===!0?t.id:r===!1?e===t.id?null:e??null:o&&!e?t.id:e??null:e===t.id?null:e??null}function Tc(n){let{defaultAgent:e,...t}=n;return t}var Oc=d(()=>{"use strict";A()});import{Body as qc,Controller as lm,Delete as fm,Get as $c,HttpCode as mm,Inject as hm,Param as Zo,Patch as gm,Post as ym}from"@nestjs/common";var xt,M,_t,qe,Cc=d(()=>{"use strict";A();ge();R();ce();Oc();xt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},M=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_t=function(n,e){return function(t,r){e(t,r,n)}},qe=class{settings;constructor(e){this.settings=e}async list(){return(await this.settings.get()).providerInstances??[]}async get(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new g(`Provider instance not found: ${e}`);return t}async create(e){let t=Tc(e),r=await this.settings.get(),o=[...r.providerInstances??[]];if(o.some(s=>s.id===t.id))throw new et(`Provider instance already exists: ${t.id}`);return o.push(t),{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Xo({current:r.defaultAgentInstanceId,instance:t,defaultAgent:e.defaultAgent,isCreate:!0})}),restartRequired:!0}}async update(e,t){let r=await this.settings.get(),o=[...r.providerInstances??[]],i=o.findIndex(c=>c.id===e);if(i<0)throw new g(`Provider instance not found: ${e}`);let a={...o[i],...t.displayName!=null?{displayName:t.displayName}:{},...t.config!=null?{config:t.config}:{},...t.secretKey!=null?{secretKey:t.secretKey}:{}};return t.expiresOn!==void 0&&(t.expiresOn?a.expiresOn=t.expiresOn:delete a.expiresOn),o[i]=a,{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Xo({current:r.defaultAgentInstanceId,instance:a,defaultAgent:t.defaultAgent,isCreate:!1})}),restartRequired:!0}}async remove(e){let t=await this.settings.get(),r=(t.providerInstances??[]).filter(s=>s.id!==e);if(r.length===(t.providerInstances??[]).length)throw new g(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};xt([$c(),M("design:type",Function),M("design:paramtypes",[]),M("design:returntype",Promise)],qe.prototype,"list",null);xt([$c(":id"),_t(0,Zo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],qe.prototype,"get",null);xt([ym(),_t(0,qc(new I(Sn))),M("design:type",Function),M("design:paramtypes",[Object]),M("design:returntype",Promise)],qe.prototype,"create",null);xt([gm(":id"),_t(0,Zo("id")),_t(1,qc(new I(In))),M("design:type",Function),M("design:paramtypes",[String,Object]),M("design:returntype",Promise)],qe.prototype,"update",null);xt([fm(":id"),mm(200),_t(0,Zo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],qe.prototype,"remove",null);qe=xt([lm("provider-instances"),_t(0,hm(x)),M("design:paramtypes",[x])],qe)});import{Body as wm,Controller as bm,HttpCode as Sm,Inject as Im,Param as jm,Post as vm}from"@nestjs/common";var Dc,yr,Yo,Qt,Bc=d(()=>{"use strict";_e();R();ce();Lo();Dc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},yr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Yo=function(n,e){return function(t,r){e(t,r,n)}},Qt=class{secrets;constructor(e){this.secrets=e}async set(e,t){let r=e.trim();if(!r)throw new h("Secret key must not be empty");await this.secrets.set(r,t.value)}};Dc([vm(":key"),Sm(204),Yo(0,jm("key")),Yo(1,wm(new I(lr))),yr("design:type",Function),yr("design:paramtypes",[String,Object]),yr("design:returntype",Promise)],Qt.prototype,"set",null);Qt=Dc([bm("secrets"),Yo(0,Im(oe)),yr("design:paramtypes",[Function])],Qt)});import{Module as xm}from"@nestjs/common";import{APP_FILTER as Em}from"@nestjs/core";var _m,wr,Nc=d(()=>{"use strict";Nt();xo();Qn();Ma();Qa();Xa();tc();ic();ac();dc();mc();_c();Rc();kc();Cc();Bc();Wn();Or();_m=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},wr=class{};wr=_m([xm({imports:[ye,bt,Ke,Le,at],controllers:[Ae,de,Ie,je,Qe,Te,Vt,Gt,Oe,vt,qe,Qt],providers:[{provide:Em,useClass:er}]})],wr)});import{Module as Rm}from"@nestjs/common";var Pm,br,Fc=d(()=>{"use strict";ri();oi();ii();Wn();_a();Qn();Nt();xo();Nc();Pm=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},br=class{};br=Pm([Rm({imports:[zt,Xt,Le,Vn,Ke,ye,bt,wr],controllers:[Et]})],br)});import{apiReference as Am}from"@scalar/nestjs-api-reference";function Jc(n){n.use("/api/docs",Am({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var Uc=d(()=>{"use strict"});import{createServer as km}from"node:net";function Mc(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function ei(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await Tm(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function Tm(n){return new Promise(e=>{let t=km();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var Hc=d(()=>{"use strict"});import{Catch as $m,HttpStatus as Sr,NotFoundException as Cm}from"@nestjs/common";import{existsSync as Lc,statSync as Dm}from"node:fs";import{extname as Kc,join as ti,normalize as Bm,relative as Nm,sep as Fm}from"node:path";function Wc(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=Jm(e.path??"/");if(o){let i=ti(n,o);if(Um(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(Vc(e)){Gc(t,n,i=>{i&&!t.headersSent&&t.status(Sr.NOT_FOUND).end()});return}t.status(Sr.NOT_FOUND).end()}}function Vc(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=Kc(e);return!(t&&t!==".html")}function Gc(n,e,t){n.sendFile("index.html",{root:e},t)}function Jm(n){if(n==="/"||n==="")return"index.html";let e=Bm(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!Kc(e)?null:e}function Um(n,e){if(!Lc(e))return!1;try{if(!Dm(e).isFile())return!1}catch{return!1}let t=Nm(n,e);return t!==""&&!t.startsWith(`..${Fm}`)&&!t.startsWith("..")}function Qc(n){return ti(n,"index.html")}var Om,qm,Ir,zc=d(()=>{"use strict";Om=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},qm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ir=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(Vc(o)&&Lc(ti(this.staticRoot,"index.html"))){Gc(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(Sr.NOT_FOUND).json({statusCode:Sr.NOT_FOUND,message:"UI index.html could not be served"})});return}let s=e.getStatus(),a=e.getResponse();i.status(s).json(typeof a=="string"?{statusCode:s,message:a}:a)}};Ir=Om([$m(Cm),qm("design:paramtypes",[String])],Ir)});import{existsSync as Mm}from"node:fs";import{dirname as Hm,join as jr}from"node:path";import{fileURLToPath as Lm}from"node:url";function Xc(){let n=Hm(Lm(import.meta.url)),e=[jr(n,"../static"),jr(n,"../../static"),jr(n,"static")];for(let t of e)if(Mm(jr(t,"index.html")))return t;return null}var Zc=d(()=>{"use strict"});var Qm={};import"reflect-metadata";import{existsSync as Km}from"node:fs";import{Logger as Wm}from"@nestjs/common";import{NestFactory as Vm}from"@nestjs/core";async function Gm(){let n=await Vm.create(br);n.enableCors(),n.setGlobalPrefix("api"),Jc(n);let e=Xc(),t=e?Qc(e):null;e&&t&&Km(t)?(vr.log(`Serving UI from ${e}`),n.use(Wc(e)),n.useGlobalFilters(new Ir(e))):vr.warn("No UI found (static/index.html missing). GET / will 404; /api still works. Rebuild with `npm run build:release` before publishing.");let r=Number(process.env.PORT??3e3);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`Invalid PORT: ${process.env.PORT}`);let o=await ei(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?vr.warn(`Port ${r} is in use; listening on ${o} instead`):vr.log(`Listening on http://localhost:${o}`);return}catch(s){if(!Mc(s))throw s;o=await ei(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var vr,Yc=d(()=>{"use strict";Fc();Uc();Hc();zc();Zc();vr=new Wm("Bootstrap");Gm()});import{readFileSync as zm}from"node:fs";function Xm(){let n=zm(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var _r=process.argv.slice(2);_r.includes("--version")||_r.includes("-v")?console.log(Xm()):_r.includes("--help")||_r.includes("-h")?console.log(["Usage: knoflows [options]","","Starts the knoflows engine (REST API + bundled web client).","","Options:"," -v, --version Print the engine version and exit"," -h, --help Print this message and exit","","Environment:"," PORT Preferred HTTP port (default 3000). If taken, the next free port is used."," KNO_SQLITE_PATH SQLite file path, or :memory: for an ephemeral database"].join(`
23
- `)):await Promise.resolve().then(()=>(Yc(),Qm));
20
+ `)}function Jn(n,e){return e==="free_text"?n:hu(n)}function hu(n){let e=[...n.matchAll(/```json\s*([\s\S]*?)```/gi)].map(o=>o[1].trim()),t=[...n.matchAll(/```\s*([\s\S]*?)```/g)].map(o=>o[1].trim()),r=[...e].reverse();r.length===0&&r.push(...[...t].reverse()),r.push(n.trim());for(let o of r)if(o)try{return JSON.parse(o)}catch{continue}throw new Error("No valid JSON block found in agent response")}var Km,Hm,Vm,Gm,Nr=l(()=>{"use strict";Ce();Km={user:"User preferences",organization:"Organization guidelines",project:"Project context"},Hm=["user","organization","project"],Vm={questionnaire:'Respond with a single fenced JSON block matching this shape exactly: {"questions":[{"id":"<string>","prompt":"<string>"}]}. No other prose outside the fence.',confirmation:'Respond with a single fenced JSON block matching this shape exactly: {"approved":<boolean>}. No other prose outside the fence.',comment_suggestions:'Respond with a single fenced JSON block matching this shape exactly: {"suggestions":[{"id":"<string>","file":"<string>","line":<number>,"body":"<string>"}]}. No other prose outside the fence.',free_text:"Respond in plain text. Do not wrap the answer in a JSON object."},Gm={anthropic:"Anthropic",cursor:"Cursor"}});async function zt(n){let e=n.fetchFn??fetch;return n.type==="claude"?Xm(n.apiKey,e):Zm(n.apiKey,e)}async function Xm(n,e){let t=await e(Qm,{method:"GET",headers:{"x-api-key":n,"anthropic-version":Ym}});if(!t.ok)throw yu("Claude",t.status);let r=await t.json();return(Array.isArray(r.data)?r.data:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.display_name=="string"&&s.display_name.trim()?s.display_name:a;return[{id:a,displayName:u}]})}async function Zm(n,e){let t=await e(zm,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw yu("Cursor",t.status);let r=await t.json();return(Array.isArray(r.items)?r.items:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.displayName=="string"&&s.displayName.trim()?s.displayName:a;return[{id:a,displayName:u}]})}function yu(n,e){let t=new Error(`${n} rejected the API key (HTTP ${e}). Check the key and try again.`);return t.name="PreviewModelsAuthError",t}var Qm,zm,Ym,Lr=l(()=>{"use strict";Qm="https://api.anthropic.com/v1/models",zm="https://api.cursor.com/v1/models",Ym="2023-06-01"});function ye(n){return{success:!1,message:n instanceof Error?n.message:String(n)}}function Yt(n,e){return n.trim().toLowerCase()===e.trim().toLowerCase()?null:{success:!0,identityMismatch:!0,message:`Connected successfully, but the authenticated account is \`${e}\`, not the configured \`${n}\`.`}}var At=l(()=>{"use strict"});async function*th(n){let{query:e}=await import("@anthropic-ai/claude-agent-sdk"),t=n.options;yield*e({prompt:n.prompt,options:{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,...t?.cwd?{cwd:t.cwd}:{},...t?.resume?{resume:t.resume}:{},...t?.model?{model:t.model}:{},...t?.env?{env:t.env}:{}}})}var eh,Xt,Ni=l(()=>{"use strict";Nr();Ce();Lr();At();Nr();eh=Ht("anthropic"),Xt=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ln(e),o={permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,env:{...process.env,ANTHROPIC_API_KEY:t}};e.cwd&&(o.cwd=e.cwd),e.sessionId&&(o.resume=e.sessionId),this.options.model&&(o.model=this.options.model);let i=this.options.queryFn??th,s,a,u;for await(let c of i({prompt:r,options:o}))c.session_id&&(s=c.session_id),c.type==="result"&&(c.subtype==="success"&&typeof c.result=="string"?a=c.result:u=c.errors?.join("; ")||c.subtype||"Claude agent returned an error result");if(u)throw new Error(`Claude agent failed: ${u}`);if(a==null)throw new Error("Claude agent returned no result text");if(!s)throw new Error("Claude agent returned no session id");return{raw:a,parsed:Jn(a,e.outputFormat),sessionId:s}}async testConnection(){try{let e=await this.requireApiKey();return await zt({type:"claude",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||eh,t=await this.secrets.get(e);if(!t)throw Fr("anthropic",e);return t}}});function rh(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function oh(){let{Agent:n}=await import("@cursor/sdk");return{create:e=>n.create({apiKey:e.apiKey,...e.model?{model:e.model}:{},local:{...e.local?.cwd?{cwd:e.local.cwd}:{},settingSources:[]}}),resume:(e,t)=>n.resume(e,{apiKey:t.apiKey,...t.model?{model:t.model}:{},local:{...t.local?.cwd?{cwd:t.local.cwd}:{},settingSources:[]}})}}var nh,Zt,Li=l(()=>{"use strict";Nr();Ce();Lr();At();nh=Ht("cursor"),Zt=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ln(e),o=this.options.sdk??await oh(),i=rh(t,e.cwd,this.options.model),s=e.sessionId?await o.resume(e.sessionId,i):await o.create(i);try{let u=await(await s.send(r)).wait();if(u.status!=="finished")throw new Error(u.error?.message||`Cursor agent ended with status '${u.status}'`);let c=u.result??"";return{raw:c,parsed:Jn(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async testConnection(){try{let e=await this.requireApiKey();return await zt({type:"cursor",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||nh,t=await this.secrets.get(e);if(!t)throw Fr("cursor",e);return t}}});function gu(n){return typeof n=="object"&&n!=null&&typeof n.listExtendedActions=="function"&&typeof n.executeExtendedAction=="function"}function Jr(n,e){let t=n.params.filter(r=>r.required).filter(r=>{let o=e[r.name];return o==null||typeof o=="string"&&o.trim()===""}).map(r=>r.name);if(t.length>0)throw new Error(`Extended action '${n.actionId}' is missing required params: ${t.join(", ")}`)}function en(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var Ur=l(()=>{"use strict"});function Un(n){return n==null?"":typeof n=="string"?n:wu(n).replace(/\n+$/,"")}function Mr(n){return{version:1,type:"doc",content:n.split(`
21
+ `).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function wu(n){if(n==null||typeof n!="object")return"";let e=n;if(e.type==="text")return e.text??"";if(e.type==="hardBreak")return`
22
+ `;let t=(e.content??[]).map(wu).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
23
+ `:t}var Ji=l(()=>{"use strict"});function sh(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function Su(n){return{representation:"atlas_doc_format",value:JSON.stringify(Mr(n))}}function xu(n){return Un(ah(n))}function ah(n){if(n==null||typeof n!="object")return n;let e=n.atlas_doc_format;if(e!=null){if(typeof e=="object"&&e!==null&&"value"in e){let t=e.value;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}return e}}function ch(n){return!(n.id==null||String(n.id)===""||n.type!=null&&n.type!=="page"||n.status!=null&&n.status!=="current")}function Mi(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:uh(e,n),raw:n}}function uh(n,e){let t=n.replace(/\/$/,""),r=e._links?.webui?.trim();if(r)return r.startsWith("http://")||r.startsWith("https://")?r:r.startsWith("/wiki")?`${t}${r}`:`${t}/wiki${r.startsWith("/")?r:`/${r}`}`;let o=e.id!=null?String(e.id):"";return o?`${t}/wiki/pages/${encodeURIComponent(o)}`:t}function lh(n,e){return{id:String(n.id??""),subjectId:e,body:xu(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var ih,Ui,bu,Wr,Kr,tn,Hr=l(()=>{"use strict";Ur();Ji();At();ih="kno.confluence.apiToken",Ui=50,bu=10,Wr=500,Kr=[{actionId:"create_page",label:"Create Confluence page",params:[{name:"spaceKey",label:"Space key",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"content",label:"Content",type:"string",required:!0}]}],tn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||ih}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Mi(r,t,this.instanceId)}async getContent(e){await this.requireConfig();let t=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}?body-format=atlas_doc_format`);return xu(t.body)}async query(e){if(Object.prototype.hasOwnProperty.call(e,"pageIds")){if(!Array.isArray(e.pageIds))throw new Error("Documentation query requires { pageIds: string[] }");let o=[];for(let i of e.pageIds)o.push(await this.get(String(i)));return o}let t=typeof e.spaceKey=="string"?e.spaceKey.trim():"";if(t)return this.queryBySpaceKey(t);let r=typeof e.parentPageId=="string"?e.parentPageId.trim():"";if(r)return this.queryByParentPageId(r);throw new Error("Documentation query requires { pageIds: string[] }, { spaceKey: string }, or { parentPageId: string }")}async getComments(e){await this.requireConfig();let t=[],r=`/wiki/api/v2/pages/${encodeURIComponent(e)}/footer-comments?body-format=atlas_doc_format&limit=${Ui}`,o=new Set;for(let i=0;i<bu&&t.length<Wr&&!(!r||o.has(r));i++){o.add(r);let s=await this.request("GET",r),a=Array.isArray(s.results)?s.results:[];for(let c of a){if(t.length>=Wr)break;t.push(lh(c,e))}let u=typeof s._links?.next=="string"?s._links.next:void 0;if(!u||a.length===0)break;r=u}return t}async postComment(e,t){await this.requireConfig(),await this.request("POST","/wiki/api/v2/footer-comments",{body:{pageId:e,body:Su(t)}})}listExtendedActions(){return Kr}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${en(this.listExtendedActions())}`)}async createPage(e){let t=Kr[0];Jr(t,e);let r=String(e.spaceKey).trim(),o=String(e.title).trim(),i=String(e.content),{baseUrl:s}=await this.requireConfig(),a=await this.resolveSpaceId(r),u=await this.request("POST","/wiki/api/v2/pages",{body:{spaceId:a,status:"current",title:o,body:Su(i)}});return Mi(u,s,this.instanceId)}async queryBySpaceKey(e){let t=await this.resolveSpaceId(e);return this.collectPages(`/wiki/api/v2/spaces/${encodeURIComponent(t)}/pages?limit=${Ui}&status=current&depth=all`)}async queryByParentPageId(e){return(await this.collectPages(`/wiki/api/v2/pages/${encodeURIComponent(e)}/children?limit=${Ui}`)).filter(r=>r.id!==e)}async collectPages(e){let{baseUrl:t}=await this.requireConfig(),r=[],o=e,i=new Set;for(let s=0;s<bu&&r.length<Wr&&!(!o||i.has(o));s++){i.add(o);let a=await this.request("GET",o),u=Array.isArray(a.results)?a.results:[];for(let p of u){if(r.length>=Wr)break;ch(p)&&r.push(Mi(p,t,this.instanceId))}let c=typeof a._links?.next=="string"?a._links.next:void 0;if(!c||u.length===0)break;o=c}return r}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async testConnection(){try{return await this.request("GET","/wiki/api/v2/spaces?limit=1"),{success:!0}}catch(e){return ye(e)}}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Confluence instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=sh(o,t),u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Confluence ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let p=await c.text();if(p)return JSON.parse(p)}}});import{randomUUID as ph}from"node:crypto";var dh,Vr,vu=l(()=>{"use strict";dh=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),Vr=class{pages;contentById;comments;instanceId;type;constructor(e=[],t){this.pages=new Map,this.contentById=new Map,this.comments=new Map,this.instanceId=t?.instanceId,this.type=t?.type;for(let r of e){let{content:o,...i}=r;this.pages.set(i.id,structuredClone(i)),o!==void 0&&this.contentById.set(i.id,o)}}async get(e){let t=this.pages.get(e);if(!t)throw new Error(`Documentation page not found: ${e}`);return this.withSource(structuredClone(t))}async getContent(e){await this.get(e);let t=this.contentById.get(e);if(t===void 0)throw new Error(`Documentation content not found: ${e}`);return t}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){let t=await this.get(e);return this.assertCommentsSupported(t),structuredClone(this.comments.get(e)??[])}async postComment(e,t){let r=await this.get(e);this.assertCommentsSupported(r);let o=this.comments.get(e)??[];o.push({id:ph(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(dh.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function lt(n){let e=Array.isArray(n)?n:typeof n=="string"?[n]:[],t=[],r=new Set;for(let o of e){if(typeof o!="string")continue;let i=o.trim();!i||r.has(i)||(r.add(i),t.push(i))}return t}function Gr(n,e){if(n.length>10)throw new Error(`${e} accepts at most 10 repositories, got ${n.length}`)}var Mn=l(()=>{"use strict"});function Wi(){return mh.replace(/\/$/,"")}function nn(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' (e.g. 'kno-engine#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1);if(!/^\d+$/.test(o))throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' with a numeric PR number, got '${n}'`);return{repoSlug:r,prNumber:o}}function hh(n,e){return`${n}#${e}`}function Gi(n){let e=n.repoSlugs!==void 0?n.repoSlugs:n.repoSlug,t=lt(e);return Gr(t,"filter.repoSlugs"),t}function yh(n){let e=Gi(n);if(e.length===0)throw new Error("Bitbucket query requires filter.repoSlugs or filter.role=author \u2014 repo-scoped listing needs repoSlugs; workspace-wide listing needs role=author");return e}function gh(n){let e=Gi(n);if(e.length===0)throw new Error("Bitbucket reviewer query requires filter.repoSlugs \u2014 Bitbucket Cloud has no workspace-wide listing of pull requests a user is reviewing");return e}function Iu(n){if(!Pu(n.role))return;let e=String(n.role).trim().toLowerCase();if(e!=="author"&&e!=="reviewer")throw new Error(`Bitbucket query filter.role must be 'author' or 'reviewer', got '${String(n.role)}'`);return e}function wh(n){if(!(Gi(n).length>0))return Iu(n)==="author"?"author":void 0}function _u(n){if(!Pu(n))return;let e=String(n).trim().toUpperCase();if(e!=="OPEN"&&e!=="MERGED"&&e!=="DECLINED")throw new Error(`Bitbucket query filter.state must be OPEN, MERGED, or DECLINED, got '${String(n)}'`);return e}function bh(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=[],t=typeof n.reviewerUuid=="string"?n.reviewerUuid.trim():"";t&&e.push(`reviewers.uuid="${t}"`);let r=_u(n.state);return r&&e.push(`state="${r}"`),e.length>0?e.join(" AND "):void 0}function Sh(n){let e=n.destination?.repository?.name;if(typeof e=="string"&&e.trim().length>0)return e.trim();let t=n.destination?.repository?.full_name;if(typeof t=="string"&&t.includes("/"))return t.slice(t.lastIndexOf("/")+1);throw new Error("Bitbucket workspace pull request is missing destination.repository slug")}function xh(n){let e=n.trim().toLowerCase();if(e==="approved")return"approve";if(e==="declined"||e==="rejected")return"decline";if(e==="merged")return"merge";throw new Error(`No Bitbucket action for status '${n}'. Accepted: approved, declined/rejected, merged`)}function Pu(n){return n!=null&&n!==""}function Qr(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function zr(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:hh(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},sourceBranch:String(n.source?.branch?.name??""),targetBranch:String(n.destination?.branch?.name??""),...n.author?.display_name?{author:n.author.display_name}:{},...n.links?.html?.href?{url:n.links.html.href}:{},raw:n}}function vh(n,e){let t=n.user?.display_name??n.author?.display_name;return{id:String(n.id??""),subjectId:e,body:n.content?.raw??"",...t?{author:t}:{},createdAt:n.created_on??"",raw:n}}var fh,mh,Ki,ju,Hi,Vi,rn,Yr=l(()=>{"use strict";Ur();At();Mn();fh="kno.bitbucket.apiToken",mh="https://api.bitbucket.org/2.0";Ki=50,ju=10,Hi=500,Vi=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],rn=class{secrets;fetchFn;instanceId;email;workspace;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.email=t.email?.trim()||void 0,this.workspace=t.workspace?.trim()||void 0,this.secretKey=t.secretKey?.trim()||fh}async get(e){let{repoSlug:t,prNumber:r}=nn(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return zr(i,t,this.instanceId)}async query(e){if(Iu(e)==="reviewer"){let r=gh(e),o=await this.accountUuid();return this.queryRepos(r,{...e,reviewerUuid:o})}return wh(e)?this.queryWorkspacePullRequests(e):this.queryRepos(yh(e),e)}async queryRepos(e,t){return(await Promise.all(e.map(async o=>{try{return await this.queryRepoPullRequests(o,t)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`Bitbucket query failed for repository '${o}': ${s}`)}}))).flat()}async queryRepoPullRequests(e,t){let{workspace:r}=await this.requireConfig(),o=bh(t),i=new URLSearchParams({pagelen:String(Ki)});o&&i.set("q",o);let s=`${Wi()}/repositories/${encodeURIComponent(r)}/${encodeURIComponent(e)}/pullrequests?${i.toString()}`;return this.collectPullRequests(s,e)}async queryWorkspacePullRequests(e){let{workspace:t}=await this.requireConfig(),r=await this.selectedUser(),o=new URLSearchParams({pagelen:String(Ki)}),i=_u(e.state);i&&o.set("state",i);let s=`${Wi()}/workspaces/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}?${o.toString()}`;return this.collectPullRequests(s)}userIdentityCache;async loadUserIdentity(){let{email:e}=await this.requireConfig();if(this.userIdentityCache?.email===e)return this.userIdentityCache;let t=await this.request("GET","/user"),r=Qr(t.uuid),o=Qr(t.uuid,t.account_id,t.username);if(!o)throw new Error("Bitbucket GET /user did not return uuid, account_id, or username \u2014 cannot list workspace pull requests");return this.userIdentityCache={email:e,selectedUser:o,uuid:r},this.userIdentityCache}async selectedUser(){return(await this.loadUserIdentity()).selectedUser}async accountUuid(){let e=(await this.loadUserIdentity()).uuid;if(!e)throw new Error("Bitbucket GET /user did not return uuid \u2014 cannot query pull requests by reviewer");return e}async collectPullRequests(e,t){let r=[],o=new Set,i=e;for(let s=0;s<ju&&r.length<Hi&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),u=Array.isArray(a.values)?a.values:[];for(let p of u){if(r.length>=Hi)break;r.push(zr(p,t??Sh(p),this.instanceId))}let c=typeof a.next=="string"&&a.next.length>0?a.next:void 0;if(!c||u.length===0)break;i=c}return r}async getComments(e){let{repoSlug:t,prNumber:r}=nn(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${Ki}`;for(let u=0;u<ju&&i.length<Hi&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),p=Array.isArray(c.values)?c.values:[];for(let w of p)i.push(vh(w,e));let m=typeof c.next=="string"&&c.next.length>0?c.next:void 0;if(!m||p.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=nn(e),{workspace:i}=await this.requireConfig();await this.request("POST",`${this.prPath(i,r,o)}/comments`,{body:{content:{raw:t}}})}async postPositionedComments(e,t){let{repoSlug:r,prNumber:o}=nn(e),{workspace:i}=await this.requireConfig(),s=`${this.prPath(i,r,o)}/comments`,a=[],u=[];for(let c of t)try{await this.request("POST",s,{body:{content:{raw:c.body},inline:{path:c.file,to:c.line}}}),a.push(c)}catch(p){u.push({comment:c,error:p instanceof Error?p.message:String(p)})}return{succeeded:a,failed:u}}async updateStatus(e,t){let{repoSlug:r,prNumber:o}=nn(e),{workspace:i}=await this.requireConfig(),s=xh(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return Vi}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${en(this.listExtendedActions())}`)}async addReviewer(e){let t=typeof e.subjectId=="string"?e.subjectId.trim():"";if(!t)throw new Error("Bitbucket action 'add_reviewer' requires params.subjectId");let r=typeof e.username=="string"?e.username.trim():"";if(!r)throw new Error("Bitbucket action 'add_reviewer' requires params.username");let{repoSlug:o,prNumber:i}=nn(t),{workspace:s}=await this.requireConfig(),a=await this.request("GET",this.prPath(s,o,i)),u=await this.request("GET",`/users/${encodeURIComponent(r)}`),c=Qr(u.uuid),p=Qr(u.account_id);if(!c&&!p)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(_=>c!=null&&_.uuid===c||p!=null&&_.account_id===p))return zr(a,o,this.instanceId);let x=[...m.map(_=>_.uuid?{uuid:_.uuid}:{account_id:_.account_id}),c?{uuid:c}:{account_id:p}],R=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:x}});return zr(R,o,this.instanceId)}prPath(e,t,r){return`/repositories/${encodeURIComponent(e)}/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}`}async testConnection(){try{let{email:e}=await this.requireAuth(),t=await this.request("GET","/user"),r=typeof t.email=="string"?t.email.trim():"";if(r||(r=await this.primaryBitbucketEmail()),r){let o=Yt(e,r);if(o)return o}return{success:!0}}catch(e){return ye(e)}}async primaryBitbucketEmail(){try{let e=await this.request("GET","/user/emails"),t=Array.isArray(e.values)?e.values:[],r=t.find(o=>o.is_primary===!0)??t[0];return typeof r?.email=="string"?r.email.trim():""}catch{return""}}async requireAuth(){let e=this.email,t=await this.secrets.get(this.secretKey);if(!e||!t){let r=[];throw e||r.push("config.email"),t||r.push(`SecretStore '${this.secretKey}'`),new Error(`Bitbucket instance '${this.instanceId}' is not configured \u2014 missing ${r.join(", ")}. Set email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{email:e,token:t}}async requireConfig(){let e=this.email,t=this.workspace,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.email"),t||o.push("config.workspace"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Bitbucket instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set email and workspace on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{email:e,workspace:t,token:r}}async request(e,t,r={}){let{email:o,token:i}=await this.requireAuth(),s=t.startsWith("http://")||t.startsWith("https://")?t:`${Wi()}${t.startsWith("/")?t:`/${t}`}`,a={Authorization:`Basic ${Buffer.from(`${o}:${i}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(a["Content-Type"]="application/json");let u=await this.fetchFn(s,{method:e,headers:a,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let p=await u.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${u.status}): ${p||u.statusText}`)}if(u.status===204)return;let c=await u.text();if(c)return JSON.parse(c)}}});import{randomUUID as jh}from"node:crypto";function Ih(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Xr,Eu=l(()=>{"use strict";Xr=class{pullRequests;comments;instanceId;constructor(e=[],t){this.pullRequests=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.pullRequests.get(e);if(!t)throw new Error(`Pull request not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.pullRequests.values()].filter(t=>Ih(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:jh(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.pullRequests.get(e);if(!r)throw new Error(`Pull request not found: ${e}`);r.raw={...r.raw??{},status:t}}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Qi(n){return n.pull_request!=null}function to(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1),{owner:i,name:s}=Ru(r);if(!/^\d+$/.test(o))throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);return{owner:i,repo:s,issueNumber:o}}function Rh(n,e,t){return`${n}/${e}#${t}`}function Ru(n){let e=n.trim(),t=e.indexOf("/");if(t<=0||t===e.length-1||e.indexOf("/",t+1)!==-1)throw new Error(`GitHub repo must be '{owner}/{name}', got '${n}'`);return{owner:e.slice(0,t),name:e.slice(t+1)}}function Ah(n){let e=n.repos!==void 0?n.repos:n.repo,t=lt(e);return Gr(t,"filter.repos"),t}function Ch(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function Th(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function $h(n){let e=n.trim().toLowerCase();if(e==="open")return{state:"open"};if(e==="closed"||e==="done"||e==="completed")return{state:"closed",state_reason:"completed"};if(e==="not_planned"||e==="wontfix")return{state:"closed",state_reason:"not_planned"};throw new Error(`No GitHub Issues mapping for status '${n}'. Accepted: ${kh.join(", ")}`)}function Oh(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function zi(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:Rh(o??"",i??"",r),source:e,title:String(n.title??""),...s?{description:s}:{},status:String(n.state??""),...n.assignee?.login?{assignee:n.assignee.login}:{},...n.html_url?{url:n.html_url}:{},raw:n}}function qh(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function no(n){return n!=null&&n!==""}var _h,Ph,Eh,Zr,ku,eo,kh,on,Yi=l(()=>{"use strict";At();Mn();_h="2026-03-10",Ph="https://api.github.com",Eh="kno.github.apiToken",Zr=100,ku=10,eo=500,kh=["open","closed/done/completed","not_planned/wontfix"],on=class{secrets;fetchFn;instanceId;username;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.username=t.username?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Eh}async get(e){let{owner:t,repo:r,issueNumber:o}=to(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(Qi(i))throw new Error(`Ticket not found: ${e}`);return zi(i,this.instanceId,`${t}/${r}`)}async query(e){let t=Ah(e);if(t.length>0)return this.queryRepos(t,e);let r=Ch(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repos ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=to(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>qh(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=to(e);await this.request("POST",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}/comments`,{body:{body:t}})}async updateStatus(e,t){let{owner:r,repo:o,issueNumber:i}=to(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:$h(t)})}async queryRepos(e,t){return(await Promise.all(e.map(async o=>{try{return await this.queryRepoIssues(o,t)}catch(i){let s=i instanceof Error?i.message:String(i);throw new Error(`GitHub Issues query failed for repository '${o}': ${s}`)}}))).flat()}async queryRepoIssues(e,t){let{owner:r,name:o}=Ru(e),i=[],s=new URLSearchParams;s.set("per_page",String(Zr)),no(t.state)&&s.set("state",String(t.state)),no(t.labels)&&s.set("labels",String(t.labels)),no(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=ku&&i.length<eo;a++){s.set("page",String(a));let u=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues?${s.toString()}`),c=Array.isArray(u)?u:[];if(c.length===0)break;for(let p of c)if(!Qi(p)){if(i.length>=eo)break;i.push(zi(p,this.instanceId,`${r}/${o}`))}if(c.length<Zr)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[Th(e,r),"is:issue"];no(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=ku&&s.length<eo;a++){let u=new URLSearchParams({q:i,per_page:String(Zr),page:String(a)}),c=await this.request("GET",`/search/issues?${u.toString()}`),p=Array.isArray(c.items)?c.items:[];if(p.length===0)break;for(let m of p)if(!Qi(m)){if(s.length>=eo)break;s.push(zi(m,this.instanceId,Oh(m)))}if(p.length<Zr)break}return s}requireUsername(){if(!this.username)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing config.username`);return this.username}async testConnection(){try{let e=await this.request("GET","/user"),t=typeof e.login=="string"?e.login.trim():"",r=this.username;if(r&&t){let o=Yt(r,t);if(o)return o}return{success:!0}}catch(e){return ye(e)}}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing SecretStore '${this.secretKey}'. Store the token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`);return e}async request(e,t,r={}){let o=await this.requireToken(),i=`${Ph}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":_h};r.body!==void 0&&(s["Content-Type"]="application/json");let a=await this.fetchFn(i,{method:e,headers:s,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`GitHub ${e} ${t} failed (${a.status}): ${c||a.statusText}`)}if(a.status===204)return;let u=await a.text();if(u)return JSON.parse(u)}}});var Ct,y,h,B,Wn,P=l(()=>{"use strict";Ct=class extends Error{details;constructor(e,t){super(e),this.name=this.constructor.name,this.details=t}},y=class extends Ct{httpStatus=404},h=class extends Ct{httpStatus=400},B=class extends Ct{httpStatus=409},Wn=class extends Error{details;constructor(e,t){super(e),this.name="StepFailureError",this.details=t}}});function Nh(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(oo(n.project)&&e.push(`project = ${io(n.project)}`),oo(n.status)&&e.push(`status = ${io(n.status)}`),oo(n.assignee)&&e.push(`assignee = ${io(n.assignee)}`),oo(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${io(t)}`)}if(e.length===0)throw new h("Jira query requires jql or at least one of project, status, assignee, sprintId");return e.join(" AND ")}function oo(n){return n!=null&&n!==""}function io(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function Au(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=Un(o.description);return{id:r,source:t,title:String(o.summary??""),...i?{description:i}:{},status:String(o.status?.name??""),...o.assignee?.displayName?{assignee:String(o.assignee.displayName)}:{},url:`${e.replace(/\/$/,"")}/browse/${r}`,raw:n}}var Dh,Bh,Fh,ro,sn,Xi=l(()=>{"use strict";P();Ji();At();Dh="kno.jira.apiToken",Bh=50,Fh=10,ro=500,sn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Dh}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return Au(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=Nh(e),o=[],i,s=new Set;for(let a=0;a<Fh&&o.length<ro;a++){let u={jql:r,maxResults:Math.min(Bh,ro-o.length),fields:["summary","description","status","assignee"]};i&&(u.nextPageToken=i);let c=await this.request("POST","/rest/api/3/search/jql",{body:u}),p=Array.isArray(c.issues)?c.issues:[];for(let w of p){if(o.length>=ro)break;o.push(Au(w,t,this.instanceId))}let m=typeof c.nextPageToken=="string"?c.nextPageToken:void 0;if(c.isLast===!0||!m||p.length===0||m===i||s.has(m))break;s.add(m),i=m}return o}async getComments(e){let t=[],r=0,o=100,i=ro;for(;t.length<i;){let s=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/comment?startAt=${r}&maxResults=${o}`),a=Array.isArray(s.comments)?s.comments:[];for(let u of a)t.push({id:String(u.id??""),subjectId:e,body:Un(u.body),...u.author?.displayName?{author:u.author.displayName}:{},createdAt:u.created??"",raw:u});if(r+=a.length,a.length===0||typeof s.total=="number"&&r>=s.total||a.length<o)break}return t}async postComment(e,t){await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/comment`,{body:{body:Mr(t)}})}async updateStatus(e,t){let r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`),o=Array.isArray(r.transitions)?r.transitions:[],i=t.trim().toLowerCase(),s=o.find(a=>(a.to?.name??"").trim().toLowerCase()===i);if(!s?.id){let a=o.map(c=>c.to?.name).filter(c=>typeof c=="string"&&c.length>0),u=a.length>0?a.join(", "):"(none)";throw new Error(`No Jira transition to status '${t}' from the current state. Available: ${u}`)}await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`,{body:{transition:{id:s.id}}})}async testConnection(){try{let{email:e}=await this.requireConfig(),t=await this.request("GET","/rest/api/3/myself"),r=typeof t.emailAddress=="string"?t.emailAddress.trim():"";if(r){let o=Yt(e,r);if(o)return o}return{success:!0}}catch(e){return ye(e)}}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Jira instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=`${o.replace(/\/$/,"")}${t}`,u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Jira ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let p=await c.text();if(p)return JSON.parse(p)}}});import{randomUUID as Lh}from"node:crypto";function Jh(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var so,Cu=l(()=>{"use strict";so=class{tickets;comments;instanceId;constructor(e=[],t){this.tickets=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.tickets.get(e);if(!t)throw new Error(`Ticket not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.tickets.values()].filter(t=>Jh(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:Lh(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.tickets.get(e);if(!r)throw new Error(`Ticket not found: ${e}`);r.status=t}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Ve(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function ao(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function Uh(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var YI,W,an=l(()=>{"use strict";C();Ni();Li();Hr();vu();Yr();Eu();Yi();Xi();Cu();YI=Symbol("PROVIDER_REGISTRY");W=class n{tickets=new Map;repos=new Map;documentation=new Map;agents=new Map;instances=[];constructor(){}static fromSettings(e,t){let r=new n;return r.load(e,t),r}static fromMaps(e){let t=new n;for(let[r,o]of Object.entries(e.tickets??{}))t.tickets.set(r,o);for(let[r,o]of Object.entries(e.repos??{}))t.repos.set(r,o);for(let[r,o]of Object.entries(e.documentation??{}))t.documentation.set(r,o);for(let[r,o]of Object.entries(e.agents??{}))t.agents.set(r,o);return t.instances.push(...e.instances??[]),t}load(e,t){let r=new Set;for(let o of e){if(r.has(o.id))throw new Error(`Duplicate provider instance id '${o.id}'`);r.add(o.id),this.instances.push(o),this.instantiate(o,t)}}instantiate(e,t){if(Fe(e)){let o=Ve(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new Xt(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new Zt(t,{secretKey:e.secretKey,model:o}));return}if(!Rt(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=Uh(e.type);if(r!=="any"&&e.subjectType!==r)throw new Error(`Provider instance '${e.id}' type '${e.type}' cannot serve subjectType '${e.subjectType}'`);if(e.type==="jira"){this.tickets.set(e.id,new sn(t,{instanceId:e.id,baseUrl:Ve(e.config,"baseUrl"),email:Ve(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new on(t,{instanceId:e.id,username:Ve(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new rn(t,{instanceId:e.id,email:Ve(e.config,"email"),workspace:Ve(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new tn(t,{instanceId:e.id,baseUrl:Ve(e.config,"baseUrl"),email:Ve(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new so([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new Xr([],e.id));return}this.documentation.set(e.id,new Vr([],{instanceId:e.id,type:Ve(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw ao(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw ao(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw ao(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw ao(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>Rt(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function qu(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{repoSlugs:$u(n,e),role:"reviewer",state:"OPEN"};case"repo-open-prs":return{repoSlugs:$u(n,e),state:"OPEN"};default:throw new y(`Unknown Bitbucket query template: ${n}`)}}function $u(n,e){let t=lt(e.repoSlugs);if(t.length===0)throw new h(`Bitbucket template '${n}' requires params.repoSlugs`);if(t.length>10)throw new h(`Bitbucket template '${n}' params.repoSlugs accepts at most ${10} repositories, got ${t.length}`);return t}var Tu,Ou,Du=l(()=>{"use strict";P();Mn();Tu={name:"repoSlugs",label:"Repositories",type:"string[]",required:!0},Ou=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[Tu]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[Tu]}]});function Fu(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":return{repos:Mh(n,e),state:"open"};default:throw new y(`Unknown GitHub query template: ${n}`)}}function Mh(n,e){let t=lt(e.repos);if(t.length===0)throw new h(`GitHub template '${n}' requires params.repos`);if(t.length>10)throw new h(`GitHub template '${n}' params.repos accepts at most ${10} repositories, got ${t.length}`);return t}var Bu,Nu=l(()=>{"use strict";P();Mn();Bu=[{id:"my-open-issues",label:"My open issues",params:[]},{id:"created-by-me",label:"Issues I created",params:[]},{id:"repo-open-issues",label:"Open issues in a repository",params:[{name:"repos",label:"Repositories (owner/name)",type:"string[]",required:!0}]}]});function Wu(n,e){switch(n){case"my-open-tickets":return{jql:"assignee = currentUser() AND statusCategory != Done"};case"created-by-me":return{jql:"reporter = currentUser() AND statusCategory != Done"};case"project-open-tickets":return{jql:`project = ${Uu(Ju(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${Uu(Ju(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new y(`Unknown Jira query template: ${n}`)}}function Ju(n,e){let t=typeof e.project=="string"?e.project.trim():"";if(!t)throw new h(`Jira template '${n}' requires params.project`);return t}function Uu(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var Lu,Mu,Ku=l(()=>{"use strict";P();Lu={name:"project",label:"Project key",type:"string",required:!0},Mu=[{id:"my-open-tickets",label:"My open tickets",params:[]},{id:"created-by-me",label:"Tickets I created",params:[]},{id:"project-open-tickets",label:"Open tickets in a project",params:[Lu]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[Lu]}]});function Gu(n,e){switch(n){case"all-pages-in-space":return{spaceKey:Hu(n,e,"spaceKey")};case"pages-under-page":return{parentPageId:Hu(n,e,"parentPageId")};case"manual-list":return{pageIds:[]};default:throw new y(`Unknown Confluence query template: ${n}`)}}function Hu(n,e,t){let r=typeof e[t]=="string"?e[t].trim():"";if(!r)throw new h(`Confluence template '${n}' requires params.${t}`);return r}var Vu,Qu=l(()=>{"use strict";P();Vu=[{id:"all-pages-in-space",label:"All pages in a space",params:[{name:"spaceKey",label:"Space key",type:"string",required:!0}]},{id:"pages-under-page",label:"Pages under a page",params:[{name:"parentPageId",label:"Parent page ID",type:"string",required:!0}]},{id:"manual-list",label:"Manually curated list",params:[]}]});import{Inject as Yu,Injectable as Hh}from"@nestjs/common";function Vh(n){return n==null?!0:typeof n=="string"?n.trim()==="":Array.isArray(n)?n.every(e=>typeof e!="string"||e.trim()===""):!1}var Wh,Kh,zu,Xu,pt,Zi=l(()=>{"use strict";C();P();he();an();Du();Nu();Ku();Qu();Wh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Kh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},zu=function(n,e){return function(t,r){e(t,r,n)}},Xu={bitbucket:{list:()=>Ou,resolve:qu},github:{list:()=>Bu,resolve:Fu},jira:{list:()=>Mu,resolve:Wu},confluence:{list:()=>Vu,resolve:Gu}},pt=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?Xu[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?Xu[o]:void 0;if(!i)throw new y(`No query templates for provider instance '${e}'`);let s=i.list().find(a=>a.id===t);if(!s)throw new y(`Unknown query template '${t}' for provider instance '${e}'`);for(let a of s.params)if(a.required&&Vh(r[a.name]))throw new h(`Template '${t}' requires params.${a.name}`);return i.resolve(t,r)}async providerType(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);if(!(!r||!Rt(r)))return r.type}};pt=Wh([Hh(),zu(0,Yu(I)),zu(1,Yu(W)),Kh("design:paramtypes",[I,W])],pt)});import{Inject as el,Injectable as zh}from"@nestjs/common";var Gh,Qh,Zu,Yh,dt,es=l(()=>{"use strict";C();he();Hr();Yr();an();Gh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Qh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Zu=function(n,e){return function(t,r){e(t,r,n)}},Yh={bitbucket:()=>Vi,confluence:()=>Kr},dt=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);return!r||!Rt(r)?[]:Yh[r.type]?.()??[]}};dt=Gh([zh(),Zu(0,el(I)),Zu(1,el(W)),Qh("design:paramtypes",[I,W])],dt)});import{Inject as ns,Injectable as ey}from"@nestjs/common";var Xh,Zh,ts,cn,ft,co=l(()=>{"use strict";C();he();Ce();P();Lr();Xh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ts=function(n,e){return function(t,r){e(t,r,n)}},cn="PREVIEW_MODELS_FETCH",ft=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async preview(e){let t=e.apiKey?.trim();if(t)return this.lookup(e.type,t);let r=e.instanceId?.trim();if(!r)throw new h("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new y(`Provider instance not found: ${r}`);if(!Fe(o)||o.type!==e.type)throw new h(`Provider instance '${r}' is not a ${e.type} agent`);let i=await this.secrets.get(o.secretKey);if(!i)throw new h(`No API key stored for instance '${r}'. Enter a key to fetch models.`);return this.lookup(e.type,i)}async lookup(e,t){try{return await zt({type:e,apiKey:t,fetchFn:this.fetchFn})}catch(r){throw r instanceof Error&&r.name==="PreviewModelsAuthError"?new h(r.message):new h(r instanceof Error?r.message:"Failed to fetch available models")}}};ft=Xh([ey(),ts(0,ns(I)),ts(1,ns(oe)),ts(2,ns(cn)),Zh("design:paramtypes",[I,Function,Function])],ft)});import{Inject as os,Injectable as ry}from"@nestjs/common";function Tt(n,e){let t=n?.[e];return typeof t=="string"&&t.trim()?t.trim():void 0}var ty,ny,rs,is,ss,Se,uo=l(()=>{"use strict";C();he();Ce();P();co();Xi();Yi();Yr();Hr();Ni();Li();ty=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ny=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},rs=function(n,e){return function(t,r){e(t,r,n)}},is="kno.probe.apiToken",ss=class{value;constructor(e){this.value=e}async get(){return this.value}};Se=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async testDraft(e){let t=e.apiKey?.trim(),r=e.instanceId?.trim(),o=t,i=e.config??{};if(!o){if(!r)throw new h("Provide apiKey or instanceId to test the connection");let s=await this.requireInstance(r);if(s.type!==e.type)throw new h(`Provider instance '${r}' is not a ${e.type} provider`);let a=await this.secrets.get(s.secretKey);if(!a)throw new h(`No API key stored for instance '${r}'. Enter a key to test the connection.`);o=a,i={...s.config,...i}}return this.probe(e.type,i,o)}async testSaved(e){let t=await this.requireInstance(e);if(!tu(t.type))throw new h("Manual provider instances do not support connection tests");let r=await this.secrets.get(t.secretKey);return r?this.probe(t.type,t.config,r):{success:!1,message:`No API key stored for instance '${e}'.`}}async requireInstance(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new y(`Provider instance not found: ${e}`);return t}probe(e,t,r){let o=new ss(r);return this.createProvider(e,t,o).testConnection()}createProvider(e,t,r){let o={instanceId:"probe",secretKey:is};switch(e){case"jira":return new sn(r,{...o,baseUrl:Tt(t,"baseUrl"),email:Tt(t,"email")},this.fetchFn);case"bitbucket":return new rn(r,{...o,email:Tt(t,"email"),workspace:Tt(t,"workspace")},this.fetchFn);case"github":return new on(r,{...o,username:Tt(t,"username")},this.fetchFn);case"confluence":return new tn(r,{...o,baseUrl:Tt(t,"baseUrl"),email:Tt(t,"email")},this.fetchFn);case"claude":return new Xt(r,{secretKey:is,fetchFn:this.fetchFn});case"cursor":return new Zt(r,{secretKey:is,fetchFn:this.fetchFn})}}};Se=ty([ry(),rs(0,os(I)),rs(1,os(oe)),rs(2,os(cn)),ny("design:paramtypes",[I,Function,Function])],Se)});import{Module as iy}from"@nestjs/common";var oy,mt,lo=l(()=>{"use strict";oi();ya();ui();Ce();Nn();he();Fi();an();Zi();es();co();uo();oy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},mt=class{};mt=oy([iy({imports:[Vt,Ne],providers:[{provide:W,useFactory:async(n,e)=>{let t=await n.get();return W.fromSettings(t.providerInstances??[],e)},inject:[I,oe]},{provide:xn,useClass:rr},ut,pt,dt,{provide:cn,useValue:(n,e)=>fetch(n,e)},ft,Se],exports:[W,xn,ut,pt,dt,ft,Se,cn]})],mt)});import{Injectable as ay}from"@nestjs/common";var sy,xe,po=l(()=>{"use strict";sy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xe=class{listeners=new Set;emit(e){for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};xe=sy([ay()],xe)});import{Global as uy,Module as ly}from"@nestjs/common";var cy,ht,fo=l(()=>{"use strict";po();cy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ht=class{};ht=cy([uy(),ly({providers:[xe],exports:[xe]})],ht)});import{Injectable as dy}from"@nestjs/common";import{resolve as fy}from"node:path";var py,yt,as=l(()=>{"use strict";py=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},yt=class{tails=new Map;lockKey(e){let t=fy(e);return process.platform==="win32"?t.toLowerCase():t}async withLock(e,t){let r=this.lockKey(e),i=(this.tails.get(r)??Promise.resolve()).then(t);return this.tails.set(r,i.then(()=>{},()=>{})),i}};yt=py([dy()],yt)});import{Injectable as yy}from"@nestjs/common";import{execFile as gy}from"node:child_process";import{mkdirSync as cs,rmSync as wy}from"node:fs";import{dirname as by,join as ho,resolve as mo}from"node:path";import{promisify as Sy}from"node:util";function tl(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function nl(n){return ho(n,"worktrees")}function vy(n){let e=[],t;for(let r of n.split(/\r?\n/)){let o=r.trimEnd();if(o===""){t&&e.push(t),t=void 0;continue}if(o.startsWith("worktree ")){t&&e.push(t),t={path:o.slice(9)};continue}if(t&&o.startsWith("branch ")){let i=o.slice(7);t.branch=i.startsWith("refs/heads/")?i.slice(11):i}}return t&&e.push(t),e}var my,hy,xy,Ge,us=l(()=>{"use strict";as();my=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},hy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xy=Sy(gy),Ge=class{worktreesRoot;fetchLocks;constructor(e,t=new yt){this.worktreesRoot=e,this.fetchLocks=t,cs(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??ho(this.worktreesRoot,e);return cs(ho(r,".."),{recursive:!0}),await this.fetchOrigin(t.repoPath,t.repoPath),await this.git(t.repoPath,["worktree","add","-b",t.branchName,r,t.baseBranch]),{worktreePath:r,branch:t.branchName}}async addWorktreeForExistingBranch(e){cs(ho(e.worktreePath,".."),{recursive:!0}),await this.fetchOrigin(e.repoPath,e.repoPath,e.branch);let t=await this.existingBranchStartPoint(e.repoPath,e.branch);return t.kind==="local"?await this.git(e.repoPath,["worktree","add",e.worktreePath,e.branch]):await this.git(e.repoPath,["worktree","add","--track","-b",e.branch,e.worktreePath,t.ref]),{worktreePath:e.worktreePath,branch:e.branch}}async listWorktrees(e){let{stdout:t}=await this.git(e,["worktree","list","--porcelain"]);return vy(t)}async resetWorktreeToRemote(e,t){let r=mo(e);try{r=await this.mainRepoPath(e)}catch{}await this.fetchOrigin(e,r,t);let o=`origin/${t}`;try{await this.git(e,["rev-parse","--verify",o]),await this.git(e,["reset","--hard",o])}catch{await this.git(e,["reset","--hard",t])}await this.git(e,["clean","-fd"])}async removeWorktree(e){let t=mo(e);try{let r=await this.mainRepoPath(t);await this.git(r,["worktree","remove","--force",t])}catch{wy(t,{recursive:!0,force:!0})}}async fetchOrigin(e,t,r){await this.fetchLocks.withLock(t,async()=>{try{let o=r?["fetch","origin",r]:["fetch","origin"];await this.git(e,o)}catch{}})}async mainRepoPath(e){let t=mo(e),{stdout:r}=await this.git(t,["rev-parse","--git-common-dir"]),o=mo(t,r.trim());return o.endsWith(".git")?by(o):o}async existingBranchStartPoint(e,t){try{return await this.git(e,["rev-parse","--verify",`refs/heads/${t}`]),{kind:"local"}}catch{let r=`origin/${t}`;return await this.git(e,["rev-parse","--verify",r]),{kind:"remote",ref:r}}}async checkout(e,t){await this.git(e,["checkout",t.branch])}async createBranch(e,t){t.baseBranch?await this.git(e,["checkout","-b",t.branchName,t.baseBranch]):await this.git(e,["checkout","-b",t.branchName])}async commit(e,t){return t.addAll!==!1&&await this.git(e,["add","-A"]),await this.git(e,["commit","-m",t.message]),{sha:(await this.git(e,["rev-parse","HEAD"])).stdout.trim()}}async push(e,t={}){let r=t.remote??"origin";t.branch?await this.git(e,["push",r,t.branch]):await this.git(e,["push",r,"HEAD"])}async git(e,t){try{let r=await xy("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=tl(o.stderr),s=tl(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Ge=my([yy(),hy("design:paramtypes",[String,yt])],Ge)});import{Module as Iy}from"@nestjs/common";import{mkdirSync as _y}from"node:fs";var jy,rl,yo,ol=l(()=>{"use strict";or();us();as();jy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},rl=jn();_y(rl,{recursive:!0});yo=class{};yo=jy([Iy({providers:[yt,{provide:Ge,useFactory:n=>new Ge(nl(rl),n),inject:[yt]}],exports:[Ge]})],yo)});function ln(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=Hn(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function il(n){let e=n.trim();return(e.match(/^\{\{\s*([^}]+?)\s*\}\}$/)?.[1]??e).trim()}function Hn(n,e){let t=e.split(".").filter(Boolean),r=n;for(let o of t){if(r==null||typeof r!="object")return;r=r[o]}return r}function un(n,e){return typeof n=="string"?ln(n,e):Array.isArray(n)?n.map(t=>un(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,un(r,e)])):n}var ls=l(()=>{"use strict"});function al(n){let e=n.path?.trim()||void 0,t=n.pattern?.trim()||void 0,r=n.source,o=n.source;if(e){if(n.source.trim()==="")return{kind:"no_match",sourceValue:n.source};let i;try{i=JSON.parse(n.source)}catch(a){let u=a instanceof Error?a.message:String(a);throw new Error(`Extract source is not valid JSON (required when path is set): ${u}`)}let s=Py(i,e);if(r=s??i,s==null)return{kind:"no_match",sourceValue:r};o=s}if(t){let i=sl(o),s;try{s=new RegExp(t)}catch(c){let p=c instanceof Error?c.message:String(c);throw new Error(`Invalid extract pattern: ${p}`)}let a=i.match(s);return a?{kind:"match",value:a[1]!==void 0?a[1]:a[0],sourceValue:r}:{kind:"no_match",sourceValue:r}}return{kind:"match",value:sl(o),sourceValue:r}}function Py(n,e){if(!(n==null||typeof n!="object"))return Hn(n,e)}function sl(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):n==null?"":JSON.stringify(n)}var cl=l(()=>{"use strict";ls()});function gt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=gt(r.stepExecutions,e);if(o)return o}}}function $t(n,e,t,r){for(let o=0;o<n.length;o++){let i=n[o];if(i.id===e)return{execution:i,siblings:n,index:o,parentLoopExecutionId:t,iterationIndex:r};if(i.iterations)for(let s of i.iterations){let a=$t(s.stepExecutions,e,i.id,s.index);if(a)return a}}}function K(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:K(o.stepExecutions,e,t)}))}:r)}function go(n,e,t,r){return t==null?[...n,e]:n.map(o=>{if(o.id===t){let i=[...o.iterations??[]],s=i.find(a=>a.index===r);if(s){let a={...s,stepExecutions:[...s.stepExecutions,e]},u=i.findIndex(c=>c.index===r);i[u]=a}else{let a={index:r,stepExecutions:[e],startedAt:e.startedAt??new Date().toISOString()};i.push(a),i.sort((u,c)=>u.index-c.index)}return{...o,iterations:i}}return o.iterations?{...o,iterations:o.iterations.map(i=>({...i,stepExecutions:go(i.stepExecutions,e,t,r)}))}:o})}function Ot(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Ot(t.steps,e);if(r)return r}}}function ul(n,e,t){return K(n,e,r=>{let o=(r.iterations??[]).map(i=>{if(i.index!==t)return i;let s=i.stepExecutions.every(a=>a.completedAt)?i.stepExecutions.map(a=>a.completedAt).reduce((a,u)=>a>u?a:u):void 0;return{...i,...s?{completedAt:s}:{}}});return{...r,iterations:o}})}function ps(n){let e=[];for(let t of n){t.childJobIds&&e.push(...t.childJobIds);for(let r of t.iterations??[])e.push(...ps(r.stepExecutions))}return e}var ll=l(()=>{"use strict"});import{z as X}from"zod";function pl(n,e){let t=Cy[n].safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.length?o.path.join("."):"(root)"}: ${o.message}`).join("; ");throw new Error(`Agent output failed validation for format '${n}': ${r}`)}return t.data}var Ey,ky,Ry,Ay,Cy,dl=l(()=>{"use strict";Ey=X.object({questions:X.array(X.object({id:X.string(),prompt:X.string()}))}),ky=X.object({approved:X.boolean()}),Ry=X.object({suggestions:X.array(X.object({id:X.string().min(1),file:X.string().min(1),line:X.number().int(),body:X.string()}))}),Ay=X.string(),Cy={questionnaire:Ey,confirmation:ky,comment_suggestions:Ry,free_text:Ay}});function ve(n){return n==="completed"||n==="failed"||n==="cancelled"}function ds(n,e){let t=new Map;for(let o of n){let i=e(o);if(i==null)continue;let s=t.get(i)??[];s.push(o),t.set(i,s)}if(t.size===0)return null;let r=[];for(let o of t.values()){let i=new Set(o.map(a=>a.retryOf).filter(a=>a!=null)),s=o.find(a=>!i.has(a.id));if(!s)return null;r.push(s)}return{activeJobs:r,allTerminal:r.every(o=>ve(o.status)),groupCount:t.size}}function fl(n){let e=n.every(r=>r.status==="completed"),t=n.every(r=>r.status==="failed"||r.status==="cancelled");return e?"completed":t?"failed":"completed_with_issues"}var fs=l(()=>{"use strict"});async function wo(n,e,t){let r=await e.get(n);if(!r)throw new y(`SubjectView not found: ${n}`);if(!r.providerInstanceId)throw new h(`SubjectView '${n}' has no providerInstanceId \u2014 reconfigure the View to pick a provider instance`);if(r.subjectType==="ticket")return(await t.getTicketProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"ticket",...i}));if(r.subjectType==="pull_request")return(await t.getRepoProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"pull_request",...i}));if(r.subjectType==="documentation")return(await t.getDocumentationProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"documentation",...i}));throw new h(`Unsupported subjectType on view: ${r.subjectType}`)}var ms=l(()=>{"use strict";P()});import{Injectable as $y}from"@nestjs/common";var Ty,qt,hs=l(()=>{"use strict";Ty=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},qt=class{requested=new Set;requestCancellation(e){this.requested.add(e)}isCancellationRequested(e){return this.requested.has(e)}clear(e){this.requested.delete(e)}};qt=Ty([$y()],qt)});import{Inject as By,Injectable as Fy}from"@nestjs/common";var Oy,qy,Dy,je,bo=l(()=>{"use strict";C();he();Oy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},qy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Dy=function(n,e){return function(t,r){e(t,r,n)}},je=class{settings;running=new Map;queues=new Map;admitTails=new Map;constructor(e){this.settings=e}async acquire(e,t,r){let o={jobId:t,stepExecutionId:r,agentInstanceId:e,enqueuedAt:new Date().toISOString()},i=null;await this.serialized(e,async()=>{await this.drainQueue(e),!await this.tryAdmit(e)&&(i=new Promise((s,a)=>{let u=this.queues.get(e)??[];u.push({entry:o,resolve:s,reject:a}),this.queues.set(e,u)}))}),i&&await i}release(e){let t=this.running.get(e)??0;t<=1?this.running.delete(e):this.running.set(e,t-1),this.serialized(e,()=>this.drainQueue(e))}listQueued(){let e=[];for(let t of this.queues.values())for(let r of t)e.push(r.entry);return e.sort((t,r)=>t.enqueuedAt.localeCompare(r.enqueuedAt))}dropQueued(e){for(let[t,r]of this.queues){let o=[];for(let i of r)i.entry.jobId===e?i.reject(new Error(`Job ${e} cancelled while queued for an agent slot`)):o.push(i);o.length===0?this.queues.delete(t):this.queues.set(t,o)}}runningCount(e){return this.running.get(e)??0}async serialized(e,t){let o=(this.admitTails.get(e)??Promise.resolve()).then(t,t);this.admitTails.set(e,o.then(()=>{},()=>{})),await o}async drainQueue(e){let t=await this.limit(e);for(;;){let r=this.queues.get(e);if(!r||r.length===0||!this.hasCapacity(e,t))return;let o=r.shift();r.length===0&&this.queues.delete(e),this.addRunning(e),o.resolve()}}async tryAdmit(e){let t=await this.limit(e);return this.hasCapacity(e,t)?(this.addRunning(e),!0):!1}hasCapacity(e,t){return(this.running.get(e)??0)<t}addRunning(e){this.running.set(e,(this.running.get(e)??0)+1)}async limit(e){let r=((await this.settings.get()).providerInstances??[]).find(o=>o.id===e);return!r||!Fe(r)?Fn:ru(r)}};je=Oy([Fy(),Dy(0,By(I)),qy("design:paramtypes",[Object])],je)});import{Logger as Ny}from"@nestjs/common";import{readFile as Ly}from"node:fs/promises";async function ml(n,e,t=new Ny("resolveContextFiles"),r=o=>Ly(o,"utf8")){let o=[];for(let i of n){let s=await e.get(i);if(!s){t.warn(`Context file '${i}' is no longer in the catalog; skipping`);continue}try{let a=await r(s.path);o.push({tier:s.tier,content:a,sourceRef:s.path})}catch(a){let u=a instanceof Error?a.message:String(a);throw new Error(`Cannot read context file '${s.name}' at ${s.path}: ${u}`)}}return o}var hl=l(()=>{"use strict"});import{basename as Jy,dirname as Uy,join as My,resolve as Vn,sep as yl}from"node:path";function Wy(n){return n.replace(/-/g,"").slice(0,4)}function gl(n,e){return`${n}-${Wy(e)}`}function ys(n){return n.replace(/[\\/:*?"<>|]/g,"-")}function So(n){let e=Vn(n);return My(Uy(e),`${Jy(e)}-worktrees`)}function xo(n,e){let t=Vn(n),r=Vn(e);if(wt(t,r))return!0;let o=t.endsWith(yl)?t:t+yl,i=process.platform==="win32"?r.toLowerCase():r,s=process.platform==="win32"?o.toLowerCase():o;return i.startsWith(s)}function wt(n,e){let t=Vn(n),r=Vn(e);return process.platform==="win32"?t.toLowerCase()===r.toLowerCase():t===r}var gs=l(()=>{"use strict"});import{join as wl}from"node:path";async function bl(n,e,t){let r={...e},o=await t.list();for(let i of n){if(i.type!=="localRepository")continue;let s=r[i.name];if(s==null||s==="")continue;let a=String(s),u=o.find(m=>m.id===a),c=o.find(m=>wt(m.localPath,a)),p=u??c;if(!p)throw new h(`Unknown local repository: ${a}`);r[i.name]=p.localPath}return r}async function Sl(n){let{job:e,params:t,git:r,jobs:o,localRepositories:i}=n,s=vo(t,"repoPath"),a=t.mode==="existing-branch"?"existing-branch":"new-branch",u=(await i.list()).find(x=>wt(x.localPath,s)),c=u?.worktreeBasePath?.trim()?u.worktreeBasePath.trim():So(s);if(xo(s,c)&&!wt(s,c))throw new Error(`Worktree base '${c}' must not be inside the repository at '${s}'`);if(a==="existing-branch")return Ky({job:e,repoPath:s,branch:vo(t,"branch"),worktreeBase:c,explicitPath:typeof t.worktreePath=="string"?t.worktreePath:void 0,git:r,jobs:o});let p=vo(t,"branchName"),m=gl(p,e.id),w=typeof t.worktreePath=="string"&&t.worktreePath.trim()!==""?t.worktreePath:wl(c,ys(m));return r.createWorktree(e.id,{repoPath:s,baseBranch:vo(t,"baseBranch"),branchName:m,worktreePath:w})}async function Ky(n){let{job:e,repoPath:t,branch:r,worktreeBase:o,git:i,jobs:s}=n,a=await i.listWorktrees(t),u=a.filter(w=>w.branch===r&&!wt(w.path,t)),c=a.find(w=>w.branch===r&&wt(w.path,t));if(u.length===0){if(c)throw new Error(`branch ${r} is checked out in the repository working copy; refusing to reuse the main clone`);let w=n.explicitPath&&n.explicitPath.trim()!==""?n.explicitPath:wl(o,ys(r));return i.addWorktreeForExistingBranch({repoPath:t,branch:r,worktreePath:w})}let p=u[0].path,m=await Hy(s,p);if(m&&!ve(m.status))throw new Error(`branch ${r} already has an active worktree in use by Job ${m.id}`);return m&&m.id!==e.id&&await s.update(m.id,{worktreeDeletedAt:new Date().toISOString()}),await i.resetWorktreeToRemote(p,r),{worktreePath:p,branch:r}}async function Hy(n,e){let r=(await n.list({liveWorktree:!0})).filter(o=>o.worktreePath!=null&&wt(o.worktreePath,e));return r.find(o=>!ve(o.status))??r.sort((o,i)=>i.updatedAt.localeCompare(o.updatedAt))[0]}function vo(n,e){let t=n[e];if(typeof t!="string"||t.trim()==="")throw new Error(`git step missing required param '${e}'`);return t}var xl=l(()=>{"use strict";P();gs();fs()});import{Inject as ae,Injectable as Qy,Logger as zy}from"@nestjs/common";import{randomUUID as jo}from"node:crypto";import{exec as Yy}from"node:child_process";import{promisify as Xy}from"node:util";async function ws(n,e,t){if(n.length===0)throw new Error(t);let r;for(let o of n)try{return await e(o)}catch(i){r=i}throw r instanceof Error?r:new Error(t)}function tg(n,e){let t=o=>{let i=[];for(let s of o)i.push(s),s.type==="loop"&&i.push(...t(s.steps));return i},r=o=>{let i=o.findIndex(s=>s.id===e);if(i>=0){for(let s=i-1;s>=0;s--)if(o[s].type==="agent")return o[s].id;return}for(let s of o)if(s.type==="loop"){let a=r(s.steps);if(a!==void 0||s.steps.some(u=>u.id===e))return a}};return r(n.steps)}function bt(n){let e={...n.context};return n.subjectContext?.mode==="single"&&(e.subject=n.subjectContext.subject),n.worktreePath&&(e.worktreePath=n.worktreePath),n.branch&&(e.branch=n.branch),e}function ng(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new Error("Extract resume payload must be an object with an action");let e=n;if(e.action==="provide_value"){if(typeof e.value!="string")throw new Error("Extract resume action 'provide_value' requires a string value");return{action:"provide_value",value:e.value}}if(e.action==="continue"||e.action==="cancel")return{action:e.action};throw new Error(`Unknown extract resume action: ${String(e.action)}`)}function Io(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function Dt(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function rg(n){if(n.subjectContext?.mode==="collection")return n.subjectContext.subjects;if(!n.subjectContext&&n.workflowSnapshot?.subjectHandling==="collection")return[];throw new h(`sub_workflow forEach 'selection' requires subjectContext.mode === 'collection' (job ${n.id})`)}function og(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?"array":typeof n}function ig(n){if(n==="none")throw new Error("normalizeAppliesTo called with none");if(Array.isArray(n)){if(n.length!==1)throw new Error(`Workflow Runner requires appliesTo to be a single SubjectType (got ${JSON.stringify(n)})`);return n[0]}return n}function vl(n,e){for(let t of n)if(t.required&&(e[t.name]===void 0||e[t.name]===null))throw new h(`Missing required input: ${t.name}`)}var Vy,Gy,se,bs,Zy,eg,Ie,_o=l(()=>{"use strict";C();Pt();On();lr();ur();po();us();he();pr();dr();an();oi();Ur();P();ls();cl();ll();dl();fs();ms();hs();bo();hl();xl();Vy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Gy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},se=function(n,e){return function(t,r){e(t,r,n)}},Zy=Xy(Yy),eg=new Set(["agent","shell","git","provider_action"]),Ie=bs=class{workflows;jobs;batches;views;events;providers;notifications;contextFiles;localRepositories;git;settings;cancellation;agentGate;logger=new zy(bs.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,p,m,w,x){this.workflows=e,this.jobs=t,this.batches=r,this.views=o,this.events=i,this.providers=s,this.notifications=a,this.contextFiles=u,this.localRepositories=c,this.git=p,this.settings=m,this.cancellation=w,this.agentGate=x,this.events.subscribe(R=>{let _=R;(_.type==="job_completed"||_.type==="job_failed"||_.type==="job_cancelled")&&this.onChildTerminal(_.jobId)})}async start(e){let t=await this.createJob(e);return this.emit({type:"job_started",jobId:t.id,timestamp:new Date().toISOString()}),this.runJob(t.id)}async launch(e){let t=await this.requireWorkflow(e.workflowId);if(t.subjectHandling!=="per-subject"&&t.subjectHandling!=="collection")throw new h(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);vl(t.inputSchema,e.inputValues);let r=await this.resolveSelection(e.selection);if(t.subjectHandling==="collection"){let a=await this.createJob({workflowId:t.id,subjectContext:{mode:"collection",subjects:r},selection:e.selection,inputValues:e.inputValues});return this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),this.runJob(a.id)}let o=new Date().toISOString(),i=await this.batches.create({id:jo(),workflowId:t.id,selection:e.selection,resolvedSubjects:r,status:"running",triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},notificationSent:!1,createdAt:o}),s=[];for(let a=0;a<r.length;a++){let u=r[a],c=await this.createJob({workflowId:t.id,subjectContext:{mode:"single",subject:u},selection:e.selection,batchId:i.id,fanOutIndex:a,inputValues:e.inputValues});s.push(c)}for(let a of s)this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),await this.runJob(a.id);return await this.batches.get(i.id)}async createJob(e){let t=e.workflowSnapshot?structuredClone(e.workflowSnapshot):await this.workflows.get(e.workflowId);if(!t)throw new y(`Workflow not found: ${e.workflowId}`);if(!e.subjectContext&&t.subjectHandling!=="per-subject")throw new h(`Workflow Runner only supports subjectHandling 'per-subject' at start() without an explicit subjectContext (got '${t.subjectHandling}')`);let r=await bl(t.inputSchema,e.inputValues,this.localRepositories);vl(t.inputSchema,r);let o=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),i=new Date().toISOString();return this.jobs.create({id:jo(),workflowId:t.id,status:"pending",...o?{subjectContext:o}:{},...e.selection?{selection:e.selection}:{},...e.batchId?{batchId:e.batchId}:{},...e.parentJobId?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf?{retryOf:e.retryOf}:{},workflowSnapshot:structuredClone(t),context:{...r},stepHistory:[],createdAt:i,updatedAt:i})}async deleteWorktrees(e){if(e.length===0)throw new h("jobIds is required");let t=[];for(let s of e){let a=await this.jobs.get(s);if(!a)throw new y(`Job not found: ${s}`);t.push(a)}let r=t.find(s=>!ve(s.status));if(r)throw new B(`Cannot delete worktree for active Job ${r.id}`);let o=new Date().toISOString(),i=[];for(let s of t){s.worktreePath&&!s.worktreeDeletedAt&&await this.git.removeWorktree(s.worktreePath);let a=await this.jobs.update(s.id,{worktreeDeletedAt:o,updatedAt:o});i.push(a)}return i}async runJob(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);if(ve(t.status))return t;let r=await this.workflowForJob(t);if(t.status==="pending"&&(t=await this.persistJob({...t,status:"planning",updatedAt:new Date().toISOString()}),t.status==="cancelled"))return t;let o=await this.executeStepSequence(t,r,r.steps,void 0,void 0,0);return o.outcome!=="completed"?o.job:this.completeJob(o.job,r)}async resume(e,t){let r=await this.jobs.get(e);if(!r)throw new y(`Job not found: ${e}`);if(r.status!=="waiting_for_human")throw new B(`Job ${e} is not waiting for human input (status: ${r.status})`);let o=await this.workflowForJob(r),i=r.currentStepExecutionId;if(!i)throw new Error(`Job ${e} is waiting_for_human but has no currentStepExecutionId`);let s=gt(r.stepHistory,i);if(!s)throw new Error(`Paused execution ${i} not found on job ${e}`);if(s.type==="loop")return this.resumeAskHuman(r,o,s,t);if(s.type==="extract")return this.resumeExtract(r,o,s,t);if(s.type!=="interaction")throw new Error(`Paused execution ${i} has type '${s.type}'; expected interaction, extract, or loop`);let a=Ot(o.steps,s.stepDefinitionId),u=t;if(a?.type==="interaction"&&a.interaction==="comment_review"){let $=Ac(t);if(!$)throw new h(`comment_review step '${a.id}' resume requires { finalComments: { file, line, body }[] }`);u=$}let c=new Date().toISOString(),p=K(r.stepHistory,i,$=>({...$,status:"completed",completedAt:c,output:u})),m=u!==null&&typeof u=="object"&&!Array.isArray(u)?u:{response:u};r=await this.persistJob({...r,status:"planning",context:{...r.context,[s.stepDefinitionId]:u},stepHistory:p,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c}),this.emit({type:"human_answered",jobId:r.id,answers:m,timestamp:c});let w=$t(r.stepHistory,i);if(!w)throw new Error(`Could not locate frame for execution ${i}`);let x=this.sequenceForFrameOnJob(r,o,w),R=w.index+1,_=await this.executeStepSequence(r,o,x,w.parentLoopExecutionId,w.iterationIndex,R);return _.outcome!=="completed"?_.job:w.parentLoopExecutionId!=null&&w.iterationIndex!=null?this.continueLoopAfterBody(_.job,o,w.parentLoopExecutionId,w.iterationIndex):this.completeJob(_.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);if(t.status!=="failed")throw new B(`Job ${e} is not failed (status: ${t.status})`);let r=t.parentJobId!=null&&t.parentStepExecutionId!=null&&t.fanOutIndex!=null,o=t.batchId!=null&&t.fanOutIndex!=null;if(r){let a=await this.jobs.get(t.parentJobId);if(!a)throw new y(`Parent job not found: ${t.parentJobId}`);let u=await this.workflowForJob(t),c=t.subjectContext?{}:this.inputValuesFromContext(t.context,u),p=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,inputValues:c,parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId,fanOutIndex:t.fanOutIndex,retryOf:t.id,workflowSnapshot:t.workflowSnapshot}),m=K(a.stepHistory,t.parentStepExecutionId,w=>({...w,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...w.childJobIds??[],p.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:m,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emitRetryLaunch(p.id,t.id),this.runJob(p.id),p}if(o){let a=await this.batches.get(t.batchId);if(!a)throw new y(`JobBatch not found: ${t.batchId}`);a.status!=="running"&&await this.batches.update(a.id,{status:"running",completedAt:null,notificationSent:!1});let u=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,selection:t.selection,batchId:t.batchId,fanOutIndex:t.fanOutIndex,inputValues:{},retryOf:t.id,workflowSnapshot:t.workflowSnapshot});return this.emitRetryLaunch(u.id,t.id),this.runJob(u.id),u}let i=await this.workflowForJob(t),s=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,selection:t.selection,inputValues:this.inputValuesFromContext(t.context,i),retryOf:t.id,workflowSnapshot:t.workflowSnapshot});return this.emitRetryLaunch(s.id,t.id),this.runJob(s.id),s}async retryFailedStep(e,t){let r=await this.jobs.get(e);if(!r)throw new y(`Job not found: ${e}`);if(r.status!=="failed")throw new B(`Job ${e} is not failed (status: ${r.status})`);let o=r.currentStepExecutionId;if(!o)throw new B(`Job ${e} has no currentStepExecutionId; cannot retry the failed step`);let i=gt(r.stepHistory,o);if(!i)throw new B(`Job ${e} currentStepExecutionId ${o} was not found in stepHistory`);if(i.type==="sub_workflow")throw new B("Step-level retry is not available for sub_workflow steps. Retry the specific failed child job instead.");if(!eg.has(i.type))throw new B(`Step-level retry is not available for '${i.type}' steps`);let s=await this.workflowForJob(r),a=$t(r.stepHistory,o);if(!a)throw new B(`Could not locate execution frame for ${o} on job ${e}`);let u=this.sequenceForFrameOnJob(r,s,a),c=u[a.index];if(!c||c.id!==i.stepDefinitionId)throw new B(`Failed step '${i.stepDefinitionId}' does not match sequence position ${a.index}`);if(Nc(c,i)&&(!t||!Object.prototype.hasOwnProperty.call(t,"comments")))throw new B(`Step '${c.id}' had a partial positioned-comment failure; retry with overrideParams.comments instead of a plain step retry`);let p=new Date().toISOString(),m={...r.context};delete m[i.stepDefinitionId];let w=await this.persistJob({...r,status:"planning",context:m,completedAt:void 0,currentStepId:i.stepDefinitionId,currentStepExecutionId:i.id,stepHistory:K(r.stepHistory,i.id,R=>({...R,status:"running",error:void 0,failureDetails:void 0,completedAt:void 0,output:void 0,startedAt:p})),updatedAt:p}),x=await this.executeStepSequence(w,s,u,a.parentLoopExecutionId,a.iterationIndex,a.index,i.id,t);return x.outcome!=="completed"?x.job:a.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(x.job,s,a.parentLoopExecutionId,a.iterationIndex):this.completeJob(x.job,s)}async cancelJob(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);if(ve(t.status))throw new B(`Job ${e} is already terminal (status: ${t.status})`);for(let i of ps(t.stepHistory)){let s=await this.jobs.get(i);s&&!ve(s.status)&&await this.cancelJob(i)}let r=await this.jobs.get(e);if(ve(r.status))return r;this.cancellation.requestCancellation(e),this.agentGate.dropQueued(e);let o=await this.persistCancelled(r);return(r.status==="waiting_for_human"||r.status==="waiting_for_children")&&this.cancellation.clear(e),await this.onBatchMemberTerminal(o.id),o}async cancelBatch(e){let t=await this.batches.get(e);if(!t)throw new y(`JobBatch not found: ${e}`);if(t.status!=="running")throw new B(`JobBatch ${e} is already terminal (status: ${t.status})`);let r=await this.jobs.list({batchId:e});for(let s of r)ve(s.status)||await this.cancelJob(s.id);let o=new Date().toISOString(),i=await this.batches.update(e,{status:"cancelled",completedAt:o});if(!i)throw new Error(`Failed to persist cancelled batch ${e}`);return this.emit({type:"batch_cancelled",batchId:i.id,timestamp:o}),i}async executeStepSequence(e,t,r,o,i,s,a,u){let c=e;for(let p=s;p<r.length;p++){let m=await this.stopIfCancelled(c);if(m)return{outcome:"cancelled",job:m};let w=r[p],x=new Date().toISOString(),R=p===s?a:void 0;if(w.condition&&Sr(w.condition,c.context)){if(c=await this.recordSkippedStep(c,w,R,o,i),c.status==="cancelled")return{outcome:"cancelled",job:c};continue}let _,$=c.stepHistory;if(R){let Ae=gt(c.stepHistory,R);if(!Ae)throw new Error(`Reuse execution ${R} not found on job ${c.id}`);_=Ae}else _={id:jo(),stepDefinitionId:w.id,type:w.type,status:"running",startedAt:x},$=go(c.stepHistory,_,o,i);if(c=await this.persistJob({...c,status:c.status==="pending"?"planning":c.status,currentStepId:w.id,currentStepExecutionId:_.id,stepHistory:$,updatedAt:x}),c.status==="cancelled")return{outcome:"cancelled",job:c};this.emit({type:"step_started",jobId:c.id,stepDefinitionId:w.id,timestamp:x});try{let Ae=await this.dispatchStep(c,t,w,_.id,o,i,R?u:void 0);c=Ae.job;let Kt=await this.stopIfCancelled(c);if(Kt)return{outcome:"cancelled",job:Kt};if(Ae.outcome!=="completed")return Ae}catch(Ae){let Kt=await this.failJob(c,t,_.id,w.id,Ae);return Kt.status==="cancelled"?{outcome:"cancelled",job:Kt}:{outcome:"failed",job:Kt}}}return o!=null&&i!=null&&(c=await this.persistJob({...c,stepHistory:ul(c.stepHistory,o,i),updatedAt:new Date().toISOString()})),{outcome:"completed",job:c}}async dispatchStep(e,t,r,o,i,s,a){switch(r.type){case"agent":return{outcome:"completed",job:await this.executeAgentStep(e,r,o)};case"interaction":return{outcome:"paused",job:await this.pauseForInteraction(e,t,r,o)};case"git":return{outcome:"completed",job:await this.executeGitStep(e,r,o)};case"provider_action":return{outcome:"completed",job:await this.executeProviderActionStep(e,r,o,a)};case"shell":return{outcome:"completed",job:await this.executeShellStep(e,r,o)};case"loop":return this.runLoopStep(e,t,r,o,i,s);case"sub_workflow":return this.runSubWorkflowStep(e,r,o);case"extract":return this.executeExtractStep(e,t,r,o);default:{let u=r;throw new h(`Step type '${u.type}' not yet supported by the Workflow Runner`)}}}async runLoopStep(e,t,r,o,i,s,a=0,u=r.maxIterations){let c=e,p=a;for(;;){if(p>=u)switch(r.onMaxIterations.action){case"fail":return c=await this.failExecution(c,t,o,r.id,`Loop '${r.id}' exceeded maxIterations (${u})`),{outcome:"failed",job:c};case"continue":return c=await this.finishExecution(c,o,r.id,{iterations:p,exitedOnMaxIterations:!0}),{outcome:"completed",job:c};case"ask_human":{let w={maxIterationsCheckpoint:!0,nextIteration:p,effectiveMaxIterations:u},x=new Date().toISOString(),R=K(c.stepHistory,o,_=>({..._,status:"pending",output:w}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:R,updatedAt:x}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:w,questions:[`Loop '${r.id}' reached maxIterations (${u}). Extend, continue, or cancel?`],timestamp:x}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} hit max iterations on loop '${r.id}'`,jobId:c.id}),{outcome:"paused",job:c}}default:{let w=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(w)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,p,0);if(c=m.job,m.outcome!=="completed")return m;if(Sr(r.until,c.context))return c=await this.finishExecution(c,o,r.id,{iterations:p+1}),{outcome:"completed",job:c};p+=1}}async resumeAskHuman(e,t,r,o){let i=o,s=r.output;if(!s?.maxIterationsCheckpoint)throw new Error(`Loop execution ${r.id} is not at an ask_human checkpoint`);let a=Ot(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=$t(e.stepHistory,r.id),c=new Date().toISOString();if(i.action==="cancel")return await this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c},t,r.id,a.id,"Loop cancelled by human at maxIterations checkpoint");if(i.action==="continue"){let R=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:K(e.stepHistory,r.id,_=>({..._,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:R.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:R.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(R,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(R,t,a.id)}let p=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+p,w=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:K(e.stepHistory,r.id,R=>({...R,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:w.id,answers:i,timestamp:c});let x=await this.runLoopStep(w,t,a,r.id,u?.parentLoopExecutionId,u?.iterationIndex,s.nextIteration,m);return x.outcome!=="completed"?x.job:u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(x.job,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(x.job,t,a.id)}async resumeExtract(e,t,r,o){let i=ng(o),s=Ot(t.steps,r.stepDefinitionId);if(!s||s.type!=="extract")throw new Error(`Extract step definition '${r.stepDefinitionId}' not found`);let a=new Date().toISOString();if(i.action==="cancel")return this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a},t,r.id,s.id,`Extract '${s.id}' cancelled by human`);let u=i.action==="continue"?"":i.value,c=await this.finishExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a},r.id,s.id,u);this.emit({type:"human_answered",jobId:c.id,answers:i,timestamp:a});let p=$t(e.stepHistory,r.id);if(!p)throw new Error(`Could not locate frame for execution ${r.id}`);let m=this.sequenceForFrameOnJob(c,t,p),w=p.index+1,x=await this.executeStepSequence(c,t,m,p.parentLoopExecutionId,p.iterationIndex,w);return x.outcome!=="completed"?x.job:p.parentLoopExecutionId!=null&&p.iterationIndex!=null?this.continueLoopAfterBody(x.job,t,p.parentLoopExecutionId,p.iterationIndex):this.completeJob(x.job,t)}async continueLoopAfterBody(e,t,r,o){let i=gt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Ot(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=$t(e.stepHistory,r),u=i.output?.effectiveMaxIterations??s.maxIterations,c=e;if(Sr(s.until,c.context))c=await this.finishExecution(c,r,s.id,{iterations:o+1});else{let p=o+1,m=await this.runLoopStep(c,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,p,u);if(m.outcome!=="completed")return m.job;c=m.job}return a?.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(c,t,a.parentLoopExecutionId,a.iterationIndex):this.continueTopLevelAfter(c,t,s.id)}async continueTopLevelAfter(e,t,r){let o=t.steps.findIndex(s=>s.id===r),i=await this.executeStepSequence(e,t,t.steps,void 0,void 0,o+1);return i.outcome!=="completed"?i.job:this.completeJob(i.job,t)}sequenceForFrameOnJob(e,t,r){if(r.parentLoopExecutionId==null)return t.steps;let o=gt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Ot(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){let o=t.forEach==="selection"?await this.spawnSelectionChildren(e,t,r):await this.spawnSourceChildren(e,t,r);if(o.length===0)return{outcome:"completed",job:await this.finishExecution(e,r,t.id,[])};let i=o.map(c=>c.id),s=new Date().toISOString(),a=K(e.stepHistory,r,c=>({...c,status:"waiting_for_children",childJobIds:i})),u=await this.persistJob({...e,status:"waiting_for_children",currentStepId:t.id,currentStepExecutionId:r,stepHistory:a,updatedAt:s});for(let c of o)this.emit({type:"job_started",jobId:c.id,timestamp:s}),this.runJob(c.id);return{outcome:"paused",job:u}}async spawnSelectionChildren(e,t,r){let o=rg(e),i=[];for(let s=0;s<o.length;s++){let a=o[s],u=await this.createJob({workflowId:t.workflowId,subjectContext:{mode:"single",subject:a},inputValues:{},parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:s});i.push(u)}return i}async spawnSourceChildren(e,t,r){if(!cc(t.forEach))throw new h(`sub_workflow step '${t.id}' forEach must be 'selection' or { source }`);let o=await this.requireWorkflow(t.workflowId);if(o.appliesTo!=="none")throw new h(`sub_workflow forEach source requires child workflow '${t.workflowId}' to have appliesTo 'none' (got ${JSON.stringify(o.appliesTo)})`);let i=il(t.forEach.source);if(!i)throw new h(`sub_workflow step '${t.id}' forEach.source must be a non-empty path`);let s=Hn(bt(e),i);if(!Array.isArray(s))throw new h(`sub_workflow forEach source '${i}' must resolve to an array (got ${og(s)})`);for(let u=0;u<s.length;u++){let c=s[u];if(!c||typeof c!="object"||Array.isArray(c))throw new h(`sub_workflow forEach source item at index ${u} must be an object of inputValues`)}let a=[];for(let u=0;u<s.length;u++){let c=s[u],p=await this.createJob({workflowId:t.workflowId,inputValues:c,parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:u});a.push(p)}return a}async onChildTerminal(e){let t=await this.jobs.get(e);if(!t?.parentJobId||!t.parentStepExecutionId)return;let r=`${t.parentJobId}:${t.parentStepExecutionId}`;if(!this.childTerminalLocks.has(r)){this.childTerminalLocks.add(r);try{let o=(await this.jobs.list({parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId})).filter($=>$.parentStepExecutionId===t.parentStepExecutionId),i=ds(o,$=>$.fanOutIndex);if(!i?.allTerminal)return;let{activeJobs:s}=i,a=await this.jobs.get(t.parentJobId);if(!a||a.status==="cancelled"||a.status!=="waiting_for_children"&&a.status!=="failed")return;let u=await this.workflowForJob(a),c=t.parentStepExecutionId,p=gt(a.stepHistory,c);if(!p||p.type!=="sub_workflow")return;let m=s.some($=>$.status==="failed");if(s.some($=>$.status==="cancelled"))return;if(m){await this.failExecution(a,u,c,p.stepDefinitionId,"One or more child jobs failed");return}let x=s.slice().sort(($,Ae)=>($.fanOutIndex??0)-(Ae.fanOutIndex??0)).map($=>({fanOutIndex:$.fanOutIndex,jobId:$.id,output:$.context})),R=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[p.stepDefinitionId]:x},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:K(a.stepHistory,c,$=>({...$,status:"completed",completedAt:R,output:x})),completedAt:void 0,updatedAt:R}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:p.stepDefinitionId,timestamp:R});let _=await this.continueTopLevelAfter(a,u,p.stepDefinitionId)}finally{this.childTerminalLocks.delete(r)}}}async onBatchMemberTerminal(e){let t=await this.jobs.get(e);if(!t?.batchId)return;let r=t.batchId;if(!this.batchTerminalLocks.has(r)){this.batchTerminalLocks.add(r);try{let o=await this.batches.get(t.batchId);if(!o||o.status!=="running")return;let i=await this.jobs.list({batchId:o.id}),s=ds(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=fl(a),c=new Date().toISOString(),p=await this.batches.update(o.id,{status:u,completedAt:c});if(!p)return;if(this.emit({type:"batch_completed",batchId:p.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:c}),!p.notificationSent){let m=await this.workflowForJob(t),w=p.notificationOverride??m.notificationPolicy,x=u==="completed"?"on_complete":"on_fail";w.triggers.includes(x)&&await this.notifications.send({title:`Batch ${u}: ${m.name}`,body:`JobBatch ${p.id} finished with status '${u}' (${a.length} members)`,batchId:p.id}),await this.batches.update(p.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return wo(e.viewId,this.views,this.providers);let t=[];for(let r of e.subjectIds)if(e.subjectType==="ticket"){let o=await this.getTicketById(r);t.push({subjectType:"ticket",...o})}else if(e.subjectType==="pull_request"){let o=await this.getPullRequestById(r);t.push({subjectType:"pull_request",...o})}else if(e.subjectType==="documentation"){let o=await this.getDocumentationById(r);t.push({subjectType:"documentation",...o})}else throw new h(`Unsupported subjectType: ${e.subjectType}`);return t}async executeAgentStep(e,t,r){let o=await ml(t.contextFileIds??[],this.contextFiles,this.logger),i=bt(e),s=ln(t.objective,i),a=t.agentInstanceId??(await this.settings.get()).defaultAgentInstanceId;if(!a)throw new Error("No default agent instance configured (set EngineSettings.defaultAgentInstanceId)");let u=await this.setExecutionStatus(e,r,"queued"),c=!1;try{await this.agentGate.acquire(a,u.id,r),c=!0;let p=await this.stopIfCancelled(u);if(p)return p;if(u=await this.jobs.get(u.id)??u,u=await this.setExecutionStatus(u,r,"running"),u.status==="cancelled")return u;let m=await this.providers.getAgentProvider(a).run({objective:s,outputFormat:t.outputFormat,knowledge:o,context:{...i,stepId:t.id},...u.worktreePath?{cwd:u.worktreePath}:{}}),w=pl(t.outputFormat,m.parsed);return this.finishExecution(u,r,t.id,w)}finally{c&&this.agentGate.release(a)}}async setExecutionStatus(e,t,r){let o=new Date().toISOString(),i=K(e.stepHistory,t,s=>({...s,status:r}));return this.persistJob({...e,stepHistory:i,updatedAt:o})}async executeGitStep(e,t,r){let o=un(t.params,bt(e));switch(t.operation){case"create_worktree":{let i=await Sl({job:e,params:o,git:this.git,jobs:this.jobs,localRepositories:this.localRepositories});return this.finishExecution(e,r,t.id,i,{worktreePath:i.worktreePath,branch:i.branch})}case"create_branch":{let i=Io(e),s=Dt(o,"branchName");return await this.git.createBranch(i,{branchName:s,...typeof o.baseBranch=="string"?{baseBranch:o.baseBranch}:{}}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"checkout":{let i=Io(e),s=Dt(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Io(e),s=await this.git.commit(i,{message:Dt(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Io(e);return await this.git.push(i,{...typeof o.remote=="string"?{remote:o.remote}:{},...typeof o.branch=="string"?{branch:o.branch}:{}}),this.finishExecution(e,r,t.id,{remote:typeof o.remote=="string"?o.remote:"origin",branch:typeof o.branch=="string"?o.branch:e.branch})}default:{let i=t.operation;throw new Error(`Unknown git operation: ${i}`)}}}async executeProviderActionStep(e,t,r,o){if(!e.subjectContext||e.subjectContext.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let i=this.resolveProviderActionSubject(e,t);if(t.extendedAction)return this.executeExtendedProviderAction(e,t,r,i);let s=o??un(t.params??{},bt(e))??{},a=await this.dispatchPortableProviderAction(i,t.action,s);return this.finishExecution(e,r,t.id,a)}resolveProviderActionSubject(e,t){if(!t.target){let o=e.subjectContext;if(!o||o.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let i=o.subject;return{subjectType:i.subjectType,source:i.source,subjectId:i.id}}let r=ln(t.target.subjectId,bt(e)).trim();if(!r)throw new Error(`provider_action '${t.id}' target.subjectId interpolated to an empty id`);return{subjectType:t.target.subjectType,source:t.target.source,subjectId:r}}async dispatchPortableProviderAction(e,t,r){let{subjectType:o,source:i,subjectId:s}=e;if(o==="documentation"){let u=this.providers.getDocumentationProvider(i);switch(t){case"get_subject":return u.get(s);case"get_content":return u.getContent(s);case"get_comments":return u.getComments(s);case"post_comment":if(r.comments!==void 0)throw new Error("Array-mode post_comment requires subjectType 'pull_request' (got 'documentation')");return await u.postComment(s,Dt(r,"body")),{posted:!0};case"update_status":throw new Error(`Provider action '${t}' is not valid for subject type 'documentation'`);default:{let c=t;throw new Error(`Unknown provider action: ${c}`)}}}let a=o==="ticket"?this.providers.getTicketProvider(i):o==="pull_request"?this.providers.getRepoProvider(i):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${o}`);switch(t){case"get_subject":return a.get(s);case"get_comments":return a.getComments(s);case"post_comment":if(r.comments!==void 0){if(o!=="pull_request")throw new Error(`Array-mode post_comment requires subjectType 'pull_request' (got '${o}')`);let u=this.providers.getRepoProvider(i),c=u.postPositionedComments;if(typeof c!="function")throw new Error(`Provider '${i}' doesn't support positioned comments`);let p=Fc(r.comments);if(!p)throw new h("post_comment params.comments must be { file, line, body }[]");let m=await c.call(u,s,p);if(m.failed.length>0)throw new Wn(`Failed to post ${m.failed.length} of ${p.length} positioned comments`,{succeeded:m.succeeded,failed:m.failed});return{posted:!0,succeeded:m.succeeded}}return await a.postComment(s,Dt(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Dt(r,"status")),{status:Dt(r,"status")};case"get_content":throw new Error(`Provider action 'get_content' is not valid for subject type '${o}'`);default:{let u=t;throw new Error(`Unknown provider action: ${u}`)}}}async executeExtendedProviderAction(e,t,r,o){let i=t.extendedAction,s=o.subjectType==="documentation"?this.providers.getDocumentationProvider(i.providerId):o.subjectType==="ticket"?this.providers.getTicketProvider(i.providerId):o.subjectType==="pull_request"?this.providers.getRepoProvider(i.providerId):null;if(!s)throw new Error(`Unsupported subjectType for provider_action: ${o.subjectType}`);if(!gu(s))throw new Error(`Provider instance '${i.providerId}' does not support extended actions. Available: none`);let a=await s.listExtendedActions(),u=a.find(m=>m.actionId===i.actionId);if(!u)throw new Error(`Provider '${i.providerId}' has no extended action '${i.actionId}'. Available: ${en(a)}`);let c=un(i.params??{},bt(e))??{};Jr(u,c);let p=await s.executeExtendedAction(i.actionId,{...c,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,p)}async executeShellStep(e,t,r){let o=ln(t.command,bt(e)),i=e.worktreePath??process.cwd();try{let s=await Zy(o,{cwd:i,windowsHide:!0});return this.finishExecution(e,r,t.id,{exitCode:0,stdout:String(s.stdout??""),stderr:String(s.stderr??"")})}catch(s){let a=s,u=a.stderr??"",c=a.stdout??"",p=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${p}, cwd=${i}): ${u||c||a.message||o}`)}}async executeExtractStep(e,t,r,o){let i=ln(r.source,bt(e)),s=al({source:i,path:r.path,pattern:r.pattern});if(s.kind==="match")return{outcome:"completed",job:await this.finishExecution(e,o,r.id,s.value)};switch(r.onNoMatch){case"fail":throw new Error(`Extract '${r.id}' did not match`);case"empty":return{outcome:"completed",job:await this.finishExecution(e,o,r.id,"")};case"ask_human":return{outcome:"paused",job:await this.pauseForExtract(e,t,r,o,s.sourceValue)};default:{let a=r.onNoMatch;throw new Error(`Unknown onNoMatch action: ${String(a)}`)}}}async pauseForExtract(e,t,r,o,i){let s=new Date().toISOString(),a=r.pattern?.trim()||void 0,u={extractNoMatch:!0,sourceValue:i,...a?{pattern:a}:{}},c={sourceValue:i,...a?{pattern:a}:{}},p=K(e.stepHistory,o,w=>({...w,status:"pending",output:u})),m=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:p,updatedAt:s});return this.emit({type:"waiting_for_human",jobId:m.id,stepDefinitionId:r.id,interaction:"confirmation",data:c,questions:[`Extract '${r.id}' did not match. Provide a value, continue with empty, or cancel?`],timestamp:s}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${m.id} needs a value for extract step '${r.id}'`,jobId:m.id}),m}async pauseForInteraction(e,t,r,o){let i=new Date().toISOString(),s=this.interactionPauseData(e,t,r),a=K(e.stepHistory,o,m=>({...m,status:"pending",...s!==void 0?{output:s}:{}})),u=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:a,updatedAt:i}),c=au(r.interaction,s);return this.emit({type:"waiting_for_human",jobId:u.id,stepDefinitionId:r.id,interaction:r.interaction,data:s,questions:c,timestamp:i}),t.notificationPolicy.triggers.includes("on_needs_input")&&r.notify!==!1&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${u.id} is waiting for human input on step '${r.id}'`,jobId:u.id}),u}interactionPauseData(e,t,r){if(r.interaction==="comment_review")return{suggestions:Rc(r,t.steps,e.context)};let o=tg(t,r.id);return o!=null?e.context[o]:void 0}async recordSkippedStep(e,t,r,o,i){let s=new Date().toISOString(),a=xc(t.condition,e.context),u=e.stepHistory,c=r;if(c)u=K(e.stepHistory,c,m=>({...m,status:"skipped",completedAt:s,output:a,error:void 0}));else{let m={id:jo(),stepDefinitionId:t.id,type:t.type,status:"skipped",completedAt:s,output:a};c=m.id,u=go(e.stepHistory,m,o,i)}let p=await this.persistJob({...e,status:e.status==="pending"?"planning":e.status,currentStepId:t.id,currentStepExecutionId:c,stepHistory:u,updatedAt:s});return this.emit({type:"step_completed",jobId:p.id,stepDefinitionId:t.id,timestamp:s}),p}async finishExecution(e,t,r,o,i={}){let s=new Date().toISOString(),a=K(e.stepHistory,t,c=>({...c,status:"completed",completedAt:s,output:o})),u=await this.persistJob({...e,...i,context:{...e.context,[r]:o},stepHistory:a,updatedAt:s});return this.emit({type:"step_completed",jobId:u.id,stepDefinitionId:r,timestamp:s}),u}async failExecution(e,t,r,o,i){return this.failJob(e,t,r,o,new Error(i))}async completeJob(e,t){let r=new Date().toISOString(),o=await this.persistJob({...e,status:"completed",currentStepId:void 0,currentStepExecutionId:void 0,completedAt:r,updatedAt:r});return o.status==="cancelled"||(this.emit({type:"job_completed",jobId:o.id,timestamp:r}),await this.onBatchMemberTerminal(o.id),!o.batchId&&t.notificationPolicy.triggers.includes("on_complete")&&await this.notifications.send({title:`Job completed: ${t.name}`,body:`Job ${o.id} completed successfully`,jobId:o.id})),o}async failJob(e,t,r,o,i){let s=i instanceof Error?i.message:String(i),a=i instanceof Wn?i.details:void 0,u=new Date().toISOString(),c=K(e.stepHistory,r,m=>({...m,status:"failed",completedAt:u,error:s,...a!==void 0?{failureDetails:a}:{failureDetails:void 0}})),p=await this.persistJob({...e,status:"failed",currentStepId:o,currentStepExecutionId:r,stepHistory:c,completedAt:u,updatedAt:u});return this.emit({type:"step_failed",jobId:p.id,stepDefinitionId:o,error:s,timestamp:u}),p.status==="cancelled"?(await this.onBatchMemberTerminal(p.id),p):(this.emit({type:"job_failed",jobId:p.id,error:s,timestamp:u}),await this.onBatchMemberTerminal(p.id),!p.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${p.id} failed on step '${o}': ${s}`,jobId:p.id}),p)}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=ig(e.appliesTo);if(!t)throw new Error(`Workflow '${e.id}' applies to '${r}' but no subjectId was provided`);if(r==="ticket")return{mode:"single",subject:{subjectType:"ticket",...await this.getTicketById(t)}};if(r==="pull_request")return{mode:"single",subject:{subjectType:"pull_request",...await this.getPullRequestById(t)}};if(r==="documentation")return{mode:"single",subject:{subjectType:"documentation",...await this.getDocumentationById(t)}};throw new Error(`Unsupported subjectType for workflow subject resolution: ${r}`)}async workflowForJob(e){return e.workflowSnapshot?e.workflowSnapshot:(this.logger.warn(`Job ${e.id} has no workflowSnapshot; falling back to live WorkflowDefinition ${e.workflowId}`),this.requireWorkflow(e.workflowId))}async requireWorkflow(e){let t=await this.workflows.get(e);if(!t)throw new y(`Workflow not found: ${e}`);return t}emitRetryLaunch(e,t){let r=new Date().toISOString();this.emit({type:"job_started",jobId:e,timestamp:r}),this.emit({type:"job_retried",jobId:e,retryOf:t,timestamp:r})}inputValuesFromContext(e,t){let r={};for(let o of t.inputSchema)Object.prototype.hasOwnProperty.call(e,o.name)&&(r[o.name]=e[o.name]);return r}async persistCancelled(e){let t=new Date().toISOString();return this.persistJob({...e,status:"cancelled",completedAt:e.completedAt??t,updatedAt:t})}async stopIfCancelled(e){return!this.cancellation.isCancellationRequested(e.id)&&e.status!=="cancelled"&&(await this.jobs.get(e.id))?.status!=="cancelled"?null:(this.cancellation.clear(e.id),e.status==="cancelled"?e:this.persistCancelled(e))}async persistJob(e){let t=await this.jobs.get(e.id),r=this.cancellation.isCancellationRequested(e.id)||t?.status==="cancelled"||e.status==="cancelled",o=r?"cancelled":e.status,i=r?t?.completedAt??e.completedAt??e.updatedAt:e.completedAt,s=await this.jobs.update(e.id,{status:o,context:e.context,currentStepId:e.currentStepId,currentStepExecutionId:e.currentStepExecutionId,stepHistory:e.stepHistory,worktreePath:e.worktreePath,branch:e.branch,updatedAt:e.updatedAt,completedAt:i});if(!s)throw new Error(`Failed to persist job ${e.id}`);return t?.status!=="cancelled"&&s.status==="cancelled"&&this.emit({type:"job_cancelled",jobId:s.id,timestamp:s.updatedAt}),s}emit(e){this.events.emit(e)}async getTicketById(e){return ws(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return ws(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return ws(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};Ie=bs=Vy([Qy(),se(0,ae(D)),se(1,ae(Y)),se(2,ae(pe)),se(3,ae(le)),se(4,ae(xe)),se(5,ae(W)),se(6,ae(xn)),se(7,ae(de)),se(8,ae(fe)),se(9,ae(Ge)),se(10,ae(I)),se(11,ae(qt)),se(12,ae(je)),Gy("design:paramtypes",[D,Y,pe,le,xe,W,Object,de,fe,Ge,Object,qt,je])],Ie)});import{Module as ag}from"@nestjs/common";var sg,pn,Ss=l(()=>{"use strict";Nn();lo();fo();ol();_o();hs();bo();sg=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},pn=class{};pn=sg([ag({imports:[Ne,mt,ht,yo],providers:[qt,je,Ie],exports:[Ie,je]})],pn)});import{Catch as ug}from"@nestjs/common";var cg,Po,jl=l(()=>{"use strict";P();cg=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Po=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message,...e.details??{}})}};Po=cg([ug(Ct)],Po)});var v,ce=l(()=>{"use strict";P();v=class{schema;constructor(e){this.schema=e}transform(e){let t=this.schema.safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.join(".")||"(root)"}: ${o.message}`).join("; ");throw new h(`Validation failed: ${r}`)}return t.data}}});function Il(n,e,t){if(!n)throw new y(`Workflow not found: ${e}`);if(n.appliesTo==="none")throw new h(`Cannot bind a View to workflow '${e}' because appliesTo is 'none'`);if(!jc(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function _l(n,e){if(!n)throw new y(`Workflow not found: ${e}`);if(n.appliesTo!=="none")throw new h(`WorkflowShortcut requires appliesTo 'none', got '${String(n.appliesTo)}'`);if(n.subjectHandling!=="per-subject")throw new h(`WorkflowShortcut requires subjectHandling 'per-subject', got '${n.subjectHandling}'`);return n}function Pl(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var Eo=l(()=>{"use strict";C();P()});import{randomUUID as lg}from"node:crypto";function pg(){return lg()}function El(n){let e=n.id??pg(),t=ac(n.steps),r=kl(n.steps,t);return{...n,id:e,steps:r}}function kl(n,e){return n.map(t=>{let r=t.id;return r||(r=oc(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:kl(t.steps,e)}:{...t,id:r}})}var Rl=l(()=>{"use strict";C()});function Al(n){return n.issues.map(e=>`${e.path.join(".")||"(root)"}: ${e.message}`).join("; ")}function xs(n){let e=ct.safeParse(n);if(!e.success)throw new h(`Validation failed: ${Al(e.error)}`);return e.data}function Cl(n){let e=El(n),t=Dn.safeParse(e);if(!t.success)throw new h(`Validation failed: ${Al(t.error)}`);return Pl(t.data),t.data}async function St(n,e){return n.create(Cl(xs(e)))}async function ko(n,e,t){let r=Cl({...t,id:e}),{id:o,...i}=r,s=await n.update(e,i);if(!s)throw new y(`Workflow not found: ${e}`);return s}var Ro=l(()=>{"use strict";C();P();Eo();Rl()});import{z as Bt}from"zod";async function $l(n,e){let t=xs(e.workflowDefinition),r=t.id;if(!r)return{workflow:await St(n,t),created:!0};let o=await n.get(r);if(!o)return{workflow:await St(n,t),created:!0};if(e.resolution==="update")return{workflow:await ko(n,r,t),created:!1};if(e.resolution==="create_new"){let{id:i,...s}=t;return{workflow:await St(n,s),created:!0}}throw new B(`A workflow named '${o.name}' already exists`,{conflictingWorkflowId:o.id,conflictingWorkflowName:o.name})}var Ao,Tl,vs=l(()=>{"use strict";P();Ro();Ao=Bt.object({workflowDefinition:Bt.unknown(),resolution:Bt.enum(["update","create_new"]).optional()}),Tl=Bt.object({error:Bt.string(),conflictingWorkflowId:Bt.string(),conflictingWorkflowName:Bt.string()})});import{z as dg}from"zod";function mg(n){if(n.type==="loop")return"not offered as `{{stepId}}` tokens; reference inner steps. Exit conditions use `until.stepId`.";let e=_c(n,"ticket");return e.opaque?"opaque (`{{stepId}}` only; no known field paths)":e.isScalar?"scalar (`{{stepId}}`)":e.fields?.length?`${e.isArray?"array of objects with fields":"object fields"}: ${e.fields.join(", ")}`:"no extra field paths (`{{stepId}}` is still the whole output)"}function hg(n){return n.type==="agent"?`agent (\`${n.outputFormat}\`)`:n.type==="interaction"?`interaction (\`${n.interaction}\`)`:n.type==="git"?`git (\`${n.operation}\`)`:n.type==="provider_action"?n.extendedAction?"provider_action (`extendedAction`)":`provider_action (\`${n.action}\`)`:n.type}function yg(){return Object.keys(Bn).map(t=>{let r=Bn[t].map(o=>`\`{{subject.${o}}}\``).join(", ");return`- **${t}**: ${r}`}).join(`
24
+ `)}function gg(){return Object.keys(Ol).map(n=>`- **${n}**: ${Ol[n]}`).join(`
25
+ `)}function wg(){return fg.map(n=>`- **${hg(n)}**: ${mg(n)}`).join(`
26
+ `)}function ql(n=br){let e=dg.toJSONSchema(n),t=JSON.stringify(e,null,2);return`# Knoflows workflow authoring instructions
27
+
28
+ Knoflows is a local workflow automation engine for software engineering tasks. A workflow is a pipeline of steps. It can run against a **subject** \u2014 a ticket, pull request, or documentation page \u2014 or standalone (\`appliesTo: "none"\`).
29
+
30
+ Steps are either **deterministic** (shell, git, provider_action, extract, sub_workflow, loop) or **agent-driven** (\`agent\`, often paired with an \`interaction\` pause for a human). Data threads between steps with \`{{path}}\` templating: the engine substitutes those tokens from the job subject, workflow inputs, and earlier step outputs when a step runs.
31
+
32
+ This document is generated from the live Engine schemas. Treat the JSON Schema block as the source of truth for every currently supported step type's fields. A one-line blurb below may go stale; a field list in that schema cannot, because it is derived from the same Zod schema the Engine validates against.
33
+
34
+ ## Workflow JSON file
35
+
36
+ Export produces a \`WorkflowDefinition\` with the workflow \`id\` and every step \`id\` preserved. Typical top-level fields: \`id\`, \`name\`, \`description\`, \`appliesTo\`, \`subjectHandling\`, \`inputSchema\`, \`steps\`, \`notificationPolicy\`.
37
+
38
+ When adding **new** steps, you may omit \`id\`; the Engine assigns one on import. Do not invent ids for existing steps \u2014 leave them untouched so templates keep resolving.
39
+
40
+ ## \`{{}}\` templating
41
+
42
+ Tokens of the form \`{{path}}\` are replaced when a step runs. Paths resolve against:
43
+
44
+ - workflow input fields (\`{{fieldName}}\` from \`inputSchema\`)
45
+ - the job subject (\`{{subject.field}}\` \u2014 see below)
46
+ - previous step outputs (\`{{stepId}}\` or \`{{stepId.field}}\`)
47
+
48
+ Inside a loop, each iteration overwrites that step's output; a later reference is the most recent pass.
49
+
50
+ ## Subject field reference
51
+
52
+ Known \`{{subject.field}}\` paths per \`SubjectType\` (same table as the builder's Available Parameters panel):
53
+
54
+ ${yg()}
55
+
56
+ Standalone workflows (\`appliesTo: "none"\`) have no subject; do not use \`{{subject.*}}\` there.
57
+
58
+ ## Step types (one-line descriptions)
59
+
60
+ Hand-maintained blurbs \u2014 cosmetic only. The JSON Schema below is authoritative for fields.
61
+
62
+ ${gg()}
63
+
64
+ ## Step definition JSON Schema
65
+
66
+ Generated with \`z.toJSONSchema()\` from the live \`StepDefinition\` discriminated union. This is the exact shape the Engine validates.
67
+
68
+ \`\`\`json
69
+ ${t}
70
+ \`\`\`
71
+
72
+ ## Step output shapes
73
+
74
+ When a later step uses \`{{step-id}}\` or \`{{step-id.field}}\`, these are the fields the Engine actually produces. Generated from \`getStepOutputShape\` (the same helper as Available Parameters).
75
+
76
+ ${wg()}
77
+
78
+ For \`get_subject\` without \`target\`, fields depend on the workflow's \`appliesTo\` subject type(s).
79
+
80
+ ## Provider-instance portability
81
+
82
+ \`provider_action.target\` and \`provider_action.extendedAction\` require a specific, already-configured provider instance id (\`source\` / \`providerId\`). An agent working from this file alone cannot invent those ids \u2014 they must match this Knoflows install's configured instances. Portable \`action\` values (\`get_subject\`, \`get_comments\`, \`post_comment\`, \`update_status\`, \`get_content\`) do not need an instance id unless \`target\` or \`extendedAction\` is set.
83
+
84
+ \`sub_workflow.workflowId\` likewise refers to a workflow that must already exist on the destination install. A dangling id after import shows the same inline mismatch warning used for missing provider instances; this file does not bundle dependencies.
85
+
86
+ ### \`sub_workflow.forEach\`
87
+
88
+ - \`"selection"\` \u2014 one child Job per subject in the parent\u2019s collection. The parent Job must have \`subjectContext.mode === "collection"\`. Each child is \`mode: "single"\` with empty \`inputValues\`.
89
+ - \`{ "source": "stepId.field" }\` \u2014 resolve that path from the parent job context with \`getPath\` (not \`{{}}\` string interpolation, which would stringify the array). The value must be an **array**; a non-array is an error, an empty array is valid and completes the parent step immediately. Each item is used directly as that child\u2019s \`inputValues\` (shape it to the child workflow\u2019s \`inputSchema\`). The child workflow must be \`appliesTo: "none"\` \u2014 there is no subject+inputs hybrid. The parent\u2019s own \`subjectContext\` can be anything.
90
+
91
+ Zero children in either mode complete the parent \`sub_workflow\` step immediately. Do not leave the parent in \`waiting_for_children\` with nobody to wait for.
92
+
93
+ ## Per-step \`condition\`
94
+
95
+ Every step type accepts an optional \`condition\` \u2014 the same two predicates as \`loop.until\` (\`field_empty\` / \`field_equals\`). When the condition **holds**, the step is skipped entirely: no provider or agent call, no human pause, no loop iteration, no sub-workflow fan-out. The \`JobStepExecution\` is recorded with \`status: "skipped"\` plus the condition and the values it evaluated against.
96
+
97
+ Referencing a skipped step's output (\`{{skipped-step-id.field}}\`) resolves to \`undefined\`, the same as any step that never ran.
98
+
99
+ Example \u2014 skip posting comments when a \`comment_review\` kept nothing:
100
+
101
+ \`\`\`json
102
+ "condition": { "type": "field_empty", "stepId": "review", "field": "finalComments" }
103
+ \`\`\`
104
+
105
+ A confirmation gate on the following work step uses \`field_equals\` with \`value: false\` so the work is skipped when the human rejected.
106
+
107
+ ## Do not rename step ids without updating references
108
+
109
+ Step \`id\`s are referenced internally via \`{{step-id}}\` templates, \`loop.until.stepId\`, and \`condition.stepId\`. Renaming a step id requires updating every reference to it elsewhere in the same file, or those references will silently fail to resolve at runtime.
110
+
111
+ This risk is scoped to **future** runs of the edited workflow only. Each Job stores a \`workflowSnapshot\` \u2014 a frozen copy of the definition as it existed when that Job started \u2014 so already-run Job history is completely unaffected by later edits.
112
+ `}var Ol,fg,Dl=l(()=>{"use strict";C();Ol={agent:"Calls a coding agent with an objective; output shape depends on outputFormat.",interaction:"Pauses the job for a human (questionnaire, confirmation, conversation, or comment review).",shell:"Runs a shell command and captures exitCode, stdout, and stderr.",git:"Performs a git operation (worktree, checkout, branch, commit, or push).",provider_action:"Runs a portable provider action, or an instance-specific extendedAction.",sub_workflow:'Fans out a child workflow once per selected subject (`forEach: "selection"`) or once per item in a prior-step array (`forEach: { source }`).',loop:"Repeats nested steps until an exit condition or maxIterations.",extract:"Pulls a value from a previous step or subject using a path and/or regex."},fg=[{type:"agent",id:"agent-free-text",name:"Agent",objective:"x",outputFormat:"free_text"},{type:"agent",id:"agent-questionnaire",name:"Agent",objective:"x",outputFormat:"questionnaire"},{type:"agent",id:"agent-confirmation",name:"Agent",objective:"x",outputFormat:"confirmation"},{type:"agent",id:"agent-comment-suggestions",name:"Agent",objective:"x",outputFormat:"comment_suggestions"},{type:"interaction",id:"interaction",name:"Interaction",interaction:"questionnaire"},{type:"interaction",id:"comment-review",name:"Review comments",interaction:"comment_review",sourceStepIds:["agent-comment-suggestions"]},{type:"shell",id:"shell",name:"Shell",command:"echo"},{type:"git",id:"git-worktree",name:"Git",operation:"create_worktree",params:{}},{type:"git",id:"git-commit",name:"Git",operation:"commit",params:{}},{type:"git",id:"git-push",name:"Git",operation:"push",params:{}},{type:"provider_action",id:"get-subject",name:"Get subject",action:"get_subject"},{type:"provider_action",id:"get-comments",name:"Get comments",action:"get_comments"},{type:"provider_action",id:"get-content",name:"Get content",action:"get_content"},{type:"provider_action",id:"post-comment",name:"Post comment",action:"post_comment"},{type:"provider_action",id:"extended-action",name:"Extended",action:"get_subject",extendedAction:{providerId:"example",actionId:"custom"}},{type:"sub_workflow",id:"sub-workflow",name:"Sub workflow",workflowId:"child",forEach:"selection"},{type:"loop",id:"loop",name:"Loop",maxIterations:1,onMaxIterations:{action:"fail"},until:{type:"field_empty",stepId:"inner",field:"x"},steps:[]},{type:"extract",id:"extract",name:"Extract",source:"{{subject.description}}",path:"title",onNoMatch:"fail"}]});import{Body as js,Controller as bg,Delete as Sg,Get as Co,Header as xg,HttpCode as vg,Inject as jg,Param as To,Patch as Ig,Post as Bl,Query as _g,Res as Fl}from"@nestjs/common";var Qe,T,_e,ge,Nl=l(()=>{"use strict";C();Pt();P();ce();Ro();vs();Dl();Qe=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},T=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_e=function(n,e){return function(t,r){e(t,r,n)}},ge=class{workflows;constructor(e){this.workflows=e}async list(e){if(e!=null&&e!==""&&e!=="per-subject"&&e!=="collection")throw new h(`Invalid subjectHandling filter: ${e}`);return this.workflows.list(e?{subjectHandling:e}:{})}instructions(){return ql()}async importDefinition(e,t){let r=await $l(this.workflows,e);return t.status(r.created?201:200),r.workflow}async exportDefinition(e,t){let r=await this.workflows.get(e);if(!r)throw new y(`Workflow not found: ${e}`);let o=`${Ri(r.name)}.json`;return t.setHeader("Content-Disposition",`attachment; filename="${o}"`),r}async get(e){let t=await this.workflows.get(e);if(!t)throw new y(`Workflow not found: ${e}`);return t}async create(e){return St(this.workflows,e)}async update(e,t){return ko(this.workflows,e,t)}async remove(e){if(!await this.workflows.get(e))throw new y(`Workflow not found: ${e}`);if(!await this.workflows.delete(e))throw new y(`Workflow not found: ${e}`)}};Qe([Co(),_e(0,_g("subjectHandling")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"list",null);Qe([Co("instructions"),xg("Content-Type","text/markdown; charset=utf-8"),T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",String)],ge.prototype,"instructions",null);Qe([Bl("import"),_e(0,js(new v(Ao))),_e(1,Fl({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[Object,Object]),T("design:returntype",Promise)],ge.prototype,"importDefinition",null);Qe([Co(":id/export"),_e(0,To("id")),_e(1,Fl({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],ge.prototype,"exportDefinition",null);Qe([Co(":id"),_e(0,To("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"get",null);Qe([Bl(),_e(0,js()),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],ge.prototype,"create",null);Qe([Ig(":id"),_e(0,To("id")),_e(1,js(new v(ct))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],ge.prototype,"update",null);Qe([Sg(":id"),vg(204),_e(0,To("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"remove",null);ge=Qe([bg("workflows"),_e(0,jg(D)),T("design:paramtypes",[D])],ge)});function Pg(n){return Jl(n.workflowDefinition.steps,"steps")}function Ll(n){let e=Pg(n);if(e.length>0)throw new Error(`Workflow library entry '${n.id}' is not portable: ${e.join(", ")}`)}function Jl(n,e){let t=[];return n.forEach((r,o)=>{let i=`${e}[${o}]`;r.type==="provider_action"&&(r.target&&t.push(`${i}.target`),r.extendedAction&&t.push(`${i}.extendedAction`)),r.type==="loop"&&t.push(...Jl(r.steps,`${i}.steps`))}),t}var Ul=l(()=>{"use strict"});function Ml(){return structuredClone(Is)}function Wl(n){let e=Is.find(t=>t.id===n);return e?structuredClone(e):void 0}var Eg,kg,Is,Kl=l(()=>{"use strict";Ul();Eg={id:"clarify-then-summarize",source:"example",name:"Clarify then summarize",description:"Asks clarifying questions in a loop until none remain, then summarizes the answers.",workflowDefinition:{name:"Clarify then summarize",description:"Asks clarifying questions in a loop until none remain, then summarizes the answers.",appliesTo:"none",subjectHandling:"per-subject",inputSchema:[{name:"topic",label:"Topic",type:"string",required:!0}],steps:[{type:"loop",name:"Clarify",steps:[{type:"agent",name:"Draft questions",objective:"Draft clarifying questions about {{topic}}. If you have no remaining questions, return an empty list.",outputFormat:"questionnaire"},{type:"interaction",name:"Collect answers",interaction:"questionnaire"}],until:{type:"field_empty",stepId:"draft-questions",field:"questions"},maxIterations:5,onMaxIterations:{action:"continue"}},{type:"agent",name:"Summarize",objective:"Produce a final summary for {{topic}} using these answers: {{collect-answers}}",outputFormat:"free_text"}],notificationPolicy:{triggers:["on_needs_input","on_complete","on_fail"]}}},kg={id:"pr-review",source:"example",name:"PR Review",description:"Reviews a pull request for acceptance criteria, code quality, and test coverage.",workflowDefinition:{name:"PR Review",description:"Reviews a pull request for acceptance criteria, code quality, and test coverage.",appliesTo:"pull_request",subjectHandling:"per-subject",inputSchema:[{name:"repoPath",label:"Repository path",type:"localRepository",required:!0},{name:"ticketDescription",label:"Related ticket description (optional)",type:"string",required:!1}],steps:[{type:"git",name:"Prepare review worktree",operation:"create_worktree",params:{repoPath:"{{repoPath}}",baseBranch:"{{subject.sourceBranch}}",branchName:"review/{{subject.id}}"}},{type:"agent",name:"Build requirements checklist",objective:`Ticket: {{ticketDescription}}
113
+ PR title: {{subject.title}}
114
+ PR description: {{subject.description}}
115
+
116
+ Produce a structured requirements checklist.`,outputFormat:"free_text"},{type:"agent",name:"Acceptance criteria review",objective:`Review the code in the worktree against this checklist, report findings with suggested PR comments.
117
+ Checklist: {{build-requirements-checklist}}`,outputFormat:"free_text"},{type:"shell",name:"Run linter",command:"npm run lint --silent || true"},{type:"agent",name:"Code quality review",objective:`Review for bugs and pattern issues. Lint results:
118
+ {{run-linter}}`,outputFormat:"free_text"},{type:"shell",name:"Run relevant tests",command:"npm test --silent || true"},{type:"agent",name:"Testing review",objective:`Review test coverage and results. Test run output:
119
+ {{run-relevant-tests}}`,outputFormat:"free_text"},{type:"agent",name:"Generate combined review report",objective:`Combine into one markdown report: Summary, Acceptance Criteria, Findings by Role, Tests Run, Suggested PR Comments, Verdict (APPROVE/COMMENT/REQUEST_CHANGES).
120
+ Acceptance: {{acceptance-criteria-review}}
121
+ Code quality: {{code-quality-review}}
122
+ Testing: {{testing-review}}`,outputFormat:"free_text"}],notificationPolicy:{triggers:["on_fail","on_complete"]}}},Is=[Eg,kg];for(let n of Is)Ll(n)});import{Controller as Rg,Get as Ag,Inject as Cg,Param as Tg,Post as $g}from"@nestjs/common";var _s,Ft,Hl,dn,Vl=l(()=>{"use strict";Pt();P();Kl();Ro();_s=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ft=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Hl=function(n,e){return function(t,r){e(t,r,n)}},dn=class{workflows;constructor(e){this.workflows=e}list(){return Ml()}async add(e){let t=Wl(e);if(!t)throw new y(`Workflow library entry not found: ${e}`);let r=structuredClone(t.workflowDefinition);return delete r.id,St(this.workflows,r)}};_s([Ag(),Ft("design:type",Function),Ft("design:paramtypes",[]),Ft("design:returntype",Array)],dn.prototype,"list",null);_s([$g(":id/add"),Hl(0,Tg("id")),Ft("design:type",Function),Ft("design:paramtypes",[String]),Ft("design:returntype",Promise)],dn.prototype,"add",null);dn=_s([Rg("workflow-library"),Hl(0,Cg(D)),Ft("design:paramtypes",[D])],dn)});import{Body as Es,Controller as Og,Delete as qg,Get as ks,HttpCode as Dg,Inject as Ps,Param as $o,Patch as Gl,Post as Bg,Query as Fg}from"@nestjs/common";var xt,O,Pe,Ee,Ql=l(()=>{"use strict";C();ur();Pt();P();ce();Eo();an();ms();xt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},O=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Pe=function(n,e){return function(t,r){e(t,r,n)}},Ee=class{views;workflows;providers;constructor(e,t,r){this.views=e,this.workflows=t,this.providers=r}async list(e){if(e!=null&&e!==""){let t=ie.safeParse(e);if(!t.success)throw new h(`Invalid subjectType filter: ${e}`);return this.views.list({subjectType:t.data})}return this.views.list({})}async reorder(e){let t=[];for(let i of e.viewIds){let s=await this.views.get(i);if(!s)throw new h(`Unknown view id in reorder: ${i}`);t.push(s)}if(new Set(t.map(i=>i.subjectType)).size!==1)throw new h("All viewIds in a reorder request must share the same subjectType");return await this.views.reorder(e.viewIds)}async listSubjects(e){return wo(e,this.views,this.providers)}async get(e){let t=await this.views.get(e);if(!t)throw new y(`SubjectView not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId,e.subjectType),this.views.create(e)}async update(e,t){let r=await this.views.get(e);if(!r)throw new y(`SubjectView not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId,t.subjectType??r.subjectType);let o=await this.views.update(e,t);if(!o)throw new y(`SubjectView not found: ${e}`);return o}async remove(e){if(!await this.views.delete(e))throw new y(`SubjectView not found: ${e}`)}async assertBinding(e,t){let r=await this.workflows.get(e);Il(r,e,t)}};xt([ks(),Pe(0,Fg("subjectType")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"list",null);xt([Gl("reorder"),Pe(0,Es(new v(gr))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],Ee.prototype,"reorder",null);xt([ks(":id/subjects"),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"listSubjects",null);xt([ks(":id"),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"get",null);xt([Bg(),Pe(0,Es(new v(hr))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],Ee.prototype,"create",null);xt([Gl(":id"),Pe(0,$o("id")),Pe(1,Es(new v(yr))),O("design:type",Function),O("design:paramtypes",[String,Object]),O("design:returntype",Promise)],Ee.prototype,"update",null);xt([qg(":id"),Dg(204),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"remove",null);Ee=xt([Og("views"),Pe(0,Ps(le)),Pe(1,Ps(D)),Pe(2,Ps(W)),O("design:paramtypes",[le,D,W])],Ee)});import{Body as Rs,Controller as Ng,Delete as Lg,Get as Yl,HttpCode as Jg,Inject as zl,Param as As,Patch as Xl,Post as Ug}from"@nestjs/common";var Nt,N,vt,Le,Zl=l(()=>{"use strict";C();Pi();Pt();P();ce();Eo();Nt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},N=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},vt=function(n,e){return function(t,r){e(t,r,n)}},Le=class{shortcuts;workflows;constructor(e,t){this.shortcuts=e,this.workflows=t}async list(){return this.shortcuts.list()}async reorder(e){for(let t of e.shortcutIds)if(!await this.shortcuts.get(t))throw new h(`Unknown shortcut id in reorder: ${t}`);return this.shortcuts.reorder(e.shortcutIds)}async get(e){let t=await this.shortcuts.get(e);if(!t)throw new y(`WorkflowShortcut not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId),this.shortcuts.create(e)}async update(e,t){let r=await this.shortcuts.get(e);if(!r)throw new y(`WorkflowShortcut not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId);let o=await this.shortcuts.update(e,t);if(!o)throw new y(`WorkflowShortcut not found: ${e}`);return o}async remove(e){if(!await this.shortcuts.delete(e))throw new y(`WorkflowShortcut not found: ${e}`)}async assertBinding(e){let t=await this.workflows.get(e);_l(t,e)}};Nt([Yl(),N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",Promise)],Le.prototype,"list",null);Nt([Xl("reorder"),vt(0,Rs(new v(Ar))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Le.prototype,"reorder",null);Nt([Yl(":id"),vt(0,As("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Le.prototype,"get",null);Nt([Ug(),vt(0,Rs(new v(kr))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Le.prototype,"create",null);Nt([Xl(":id"),vt(0,As("id")),vt(1,Rs(new v(Rr))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],Le.prototype,"update",null);Nt([Lg(":id"),Jg(204),vt(0,As("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Le.prototype,"remove",null);Le=Nt([Ng("workflow-shortcuts"),vt(0,zl(Ke)),vt(1,zl(D)),N("design:paramtypes",[Ke,D])],Le)});function Oo(n,e,t=50){let r=n!=null&&n!==""?Number(n):t,o=e!=null&&e!==""?Number(e):0;return!Number.isFinite(r)||r<1?{limit:t,offset:Math.max(0,o||0)}:!Number.isFinite(o)||o<0?{limit:r,offset:0}:{limit:Math.floor(r),offset:Math.floor(o)}}function qo(n,e,t){return n.slice(t,t+e)}var Cs=l(()=>{"use strict"});import{z as L}from"zod";var Do,Bo,Fo,No,Lo,Ts=l(()=>{"use strict";Do=L.object({workflowId:L.string().min(1),subjectId:L.string().min(1).optional(),inputValues:L.record(L.string(),L.unknown())}),Bo=L.object({response:L.unknown()}),Fo=L.object({workflowId:L.string().min(1),subjectIds:L.array(L.string().min(1))}),No=L.object({jobIds:L.array(L.string().min(1)).min(1)}),Lo=L.object({overrideParams:L.record(L.string(),L.unknown()).optional()})});import{Body as Gn,Controller as Mg,Get as qs,HttpCode as ep,Inject as $s,Param as Qn,Post as Lt,Query as ze}from"@nestjs/common";import"zod";function Os(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var ke,E,q,Wg,ne,tp=l(()=>{"use strict";_o();On();P();ce();Cs();Ts();bo();ke=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},E=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},q=function(n,e){return function(t,r){e(t,r,n)}},Wg=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];ne=class{jobs;runner;agentGate;constructor(e,t,r){this.jobs=e,this.runner=t,this.agentGate=r}async list(e,t,r,o,i,s,a,u,c){if(t!=null&&t!==""&&!Wg.includes(t))throw new h(`Invalid status filter: ${t}`);let p=Os(i,"topLevelOnly"),m=Os(s,"terminal"),w=Os(a,"liveWorktree"),{limit:x,offset:R}=Oo(u,c),_=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...p===!0?{topLevelOnly:!0}:{},...m!==void 0?{terminal:m}:{},...w===!0?{liveWorktree:!0}:{}});return qo(_,x,R)}listQueued(){return this.agentGate.listQueued()}async latestBySubject(e){return this.jobs.latestBySubject(e.workflowId,e.subjectIds)}async deleteWorktrees(e){return this.runner.deleteWorktrees(e.jobIds)}async get(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);return t}async create(e){return this.runner.start({workflowId:e.workflowId,...e.subjectId?{subjectId:e.subjectId}:{},inputValues:e.inputValues})}async resume(e,t){return this.runner.resume(e,t.response)}async retry(e){return this.runner.retryFailedJob(e)}async retryStep(e,t){return this.runner.retryFailedStep(e,t.overrideParams)}async cancel(e){return this.runner.cancelJob(e)}};ke([qs(),q(0,ze("workflowId")),q(1,ze("status")),q(2,ze("batchId")),q(3,ze("parentJobId")),q(4,ze("topLevelOnly")),q(5,ze("terminal")),q(6,ze("liveWorktree")),q(7,ze("limit")),q(8,ze("offset")),E("design:type",Function),E("design:paramtypes",[String,String,String,String,String,String,String,String,String]),E("design:returntype",Promise)],ne.prototype,"list",null);ke([qs("queued"),E("design:type",Function),E("design:paramtypes",[]),E("design:returntype",Array)],ne.prototype,"listQueued",null);ke([Lt("latest-by-subject"),ep(200),q(0,Gn(new v(Fo))),E("design:type",Function),E("design:paramtypes",[Object]),E("design:returntype",Promise)],ne.prototype,"latestBySubject",null);ke([Lt("delete-worktrees"),ep(200),q(0,Gn(new v(No))),E("design:type",Function),E("design:paramtypes",[Object]),E("design:returntype",Promise)],ne.prototype,"deleteWorktrees",null);ke([qs(":id"),q(0,Qn("id")),E("design:type",Function),E("design:paramtypes",[String]),E("design:returntype",Promise)],ne.prototype,"get",null);ke([Lt(),q(0,Gn(new v(Do))),E("design:type",Function),E("design:paramtypes",[Object]),E("design:returntype",Promise)],ne.prototype,"create",null);ke([Lt(":id/resume"),q(0,Qn("id")),q(1,Gn(new v(Bo))),E("design:type",Function),E("design:paramtypes",[String,Object]),E("design:returntype",Promise)],ne.prototype,"resume",null);ke([Lt(":id/retry"),q(0,Qn("id")),E("design:type",Function),E("design:paramtypes",[String]),E("design:returntype",Promise)],ne.prototype,"retry",null);ke([Lt(":id/retry-step"),q(0,Qn("id")),q(1,Gn(new v(Lo))),E("design:type",Function),E("design:paramtypes",[String,Object]),E("design:returntype",Promise)],ne.prototype,"retryStep",null);ke([Lt(":id/cancel"),q(0,Qn("id")),E("design:type",Function),E("design:paramtypes",[String]),E("design:returntype",Promise)],ne.prototype,"cancel",null);ne=ke([Mg("jobs"),q(0,$s(Y)),q(1,$s(Ie)),q(2,$s(je)),E("design:paramtypes",[Y,Ie,je])],ne)});import{z as re}from"zod";var Jo,Uo,Ds=l(()=>{"use strict";C();Jo=re.discriminatedUnion("mode",[re.object({mode:re.literal("view"),viewId:re.string().min(1)}),re.object({mode:re.literal("manual"),subjectType:ie,subjectIds:re.array(re.string().min(1))})]),Uo=re.object({workflowId:re.string().min(1),selection:Jo,triggeredBy:re.enum(["schedule","view_bulk","multiselect"]),notificationOverride:qn.optional(),inputValues:re.record(re.string(),re.unknown())})});import{Body as Kg,Controller as Hg,Get as Ns,Inject as Bs,Param as Ls,Post as np,Query as Fs}from"@nestjs/common";import"zod";var fn,V,Je,Ye,rp=l(()=>{"use strict";_o();lr();On();P();ce();Cs();Ds();fn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},V=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Je=function(n,e){return function(t,r){e(t,r,n)}},Ye=class{batches;jobs;runner;constructor(e,t,r){this.batches=e,this.jobs=t,this.runner=r}async list(e,t,r){let{limit:o,offset:i}=Oo(t,r),s=await this.batches.list(e?{workflowId:e}:{});return qo(s,o,i)}async get(e){let t=await this.batches.get(e);if(!t)throw new y(`JobBatch not found: ${e}`);return t}async listJobs(e){if(!await this.batches.get(e))throw new y(`JobBatch not found: ${e}`);return this.jobs.list({batchId:e})}async launch(e){let t=await this.runner.launch({workflowId:e.workflowId,selection:e.selection,triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},inputValues:e.inputValues});return"resolvedSubjects"in t&&"jobIds"in t?{kind:"batch",batch:t}:{kind:"job",job:t}}async cancel(e){return this.runner.cancelBatch(e)}};fn([Ns(),Je(0,Fs("workflowId")),Je(1,Fs("limit")),Je(2,Fs("offset")),V("design:type",Function),V("design:paramtypes",[String,String,String]),V("design:returntype",Promise)],Ye.prototype,"list",null);fn([Ns(":id"),Je(0,Ls("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ye.prototype,"get",null);fn([Ns(":id/jobs"),Je(0,Ls("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ye.prototype,"listJobs",null);fn([np(),Je(0,Kg(new v(Uo))),V("design:type",Function),V("design:paramtypes",[Object]),V("design:returntype",Promise)],Ye.prototype,"launch",null);fn([np(":id/cancel"),Je(0,Ls("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ye.prototype,"cancel",null);Ye=fn([Hg("batches"),Je(0,Bs(pe)),Je(1,Bs(Y)),Je(2,Bs(Ie)),V("design:paramtypes",[pe,Y,Ie])],Ye)});import{Body as op,Controller as Vg,Delete as Gg,Get as ip,HttpCode as Qg,Inject as zg,Param as Js,Patch as Yg,Post as Xg,Query as Zg}from"@nestjs/common";var mn,G,Jt,Xe,sp=l(()=>{"use strict";C();Ii();P();ce();mn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},G=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Jt=function(n,e){return function(t,r){e(t,r,n)}},Xe=class{schedules;constructor(e){this.schedules=e}async list(e){if(e==null||e==="")return this.schedules.list();if(e!=="true"&&e!=="false")throw new h(`Invalid enabled filter: ${e}`);return this.schedules.list({enabled:e==="true"})}async get(e){let t=await this.schedules.get(e);if(!t)throw new y(`Schedule not found: ${e}`);return t}async create(e){return this.schedules.create(e)}async update(e,t){let r=await this.schedules.update(e,t);if(!r)throw new y(`Schedule not found: ${e}`);return r}async remove(e){if(!await this.schedules.delete(e))throw new y(`Schedule not found: ${e}`)}};mn([ip(),Jt(0,Zg("enabled")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Xe.prototype,"list",null);mn([ip(":id"),Jt(0,Js("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Xe.prototype,"get",null);mn([Xg(),Jt(0,op(new v(Qt))),G("design:type",Function),G("design:paramtypes",[Object]),G("design:returntype",Promise)],Xe.prototype,"create",null);mn([Yg(":id"),Jt(0,Js("id")),Jt(1,op(new v(Qt.partial().omit({id:!0})))),G("design:type",Function),G("design:paramtypes",[String,Object]),G("design:returntype",Promise)],Xe.prototype,"update",null);mn([Gg(":id"),Qg(204),Jt(0,Js("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Xe.prototype,"remove",null);Xe=mn([Vg("schedules"),Jt(0,zg(We)),G("design:paramtypes",[We])],Xe)});import{Controller as ew,Inject as tw,Query as ap,Sse as nw}from"@nestjs/common";import{Observable as up}from"rxjs";var cp,Mo,Us,zn,lp=l(()=>{"use strict";po();cp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Mo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Us=function(n,e){return function(t,r){e(t,r,n)}},zn=class{events;constructor(e){this.events=e}stream(e,t){return new up(r=>{let o=this.events.subscribe(i=>{let s=i;e!=null&&e!==""&&(!("jobId"in s)||s.jobId!==e)||t!=null&&t!==""&&(!("batchId"in s)||s.batchId!==t)||r.next({data:s})});return()=>{o()}})}};cp([nw(),Us(0,ap("jobId")),Us(1,ap("batchId")),Mo("design:type",Function),Mo("design:paramtypes",[String,String]),Mo("design:returntype",up)],zn.prototype,"stream",null);zn=cp([ew("events"),Us(0,tw(xe)),Mo("design:paramtypes",[xe])],zn)});import{extendZodWithOpenApi as rw}from"@asteasolutions/zod-to-openapi";import{z as ow}from"zod";var pp=l(()=>{"use strict";rw(ow)});import{z as dp}from"zod";var Wo,Ms=l(()=>{"use strict";Wo=dp.object({value:dp.string().min(1)})});import{z as Re}from"zod";var ZR,iw,fp,mp=l(()=>{"use strict";ZR=Re.object({path:Re.string().optional(),mode:Re.enum(["directories","files"]).optional(),extensions:Re.string().optional()}),iw=Re.object({name:Re.string().min(1),path:Re.string().min(1),isDirectory:Re.boolean()}),fp=Re.object({path:Re.string().min(1),entries:Re.array(iw)})});import{z as d}from"zod";function Pw(n){let e=d.toJSONSchema(n),{$schema:t,...r}=e;return r}function yp(n){let e=(t,r)=>n.registerComponent("schemas",t,Pw(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",Dn),WorkflowDefinitionInput:e("WorkflowDefinitionInput",ct),UpdateWorkflowBody:e("UpdateWorkflowBody",ww),SubjectView:e("SubjectView",mr),CreateSubjectViewBody:e("CreateSubjectViewBody",hr),ReorderViewsBody:e("ReorderViewsBody",gr),UpdateViewBody:e("UpdateViewBody",Sw),WorkflowShortcut:e("WorkflowShortcut",Er),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",kr),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",Rr),ReorderShortcutsBody:e("ReorderShortcutsBody",Ar),Schedule:e("Schedule",Qt),UpdateScheduleBody:e("UpdateScheduleBody",xw),EngineSettings:e("EngineSettings",Tr),UpdateSettingsBody:e("UpdateSettingsBody",jw),SettingsPatchResponse:e("SettingsPatchResponse",_w),ProviderInstanceConfig:e("ProviderInstanceConfig",Cr),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Or),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",qr),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",Iw),SetSecretBody:e("SetSecretBody",Wo),CreateJobBody:e("CreateJobBody",Do),ResumeJobBody:e("ResumeJobBody",Bo),RetryStepBody:e("RetryStepBody",Lo),LatestBySubjectBody:e("LatestBySubjectBody",Fo),LatestBySubjectResponse:e("LatestBySubjectResponse",vw),LaunchBody:e("LaunchBody",Uo),Job:e("Job",Ws),QueuedAgentStep:e("QueuedAgentStep",dw),JobBatch:e("JobBatch",hp),LaunchResponse:e("LaunchResponse",fw),HealthResponse:e("HealthResponse",mw),ProviderStatus:e("ProviderStatus",hw),QueryTemplate:e("QueryTemplate",Za),ProviderActionDescriptor:e("ProviderActionDescriptor",ec),PreviewModelsBody:e("PreviewModelsBody",Dr),PreviewModel:e("PreviewModel",Xc),TestConnectionBody:e("TestConnectionBody",Br),TestConnectionResult:e("TestConnectionResult",eu),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",fr),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",tc),ErrorResponse:e("ErrorResponse",yw),EngineEvent:e("EngineEvent",gw),Subject:e("Subject",Ko),WorkflowLibraryEntry:e("WorkflowLibraryEntry",bw),ContextFile:e("ContextFile",xr),CreateContextFileBody:e("CreateContextFileBody",vr),UpdateContextFileBody:e("UpdateContextFileBody",jr),LocalRepository:e("LocalRepository",Ir),CreateLocalRepositoryBody:e("CreateLocalRepositoryBody",_r),UpdateLocalRepositoryBody:e("UpdateLocalRepositoryBody",Pr),DeleteWorktreesBody:e("DeleteWorktreesBody",No),FilesystemBrowseResult:e("FilesystemBrowseResult",fp),ImportWorkflowBody:e("ImportWorkflowBody",Ao),ImportConflictResponse:e("ImportConflictResponse",Tl)}}var sw,aw,cw,uw,Ko,lw,pw,dw,Ws,hp,fw,mw,hw,yw,gw,ww,bw,Sw,xw,vw,jw,Iw,_w,k,Ks,Hs=l(()=>{"use strict";pp();C();Ts();Ds();Ms();mp();vs();sw=d.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),aw=d.object({subjectType:d.literal("ticket"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),status:d.string(),assignee:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),cw=d.object({subjectType:d.literal("pull_request"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),sourceBranch:d.string(),targetBranch:d.string(),author:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),uw=d.object({subjectType:d.literal("documentation"),id:d.string(),source:d.string().min(1),title:d.string(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),Ko=d.discriminatedUnion("subjectType",[aw,cw,uw]),lw=d.discriminatedUnion("mode",[d.object({mode:d.literal("single"),subject:Ko}),d.object({mode:d.literal("collection"),subjects:d.array(Ko)})]),pw=d.object({id:d.string(),stepDefinitionId:d.string(),type:d.string(),status:d.enum(["pending","queued","running","waiting_for_children","completed","failed","skipped"]),startedAt:d.string().optional(),completedAt:d.string().optional(),output:d.unknown().optional(),error:d.string().optional(),failureDetails:d.record(d.string(),d.unknown()).optional(),childJobIds:d.array(d.string()).optional(),iterations:d.array(d.object({index:d.number().int(),stepExecutions:d.array(d.record(d.string(),d.unknown())),startedAt:d.string(),completedAt:d.string().optional()})).optional()}),dw=d.object({jobId:d.string(),stepExecutionId:d.string(),agentInstanceId:d.string(),enqueuedAt:d.string()}),Ws=d.object({id:d.string(),workflowId:d.string(),status:sw,subjectContext:lw.optional(),selection:Jo.optional(),batchId:d.string().optional(),parentJobId:d.string().optional(),parentStepExecutionId:d.string().optional(),fanOutIndex:d.number().int().optional(),retryOf:d.string().optional(),workflowSnapshot:Dn.optional(),context:d.record(d.string(),d.unknown()),worktreePath:d.string().optional(),branch:d.string().optional(),worktreeDeletedAt:d.string().optional(),currentStepId:d.string().optional(),currentStepExecutionId:d.string().optional(),stepHistory:d.array(pw),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().optional()}),hp=d.object({id:d.string(),workflowId:d.string(),selection:Jo,resolvedSubjects:d.array(Ko),jobIds:d.array(d.string()),status:d.enum(["running","completed","completed_with_issues","failed","cancelled"]),triggeredBy:d.enum(["schedule","view_bulk","multiselect"]),scheduleId:d.string().optional(),notificationOverride:qn.optional(),notificationSent:d.boolean(),createdAt:d.string(),completedAt:d.string().optional()}),fw=d.discriminatedUnion("kind",[d.object({kind:d.literal("job"),job:Ws}),d.object({kind:d.literal("batch"),batch:hp})]),mw=d.object({ok:d.boolean(),service:d.string(),timestamp:d.string()}),hw=d.object({providerId:d.string(),secretKey:d.string(),configured:d.boolean()}),yw=d.object({error:d.string()}),gw=d.object({type:d.string(),timestamp:d.string()}).passthrough(),ww=ct,bw=d.object({id:d.string().min(1),source:d.enum(["example","community","official"]),name:d.string().min(1),description:d.string(),workflowDefinition:ct}),Sw=yr,xw=Qt.partial().omit({id:!0}),vw=d.record(d.string(),Ws.nullable()),jw=$r,Iw=d.object({settings:Tr,restartRequired:d.literal(!0)}),_w=d.object({settings:Tr,restartRequired:d.boolean()}),k=d.object({id:d.string().min(1)}),Ks=d.object({limit:d.string().optional().openapi({description:"Max items to return (default 50)"}),offset:d.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as j}from"zod";function g(n,e){return{description:e,content:{"application/json":{schema:n}}}}function F(n){return{type:"array",items:n}}function b(n,...e){let t={400:"Validation error",404:"Resource not found",409:"Conflict"};return Object.fromEntries(e.map(r=>[String(r),g(n.ErrorResponse,t[r]??"Error")]))}function gp(n,e){n.registerPath({method:"get",path:"/health",tags:["Health"],summary:"Health check",responses:{200:g(e.HealthResponse,"Service is healthy")}}),n.registerPath({method:"get",path:"/workflows",tags:["Workflows"],summary:"List workflow definitions",request:{query:j.object({subjectHandling:j.enum(["per-subject","collection"]).optional()})},responses:{200:g(F(e.WorkflowDefinition),"Workflow definitions"),...b(e,400)}}),n.registerPath({method:"get",path:"/workflows/instructions",tags:["Workflows"],summary:"Download generated agent authoring instructions",description:"Markdown generated at request time from the live StepDefinition Zod schema via z.toJSONSchema().",responses:{200:{description:"Markdown agent instructions",content:{"text/markdown":{schema:{type:"string"}}}}}}),n.registerPath({method:"post",path:"/workflows/import",tags:["Workflows"],summary:"Import a workflow definition from a JSON file",description:"Validates with the input schema (ids optional), assigns missing ids only, and preserves existing ids. If the file has an id that already exists and resolution is omitted, returns 409 with no write.",request:{body:{required:!0,content:{"application/json":{schema:e.ImportWorkflowBody}}}},responses:{200:g(e.WorkflowDefinition,"Updated existing workflow"),201:g(e.WorkflowDefinition,"Created workflow definition"),...b(e,400),409:g(e.ImportConflictResponse,"A workflow with this id already exists")}}),n.registerPath({method:"get",path:"/workflows/{id}/export",tags:["Workflows"],summary:"Export a workflow definition as stored (ids preserved)",request:{params:k},responses:{200:g(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:k},responses:{200:g(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflows",tags:["Workflows"],summary:"Create a workflow definition",request:{body:{required:!0,content:{"application/json":{schema:e.WorkflowDefinitionInput}}}},responses:{201:g(e.WorkflowDefinition,"Created workflow definition"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:g(e.WorkflowDefinition,"Updated workflow definition"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflows/{id}",tags:["Workflows"],summary:"Delete a workflow definition",description:"Deletes the live workflow definition. Running Jobs keep executing from the snapshot captured at Job creation.",request:{params:k},responses:{204:{description:"Workflow deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/workflow-library",tags:["Workflow Library"],summary:"List bundled workflow library entries",responses:{200:g(F(e.WorkflowLibraryEntry),"Workflow library entries")}}),n.registerPath({method:"post",path:"/workflow-library/{id}/add",tags:["Workflow Library"],summary:"Copy a library entry into the workspace as a new workflow",request:{params:k},responses:{201:g(e.WorkflowDefinition,"Created workflow definition"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:j.object({subjectType:ie.optional()})},responses:{200:g(F(e.SubjectView),"Subject views"),...b(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:k},responses:{200:g(e.SubjectView,"Subject view"),...b(e,404)}}),n.registerPath({method:"get",path:"/views/{id}/subjects",tags:["Views"],summary:"Preview subjects matching a view",description:"Live provider query for the View's saved filter. Same resolution path as launch() for { mode: 'view' }. Does not create Jobs or snapshots.",request:{params:k},responses:{200:g(F(e.Subject),"Matching subjects"),...b(e,404,400)}}),n.registerPath({method:"patch",path:"/views/reorder",tags:["Views"],summary:"Reorder views within a subject type group",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderViewsBody}}}},responses:{200:g(F(e.SubjectView),"Reordered views for the subject type"),...b(e,400)}}),n.registerPath({method:"post",path:"/views",tags:["Views"],summary:"Create a subject view",request:{body:{required:!0,content:{"application/json":{schema:e.CreateSubjectViewBody}}}},responses:{201:g(e.SubjectView,"Created subject view"),...b(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:g(e.SubjectView,"Updated subject view"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/views/{id}",tags:["Views"],summary:"Delete a subject view",request:{params:k},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:Ks.extend({workflowId:j.string().optional(),status:j.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]).optional(),batchId:j.string().optional(),parentJobId:j.string().optional(),topLevelOnly:j.enum(["true","false"]).optional().openapi({description:"When true, exclude jobs that belong to a batch or a parent (sub_workflow) job"}),terminal:j.enum(["true","false"]).optional().openapi({description:"When true, only completed/failed/cancelled jobs. When false, only in-progress jobs. Omitted: no terminality filter."}),liveWorktree:j.enum(["true","false"]).optional().openapi({description:"When true, only jobs with a worktreePath that has not been deleted from the management page."})})},responses:{200:g(F(e.Job),"Jobs"),...b(e,400)}}),n.registerPath({method:"get",path:"/jobs/queued",tags:["Jobs"],summary:"List agent steps waiting for a concurrency slot",responses:{200:g(F(e.QueuedAgentStep),"Queued agent steps")}}),n.registerPath({method:"post",path:"/jobs/delete-worktrees",tags:["Jobs"],summary:"Delete live worktree folders for terminal jobs",request:{body:{required:!0,content:{"application/json":{schema:e.DeleteWorktreesBody}}}},responses:{200:g(F(e.Job),"Jobs after worktree deletion"),...b(e,400,404,409)}}),n.registerPath({method:"get",path:"/jobs/{id}",tags:["Jobs"],summary:"Get a job",request:{params:k},responses:{200:g(e.Job,"Job"),...b(e,404)}}),n.registerPath({method:"post",path:"/jobs",tags:["Jobs"],summary:"Start a single job",request:{body:{required:!0,content:{"application/json":{schema:e.CreateJobBody}}}},responses:{201:g(e.Job,"Started job"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/jobs/latest-by-subject",tags:["Jobs"],summary:"Latest job per subject for a workflow",request:{body:{required:!0,content:{"application/json":{schema:e.LatestBySubjectBody}}}},responses:{200:g(e.LatestBySubjectResponse,"Latest job keyed by subject id"),...b(e,400)}}),n.registerPath({method:"post",path:"/jobs/{id}/resume",tags:["Jobs"],summary:"Resume a job waiting for human input",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:g(e.Job,"Resumed job"),...b(e,400,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/retry",tags:["Jobs"],summary:"Retry a failed job as a new linked job",request:{params:k},responses:{200:g(e.Job,"Retry job"),...b(e,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/retry-step",tags:["Jobs"],summary:"Retry the failed step of a job in place",request:{params:k,body:{required:!1,content:{"application/json":{schema:e.RetryStepBody}}}},responses:{200:g(e.Job,"Job after retrying the failed step"),...b(e,400,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/cancel",tags:["Jobs"],summary:"Cancel a non-terminal job",request:{params:k},responses:{200:g(e.Job,"Cancelled job"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:Ks.extend({workflowId:j.string().optional()})},responses:{200:g(F(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:k},responses:{200:g(e.JobBatch,"Job batch"),...b(e,404)}}),n.registerPath({method:"get",path:"/batches/{id}/jobs",tags:["Batches"],summary:"List jobs in a batch",request:{params:k},responses:{200:g(F(e.Job),"Jobs in the batch"),...b(e,404)}}),n.registerPath({method:"post",path:"/batches",tags:["Batches"],summary:"Launch a per-subject batch or collection run",description:"Resolves subject selection and starts a JobBatch for per-subject workflows (even for one subject) or a single Job for collection workflows.",request:{body:{required:!0,content:{"application/json":{schema:e.LaunchBody}}}},responses:{201:g(e.LaunchResponse,"Launch result"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/batches/{id}/cancel",tags:["Batches"],summary:"Cancel a running job batch",request:{params:k},responses:{200:g(e.JobBatch,"Cancelled batch"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:g(F(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:k},responses:{200:g(e.WorkflowShortcut,"Workflow shortcut"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"Create a workflow shortcut",request:{body:{required:!0,content:{"application/json":{schema:e.CreateWorkflowShortcutBody}}}},responses:{201:g(e.WorkflowShortcut,"Created workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/reorder",tags:["Workflow shortcuts"],summary:"Reorder workflow shortcuts",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderShortcutsBody}}}},responses:{200:g(F(e.WorkflowShortcut),"Reordered workflow shortcuts"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Update a workflow shortcut",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:g(e.WorkflowShortcut,"Updated workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Delete a workflow shortcut",request:{params:k},responses:{204:{description:"Workflow shortcut deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/context-files",tags:["Context Files"],summary:"List context files",responses:{200:g(F(e.ContextFile),"Context files")}}),n.registerPath({method:"get",path:"/context-files/{id}",tags:["Context Files"],summary:"Get a context file",request:{params:k},responses:{200:g(e.ContextFile,"Context file"),...b(e,404)}}),n.registerPath({method:"post",path:"/context-files",tags:["Context Files"],summary:"Create a context file",request:{body:{required:!0,content:{"application/json":{schema:e.CreateContextFileBody}}}},responses:{201:g(e.ContextFile,"Created context file"),...b(e,400)}}),n.registerPath({method:"patch",path:"/context-files/{id}",tags:["Context Files"],summary:"Update a context file",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateContextFileBody}}}},responses:{200:g(e.ContextFile,"Updated context file"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/context-files/{id}",tags:["Context Files"],summary:"Delete a context file",request:{params:k},responses:{204:{description:"Context file deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/local-repositories",tags:["Local Repositories"],summary:"List local repositories",responses:{200:g(F(e.LocalRepository),"Local repositories")}}),n.registerPath({method:"get",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Get a local repository",request:{params:k},responses:{200:g(e.LocalRepository,"Local repository"),...b(e,404)}}),n.registerPath({method:"post",path:"/local-repositories",tags:["Local Repositories"],summary:"Create a local repository",request:{body:{required:!0,content:{"application/json":{schema:e.CreateLocalRepositoryBody}}}},responses:{201:g(e.LocalRepository,"Created local repository"),...b(e,400)}}),n.registerPath({method:"patch",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Update a local repository",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateLocalRepositoryBody}}}},responses:{200:g(e.LocalRepository,"Updated local repository"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Delete a local repository",request:{params:k},responses:{204:{description:"Local repository deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/filesystem/browse",tags:["Filesystem"],summary:"List a host directory",request:{query:j.object({path:j.string().optional(),mode:j.enum(["directories","files"]).optional(),extensions:j.string().optional()})},responses:{200:g(e.FilesystemBrowseResult,"Directory listing"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules",tags:["Schedules"],summary:"List schedules",request:{query:j.object({enabled:j.enum(["true","false"]).optional()})},responses:{200:g(F(e.Schedule),"Schedules"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:k},responses:{200:g(e.Schedule,"Schedule"),...b(e,404)}}),n.registerPath({method:"post",path:"/schedules",tags:["Schedules"],summary:"Create a schedule",description:"CRUD only \u2014 creating or enabling a schedule does not cause it to fire yet.",request:{body:{required:!0,content:{"application/json":{schema:e.Schedule}}}},responses:{201:g(e.Schedule,"Created schedule"),...b(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:k,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:g(e.Schedule,"Updated schedule"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:k},responses:{204:{description:"Schedule deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/providers/status",tags:["Providers"],summary:"Provider secret configuration status",description:"Reports whether each known provider API key is set. Returns key *names* only \u2014 never secret values.",responses:{200:g(F(e.ProviderStatus),"Provider configuration status")}}),n.registerPath({method:"post",path:"/providers/preview-models",tags:["Providers"],summary:"Preview models available to an agent API key",description:"Lookup only \u2014 does not persist settings or secrets. Send apiKey to try a typed key before save, or instanceId to use the already-stored key (never echoed).",request:{body:{required:!0,content:{"application/json":{schema:e.PreviewModelsBody}}}},responses:{200:g(F(e.PreviewModel),"Models available to the key"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/providers/test-connection",tags:["Providers"],summary:"Test a provider connection with in-progress values",description:"Lookup only \u2014 does not persist settings or secrets. Send apiKey to try typed credentials before save, or instanceId to use the already-stored key (never echoed). Failed auth returns HTTP 200 with success=false; identity mismatch returns success=true with identityMismatch=true.",request:{body:{required:!0,content:{"application/json":{schema:e.TestConnectionBody}}}},responses:{200:g(e.TestConnectionResult,"Connection probe result"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/providers/{providerId}/query-templates",tags:["Providers"],summary:"List query templates for a provider",description:"Named, pre-built query templates owned by the provider. Providers with none yet (e.g. documentation) return an empty list. The client never constructs `query` itself \u2014 it submits templateId + params to the resolve endpoint.",request:{params:j.object({providerId:j.string().min(1)})},responses:{200:g(F(e.QueryTemplate),"Query templates")}}),n.registerPath({method:"get",path:"/providers/{providerId}/actions",tags:["Providers"],summary:"List extended actions for a provider",description:"Opt-in capabilities beyond the portable five ProviderAction operations. Providers that do not implement ExtendedActionProvider return an empty list \u2014 that is a normal, expected case, not an error.",request:{params:j.object({providerId:j.string().min(1)})},responses:{200:g(F(e.ProviderActionDescriptor),"Extended actions")}}),n.registerPath({method:"post",path:"/providers/{providerId}/query-templates/{templateId}/resolve",tags:["Providers"],summary:"Resolve a query template to a concrete query",description:"Provider-specific query-shape knowledge stays server-side. Returns the `query` object to store on a SubjectView, along with template provenance the client attaches separately.",request:{params:j.object({providerId:j.string().min(1),templateId:j.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.ResolveQueryTemplateBody}}}},responses:{200:g(e.ResolveQueryTemplateResponse,"Resolved query"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/settings",tags:["Settings"],summary:"Get engine settings",description:"Persisted provider configuration. Never includes secret values \u2014 those live in SecretStore.",responses:{200:g(e.EngineSettings,"Current engine settings")}}),n.registerPath({method:"patch",path:"/settings",tags:["Settings"],summary:"Update engine settings",description:"Partial merge. restartRequired is true when providerInstances is in the patch (instance bindings are boot-time). Changing defaultAgentInstanceId takes effect on the next agent step with no restart.",request:{body:{required:!0,content:{"application/json":{schema:e.UpdateSettingsBody}}}},responses:{200:g(e.SettingsPatchResponse,"Updated settings"),...b(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:g(F(e.ProviderInstanceConfig),"Configured provider instances")}}),n.registerPath({method:"post",path:"/provider-instances",tags:["Settings"],summary:"Create a provider instance",description:"Persists the instance. restartRequired is always true \u2014 bindings are boot-time. For agent instances, defaultAgent atomically replaces EngineSettings.defaultAgentInstanceId in the same write.",request:{body:{required:!0,content:{"application/json":{schema:e.CreateProviderInstanceBody}}}},responses:{201:g(e.ProviderInstanceMutationResponse,"Created instance settings"),...b(e,400,409)}}),n.registerPath({method:"get",path:"/provider-instances/{id}",tags:["Settings"],summary:"Get a provider instance",request:{params:j.object({id:j.string().min(1)})},responses:{200:g(e.ProviderInstanceConfig,"Provider instance"),...b(e,404)}}),n.registerPath({method:"post",path:"/provider-instances/{id}/test-connection",tags:["Settings"],summary:"Test a saved provider instance connection",description:"Uses the persisted config and secret. Does not write settings or secrets. Failed auth returns HTTP 200 with success=false; identity mismatch returns success=true with identityMismatch=true. Manual instances return 400.",request:{params:j.object({id:j.string().min(1)})},responses:{200:g(e.TestConnectionResult,"Connection probe result"),...b(e,400,404)}}),n.registerPath({method:"patch",path:"/provider-instances/{id}",tags:["Settings"],summary:"Update a provider instance",request:{params:j.object({id:j.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.UpdateProviderInstanceBody}}}},responses:{200:g(e.ProviderInstanceMutationResponse,"Updated instance settings"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/provider-instances/{id}",tags:["Settings"],summary:"Delete a provider instance",request:{params:j.object({id:j.string().min(1)})},responses:{200:g(e.ProviderInstanceMutationResponse,"Updated settings after delete"),...b(e,404)}}),n.registerPath({method:"post",path:"/secrets/{key}",tags:["Settings"],summary:"Store a secret",description:"Writes to SecretStore. The response never includes the secret value.",request:{params:j.object({key:j.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.SetSecretBody}}}},responses:{204:{description:"Secret stored"},...b(e,400)}}),n.registerPath({method:"get",path:"/events",tags:["Events"],summary:"Subscribe to engine events (SSE)",description:"Server-Sent Events stream. Each event `data` field is a JSON EngineEvent. Optionally filter by jobId and/or batchId.",request:{query:j.object({jobId:j.string().optional(),batchId:j.string().optional()})},responses:{200:{description:"SSE stream of engine events",content:{"text/event-stream":{schema:e.EngineEvent}}}}})}var wp=l(()=>{"use strict";C();Hs()});import{OpenAPIRegistry as Ew,OpenApiGeneratorV31 as kw}from"@asteasolutions/zod-to-openapi";function bp(){if(Ho)return Ho;let n=new Ew,e=yp(n);return gp(n,e),Ho=new kw(n.definitions).generateDocument({openapi:"3.1.0",info:{title:"Knoflows Engine API",version:"0.1.0",description:"REST API for workflow definitions, jobs, batches, schedules, views, and live events."},servers:[{url:"/api"}]}),Ho}var Ho,Sp=l(()=>{"use strict";Hs();wp()});import{Controller as Rw,Get as Aw,Header as Cw}from"@nestjs/common";var xp,Vs,Yn,vp=l(()=>{"use strict";Sp();xp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Vs=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Yn=class{getOpenApiDocument(){return bp()}};xp([Aw("openapi.json"),Cw("Content-Type","application/json"),Vs("design:type",Function),Vs("design:paramtypes",[]),Vs("design:returntype",void 0)],Yn.prototype,"getOpenApiDocument",null);Yn=xp([Rw()],Yn)});import{Controller as Tw,Get as Gs,Inject as Xn,Param as Vo,Post as Qs,Body as zs,HttpCode as Ys}from"@nestjs/common";var Ut,J,we,Ue,jp=l(()=>{"use strict";Fi();Zi();es();co();uo();C();ce();Ut=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},J=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},we=function(n,e){return function(t,r){e(t,r,n)}},Ue=class{providerStatus;queryTemplates;extendedActions;previewModels;testConnections;constructor(e,t,r,o,i){this.providerStatus=e,this.queryTemplates=t,this.extendedActions=r,this.previewModels=o,this.testConnections=i}async status(){return this.providerStatus.list()}previewAvailableModels(e){return this.previewModels.preview(e)}testConnection(e){return this.testConnections.testDraft(e)}listQueryTemplates(e){return this.queryTemplates.list(e)}listExtendedActions(e){return this.extendedActions.list(e)}async resolveQueryTemplate(e,t,r){return{query:await this.queryTemplates.resolve(e,t,r.params)}}};Ut([Gs("status"),J("design:type",Function),J("design:paramtypes",[]),J("design:returntype",Promise)],Ue.prototype,"status",null);Ut([Qs("preview-models"),Ys(200),we(0,zs(new v(Dr))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ue.prototype,"previewAvailableModels",null);Ut([Qs("test-connection"),Ys(200),we(0,zs(new v(Br))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ue.prototype,"testConnection",null);Ut([Gs(":providerId/query-templates"),we(0,Vo("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ue.prototype,"listQueryTemplates",null);Ut([Gs(":providerId/actions"),we(0,Vo("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ue.prototype,"listExtendedActions",null);Ut([Qs(":providerId/query-templates/:templateId/resolve"),Ys(200),we(0,Vo("providerId")),we(1,Vo("templateId")),we(2,zs(new v(fr))),J("design:type",Function),J("design:paramtypes",[String,String,Object]),J("design:returntype",Promise)],Ue.prototype,"resolveQueryTemplate",null);Ue=Ut([Tw("providers"),we(0,Xn(ut)),we(1,Xn(pt)),we(2,Xn(dt)),we(3,Xn(ft)),we(4,Xn(Se)),J("design:paramtypes",[ut,pt,dt,ft,Se])],Ue)});import{Body as $w,Controller as Ow,Get as qw,Inject as Dw,Patch as Bw}from"@nestjs/common";var Xs,Mt,Ip,hn,_p=l(()=>{"use strict";C();he();ce();Xs=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Mt=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ip=function(n,e){return function(t,r){e(t,r,n)}},hn=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:lu(e)}}};Xs([qw(),Mt("design:type",Function),Mt("design:paramtypes",[]),Mt("design:returntype",Promise)],hn.prototype,"get",null);Xs([Bw(),Ip(0,$w(new v($r))),Mt("design:type",Function),Mt("design:paramtypes",[Object]),Mt("design:returntype",Promise)],hn.prototype,"update",null);hn=Xs([Ow("settings"),Ip(0,Dw(I)),Mt("design:paramtypes",[I])],hn)});function Zs(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return Fe(t)?r===!0?t.id:r===!1?e===t.id?null:e??null:o&&!e?t.id:e??null:e===t.id?null:e??null}function Pp(n){let{defaultAgent:e,...t}=n;return t}var Ep=l(()=>{"use strict";C()});import{Body as Rp,Controller as Fw,Delete as Nw,Get as Ap,HttpCode as Cp,Inject as kp,Param as Go,Patch as Lw,Post as Tp}from"@nestjs/common";var Wt,U,jt,Me,$p=l(()=>{"use strict";C();he();P();ce();Ep();uo();Wt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},U=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},jt=function(n,e){return function(t,r){e(t,r,n)}},Me=class{settings;testConnections;constructor(e,t){this.settings=e,this.testConnections=t}async list(){return(await this.settings.get()).providerInstances??[]}async get(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new y(`Provider instance not found: ${e}`);return t}testConnection(e){return this.testConnections.testSaved(e)}async create(e){let t=Pp(e),r=await this.settings.get(),o=[...r.providerInstances??[]];if(o.some(s=>s.id===t.id))throw new B(`Provider instance already exists: ${t.id}`);return o.push(t),{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Zs({current:r.defaultAgentInstanceId,instance:t,defaultAgent:e.defaultAgent,isCreate:!0})}),restartRequired:!0}}async update(e,t){let r=await this.settings.get(),o=[...r.providerInstances??[]],i=o.findIndex(c=>c.id===e);if(i<0)throw new y(`Provider instance not found: ${e}`);let a={...o[i],...t.displayName!=null?{displayName:t.displayName}:{},...t.config!=null?{config:t.config}:{},...t.secretKey!=null?{secretKey:t.secretKey}:{}};return t.expiresOn!==void 0&&(t.expiresOn?a.expiresOn=t.expiresOn:delete a.expiresOn),t.maxConcurrent!=null&&a.kind==="agent"&&(a.maxConcurrent=t.maxConcurrent),o[i]=a,{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Zs({current:r.defaultAgentInstanceId,instance:a,defaultAgent:t.defaultAgent,isCreate:!1})}),restartRequired:!0}}async remove(e){let t=await this.settings.get(),r=(t.providerInstances??[]).filter(s=>s.id!==e);if(r.length===(t.providerInstances??[]).length)throw new y(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};Wt([Ap(),U("design:type",Function),U("design:paramtypes",[]),U("design:returntype",Promise)],Me.prototype,"list",null);Wt([Ap(":id"),jt(0,Go("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Me.prototype,"get",null);Wt([Tp(":id/test-connection"),Cp(200),jt(0,Go("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Me.prototype,"testConnection",null);Wt([Tp(),jt(0,Rp(new v(Or))),U("design:type",Function),U("design:paramtypes",[Object]),U("design:returntype",Promise)],Me.prototype,"create",null);Wt([Lw(":id"),jt(0,Go("id")),jt(1,Rp(new v(qr))),U("design:type",Function),U("design:paramtypes",[String,Object]),U("design:returntype",Promise)],Me.prototype,"update",null);Wt([Nw(":id"),Cp(200),jt(0,Go("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Me.prototype,"remove",null);Me=Wt([Fw("provider-instances"),jt(0,kp(I)),jt(1,kp(Se)),U("design:paramtypes",[I,Se])],Me)});import{Body as Jw,Controller as Uw,HttpCode as Mw,Inject as Ww,Param as Kw,Post as Hw}from"@nestjs/common";var Op,Qo,ea,Zn,qp=l(()=>{"use strict";Ce();P();ce();Ms();Op=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Qo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ea=function(n,e){return function(t,r){e(t,r,n)}},Zn=class{secrets;constructor(e){this.secrets=e}async set(e,t){let r=e.trim();if(!r)throw new h("Secret key must not be empty");await this.secrets.set(r,t.value)}};Op([Hw(":key"),Mw(204),ea(0,Kw("key")),ea(1,Jw(new v(Wo))),Qo("design:type",Function),Qo("design:paramtypes",[String,Object]),Qo("design:returntype",Promise)],Zn.prototype,"set",null);Zn=Op([Uw("secrets"),ea(0,Ww(oe)),Qo("design:paramtypes",[Function])],Zn)});import{readFile as Vw}from"node:fs/promises";async function ta(n){try{await Vw(n,"utf8")}catch(e){let t=e instanceof Error?e.message:String(e);throw new h(`Cannot read context file at '${n}': ${t}`)}}var Dp=l(()=>{"use strict";P()});import{Body as Bp,Controller as Gw,Delete as Qw,Get as Fp,HttpCode as zw,Inject as Yw,Param as na,Patch as Xw,Post as Zw}from"@nestjs/common";import{randomUUID as eb}from"node:crypto";var gn,Q,yn,Ze,Np=l(()=>{"use strict";C();pr();P();ce();Dp();gn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Q=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},yn=function(n,e){return function(t,r){e(t,r,n)}},Ze=class{files;constructor(e){this.files=e}async list(){return this.files.list()}async get(e){let t=await this.files.get(e);if(!t)throw new y(`Context file not found: ${e}`);return t}async create(e){return await ta(e.path),this.files.create({id:e.id??eb(),name:e.name,description:e.description,tier:e.tier,path:e.path})}async update(e,t){let r=await this.files.get(e);if(!r)throw new y(`Context file not found: ${e}`);let o=t.path??r.path;await ta(o);let i=await this.files.update(e,t);if(!i)throw new y(`Context file not found: ${e}`);return i}async remove(e){if(!await this.files.delete(e))throw new y(`Context file not found: ${e}`)}};gn([Fp(),Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",Promise)],Ze.prototype,"list",null);gn([Fp(":id"),yn(0,na("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],Ze.prototype,"get",null);gn([Zw(),yn(0,Bp(new v(vr))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],Ze.prototype,"create",null);gn([Xw(":id"),yn(0,na("id")),yn(1,Bp(new v(jr))),Q("design:type",Function),Q("design:paramtypes",[String,Object]),Q("design:returntype",Promise)],Ze.prototype,"update",null);gn([Qw(":id"),zw(204),yn(0,na("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],Ze.prototype,"remove",null);Ze=gn([Gw("context-files"),yn(0,Yw(de)),Q("design:paramtypes",[de])],Ze)});import{execFile as tb}from"node:child_process";import{stat as nb}from"node:fs/promises";import{resolve as ra}from"node:path";import{promisify as rb}from"node:util";async function oa(n){let e=ra(n);try{if((await ob("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",windowsHide:!0})).stdout.trim()!=="true")throw new Error("not a work tree")}catch(t){let r=t instanceof Error?t.message:String(t);throw new h(`'${n}' is not a git repository: ${r}`)}}async function ia(n,e){let t=ra(n),r=ra(e?.trim()?e.trim():So(t));if(xo(t,r))throw new h(`Worktree base '${r}' must not be inside the repository at '${t}'`);try{if(!(await nb(r)).isDirectory())throw new h(`Worktree base '${r}' exists and is not a directory`)}catch(o){if(o instanceof h)throw o}}var ob,Lp=l(()=>{"use strict";P();gs();ob=rb(tb)});import{Body as Jp,Controller as ib,Delete as sb,Get as Up,HttpCode as ab,Inject as cb,Param as sa,Patch as ub,Post as lb}from"@nestjs/common";import{randomUUID as pb}from"node:crypto";var bn,z,wn,et,Mp=l(()=>{"use strict";C();dr();P();ce();Lp();bn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},z=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},wn=function(n,e){return function(t,r){e(t,r,n)}},et=class{repos;constructor(e){this.repos=e}async list(){return this.repos.list()}async get(e){let t=await this.repos.get(e);if(!t)throw new y(`Local repository not found: ${e}`);return t}async create(e){return await oa(e.localPath),await ia(e.localPath,e.worktreeBasePath),this.repos.create({id:e.id??pb(),name:e.name,localPath:e.localPath,...e.worktreeBasePath?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch?{defaultBranch:e.defaultBranch}:{}})}async update(e,t){let r=await this.repos.get(e);if(!r)throw new y(`Local repository not found: ${e}`);let o=t.localPath??r.localPath,i=t.worktreeBasePath!==void 0?t.worktreeBasePath:r.worktreeBasePath;await oa(o),await ia(o,i);let s=await this.repos.update(e,t);if(!s)throw new y(`Local repository not found: ${e}`);return s}async remove(e){if(!await this.repos.delete(e))throw new y(`Local repository not found: ${e}`)}};bn([Up(),z("design:type",Function),z("design:paramtypes",[]),z("design:returntype",Promise)],et.prototype,"list",null);bn([Up(":id"),wn(0,sa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],et.prototype,"get",null);bn([lb(),wn(0,Jp(new v(_r))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],et.prototype,"create",null);bn([ub(":id"),wn(0,sa("id")),wn(1,Jp(new v(Pr))),z("design:type",Function),z("design:paramtypes",[String,Object]),z("design:returntype",Promise)],et.prototype,"update",null);bn([sb(":id"),ab(204),wn(0,sa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],et.prototype,"remove",null);et=bn([ib("local-repositories"),wn(0,cb(fe)),z("design:paramtypes",[fe])],et)});import{readdir as db,stat as fb}from"node:fs/promises";import{homedir as mb}from"node:os";import{join as hb,resolve as yb}from"node:path";async function Wp(n,e={}){let t=n?.trim()?n.trim():mb(),r=yb(t),o;try{o=await fb(r)}catch(s){throw new h(`Cannot browse '${r}': ${s instanceof Error?s.message:String(s)}`)}if(!o.isDirectory())throw new h(`Cannot browse '${r}': not a directory`);let i;try{i=(await db(r,{encoding:"utf8",withFileTypes:!0})).filter(a=>a.name!=="."&&a.name!=="..").map(a=>({name:a.name,path:hb(r,a.name),isDirectory:a.isDirectory()})).filter(a=>gb(a,e)).sort((a,u)=>a.isDirectory!==u.isDirectory?a.isDirectory?-1:1:a.name.localeCompare(u.name))}catch(s){throw new h(`Cannot browse '${r}': ${s instanceof Error?s.message:String(s)}`)}return{path:r,entries:i}}function Kp(n){if(n==null||n.trim()==="")return;let e=n.split(",").map(t=>Vp(t)).filter(t=>t!=null);return e.length>0?e:void 0}function Hp(n){if(!(n==null||n.trim()==="")){if(n==="directories"||n==="files")return n;throw new h(`Invalid browse mode '${n}'`)}}function gb(n,e){if(e.mode==="directories")return n.isDirectory;if(n.isDirectory)return!0;let t=e.extensions?.map(o=>Vp(o)).filter(Boolean);if(!t?.length)return!0;let r=n.name.toLowerCase();return t.some(o=>r.endsWith(o))}function Vp(n){let e=n.trim().toLowerCase();if(e.length!==0)return e.startsWith(".")?e:`.${e}`}var Gp=l(()=>{"use strict";P()});import{Controller as wb,Get as bb,Query as ua}from"@nestjs/common";var Qp,aa,ca,er,zp=l(()=>{"use strict";Gp();Qp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},aa=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ca=function(n,e){return function(t,r){e(t,r,n)}},er=class{async browse(e,t,r){return Wp(e,{mode:Hp(t),extensions:Kp(r)})}};Qp([bb("browse"),ca(0,ua("path")),ca(1,ua("mode")),ca(2,ua("extensions")),aa("design:type",Function),aa("design:paramtypes",[String,String,String]),aa("design:returntype",Promise)],er.prototype,"browse",null);er=Qp([wb("filesystem")],er)});import{Module as xb}from"@nestjs/common";import{APP_FILTER as vb}from"@nestjs/core";var Sb,zo,Yp=l(()=>{"use strict";Nn();Ss();fo();jl();Nl();Vl();Ql();Zl();tp();rp();sp();lp();vp();jp();_p();$p();qp();Np();Mp();zp();lo();ui();Sb=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zo=class{};zo=Sb([xb({imports:[Ne,pn,ht,mt,Vt],controllers:[ge,dn,Ee,Le,ne,Ye,Xe,zn,Yn,Ue,hn,Me,Zn,Ze,et,er],providers:[{provide:vb,useClass:Po}]})],zo)});import{Module as Ib}from"@nestjs/common";var jb,Yo,Xp=l(()=>{"use strict";fa();ma();ha();lo();fo();Nn();Ss();Yp();jb=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Yo=class{};Yo=jb([Ib({imports:[tr,nr,mt,ht,Ne,pn,zo],controllers:[Sn]})],Yo)});import{apiReference as _b}from"@scalar/nestjs-api-reference";function Zp(n){n.use("/api/docs",_b({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var ed=l(()=>{"use strict"});import{createServer as Pb}from"node:net";function td(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function la(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await Eb(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function Eb(n){return new Promise(e=>{let t=Pb();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var nd=l(()=>{"use strict"});import{Catch as Ab,HttpStatus as Xo,NotFoundException as Cb}from"@nestjs/common";import{existsSync as rd,statSync as Tb}from"node:fs";import{extname as od,join as pa,normalize as $b,relative as Ob,sep as qb}from"node:path";function id(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=Db(e.path??"/");if(o){let i=pa(n,o);if(Bb(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(sd(e)){ad(t,n,i=>{i&&!t.headersSent&&t.status(Xo.NOT_FOUND).end()});return}t.status(Xo.NOT_FOUND).end()}}function sd(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=od(e);return!(t&&t!==".html")}function ad(n,e,t){n.sendFile("index.html",{root:e},t)}function Db(n){if(n==="/"||n==="")return"index.html";let e=$b(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!od(e)?null:e}function Bb(n,e){if(!rd(e))return!1;try{if(!Tb(e).isFile())return!1}catch{return!1}let t=Ob(n,e);return t!==""&&!t.startsWith(`..${qb}`)&&!t.startsWith("..")}function cd(n){return pa(n,"index.html")}var kb,Rb,Zo,ud=l(()=>{"use strict";kb=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Rb=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Zo=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(sd(o)&&rd(pa(this.staticRoot,"index.html"))){ad(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(Xo.NOT_FOUND).json({statusCode:Xo.NOT_FOUND,message:"UI index.html could not be served"})});return}let s=e.getStatus(),a=e.getResponse();i.status(s).json(typeof a=="string"?{statusCode:s,message:a}:a)}};Zo=kb([Ab(Cb),Rb("design:paramtypes",[String])],Zo)});import{existsSync as Fb}from"node:fs";import{dirname as Nb,join as ei}from"node:path";import{fileURLToPath as Lb}from"node:url";function ld(){let n=Nb(Lb(import.meta.url)),e=[ei(n,"../static"),ei(n,"../../static"),ei(n,"static")];for(let t of e)if(Fb(ei(t,"index.html")))return t;return null}var pd=l(()=>{"use strict"});var Kb={};import"reflect-metadata";import{existsSync as Jb}from"node:fs";import{Logger as Ub}from"@nestjs/common";import{NestFactory as Mb}from"@nestjs/core";async function Wb(){let n=await Mb.create(Yo);n.enableCors(),n.setGlobalPrefix("api"),Zp(n);let e=ld(),t=e?cd(e):null;e&&t&&Jb(t)?(ti.log(`Serving UI from ${e}`),n.use(id(e)),n.useGlobalFilters(new Zo(e))):ti.warn("No UI found (static/index.html missing). GET / will 404; /api still works. Rebuild with `npm run build:release` before publishing.");let r=Number(process.env.PORT??3e3);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`Invalid PORT: ${process.env.PORT}`);let o=await la(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?ti.warn(`Port ${r} is in use; listening on ${o} instead`):ti.log(`Listening on http://localhost:${o}`);return}catch(s){if(!td(s))throw s;o=await la(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var ti,dd=l(()=>{"use strict";Xp();ed();nd();ud();pd();ti=new Ub("Bootstrap");Wb()});import{readFileSync as Hb}from"node:fs";function Vb(){let n=Hb(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var ni=process.argv.slice(2);ni.includes("--version")||ni.includes("-v")?console.log(Vb()):ni.includes("--help")||ni.includes("-h")?console.log(["Usage: knoflows [options]","","Starts the knoflows engine (REST API + bundled web client).","","Options:"," -v, --version Print the engine version and exit"," -h, --help Print this message and exit","","Environment:"," PORT Preferred HTTP port (default 3000). If taken, the next free port is used."," KNO_SQLITE_PATH SQLite file path, or :memory: for an ephemeral database"].join(`
123
+ `)):await Promise.resolve().then(()=>(dd(),Kb));