@knoflows/engine 0.1.1-alpha.0 → 0.1.1-alpha.2

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 (70) hide show
  1. package/dist/engine.js +31 -19
  2. package/dist/migrations/20260923070000_local_repo_default_reviewers/migration.sql +1 -0
  3. package/dist/migrations/20260923072051_hard_beast/migration.sql +2 -0
  4. package/dist/migrations/20260923072051_hard_beast/snapshot.json +1408 -0
  5. package/package.json +4 -4
  6. package/static/assets/i18n/en.json +23 -0
  7. package/static/assets/i18n/es.json +23 -0
  8. package/static/chunk-5P9quDD0.js +1 -0
  9. package/static/chunk-B1I44qNh.js +1 -0
  10. package/static/{chunk-BHko4hHm.js → chunk-B67hwr1X.js} +1 -1
  11. package/static/{chunk-CGHIKxZG.js → chunk-B7mctPQM.js} +1 -1
  12. package/static/{chunk-EDwdt-Wk.js → chunk-BAPXVTBt.js} +1 -1
  13. package/static/chunk-BNQus_d_.js +1 -0
  14. package/static/chunk-Bh5et471.js +1 -0
  15. package/static/{chunk--EZIkevK.js → chunk-BidviQhN.js} +1 -1
  16. package/static/chunk-BldTY6RI.js +1 -0
  17. package/static/chunk-BmEXmF8m.js +1 -0
  18. package/static/chunk-BqhxU3er.js +1 -0
  19. package/static/{chunk-Det50scT.js → chunk-Bv65hEw_.js} +1 -1
  20. package/static/{chunk-Dm_EWkUz.js → chunk-C07s4-rF.js} +1 -1
  21. package/static/chunk-C5eZIOiF.js +1 -0
  22. package/static/{chunk-BRAytoQl.js → chunk-C61nx2gP.js} +1 -1
  23. package/static/{chunk-DbQy6dR8.js → chunk-CI75Yj8J.js} +1 -1
  24. package/static/chunk-CNip9Ktj.js +1 -0
  25. package/static/chunk-CP6elnGc.js +1 -0
  26. package/static/{chunk-YU-Bg77r.js → chunk-Cf14heGp.js} +1 -1
  27. package/static/chunk-CiB-X52X.js +1 -0
  28. package/static/chunk-Cj5izLCS.js +1 -0
  29. package/static/{chunk-BIJScqTM.js → chunk-CxnyhsKe.js} +1 -1
  30. package/static/chunk-CyvupcYz.js +1 -0
  31. package/static/{chunk-CoQPYpxp.js → chunk-D1sSb3lO.js} +1 -1
  32. package/static/{chunk-iIEmH_ui.js → chunk-D5BPM_KC.js} +1 -1
  33. package/static/{chunk-D-ueyYEC.js → chunk-D9f8Ltay.js} +3 -3
  34. package/static/{chunk-DdDI9wRc.js → chunk-DBtN2lWe.js} +3 -3
  35. package/static/chunk-DD_o_6mU.js +1 -0
  36. package/static/chunk-DRe_kA_l.js +1 -0
  37. package/static/{chunk-BcDRgzYZ.js → chunk-Dt7AgNFd.js} +1 -1
  38. package/static/chunk-Dxa2JdVP.js +1 -0
  39. package/static/{chunk-CtiubhW7.js → chunk-DyGh8J3-.js} +1 -1
  40. package/static/chunk-IZZsw-Ul.js +1 -0
  41. package/static/{chunk-vINo5yVD.js → chunk-MciiAFro.js} +1 -1
  42. package/static/{chunk-CJWR0gwk.js → chunk-RWVebRsq.js} +1 -1
  43. package/static/chunk-doY5ozP9.js +1 -0
  44. package/static/{chunk-8ezEUcxN.js → chunk-g20-BKKx.js} +6 -6
  45. package/static/chunk-lPfYUUfU.js +1 -0
  46. package/static/chunk-vnmh6IU3.js +1 -0
  47. package/static/chunk-zWWkMLc1.js +1 -0
  48. package/static/index.html +1 -1
  49. package/static/{main-3VZRFHGG.js → main-GFNB573R.js} +1 -1
  50. package/static/chunk-B17yZLWe.js +0 -1
  51. package/static/chunk-B8OjWpOp.js +0 -1
  52. package/static/chunk-BKYaECRn.js +0 -1
  53. package/static/chunk-BLN4QkSi.js +0 -1
  54. package/static/chunk-BaLWULJh.js +0 -1
  55. package/static/chunk-Bok52e_k.js +0 -1
  56. package/static/chunk-BowAQ7m9.js +0 -1
  57. package/static/chunk-Bz7bE4tT.js +0 -1
  58. package/static/chunk-C7P7hUiX.js +0 -1
  59. package/static/chunk-CAxHAuhV.js +0 -1
  60. package/static/chunk-CZA-kp5w.js +0 -1
  61. package/static/chunk-CwEMAptL.js +0 -1
  62. package/static/chunk-D1355dNd.js +0 -1
  63. package/static/chunk-D8qyjd0z.js +0 -1
  64. package/static/chunk-DOAz4S6b.js +0 -1
  65. package/static/chunk-DoJknvak.js +0 -1
  66. package/static/chunk-DrncP2Qx.js +0 -1
  67. package/static/chunk-IjKs-6Cl.js +0 -1
  68. package/static/chunk-LPXHXTnJ.js +0 -1
  69. package/static/chunk-SiaN7xSQ.js +0 -1
  70. package/static/chunk-bSS_wejP.js +0 -1
package/dist/engine.js CHANGED
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env node
2
- var l=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as yd,Get as gd}from"@nestjs/common";var fa,ri,vn,ma=l(()=>{"use strict";fa=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)},vn=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};fa([gd(),ri("design:type",Function),ri("design:paramtypes",[]),ri("design:returntype",Object)],vn.prototype,"getHealth",null);vn=fa([yd("health")],vn)});import{Module as bd}from"@nestjs/common";var wd,tr,ha=l(()=>{"use strict";wd=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=wd([bd({})],tr)});import{Module as xd}from"@nestjs/common";var Sd,nr,ya=l(()=>{"use strict";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},nr=class{};nr=Sd([xd({})],nr)});var jn,oi=l(()=>{"use strict";jn=Symbol("NOTIFICATION_PROVIDER")});var rr,ga=l(()=>{"use strict";rr=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});import{existsSync as wa}from"node:fs";import{dirname as vd,join as In}from"node:path";import{fileURLToPath as jd}from"node:url";function _n(){let n=vd(jd(import.meta.url)),e=In(n,"../data"),t=In(n,"../../data");return wa(In(e,"kno.db"))?e:wa(In(t,"kno.db"))?t:e}function ba(){return In(_n(),"kno.db")}var or=l(()=>{"use strict"});import{createCipheriv as Id,createDecipheriv as _d,randomBytes as Sa}from"node:crypto";import{mkdir as xa,readFile as va,writeFile as ja}from"node:fs/promises";import{join as si}from"node:path";function Gt(n){return`kno.${n}.apiKey`}function kd(n){return si(n,"secrets")}function _a(n){return new ai(kd(n.dataDir),n.keyring)}function Ad(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,Ia,Pd,ii,Ed,Rd,ai,oe,Ce=l(()=>{"use strict";ir="kno-flows";Ia="aes-256-gcm",Pd=12,ii=32,Ed="master.key",Rd="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 Ad(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 va(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 xa(this.secretsDir,{recursive:!0}),await ja(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=Sa(Pd),o=Id(Ia,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=_d(Ia,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 xa(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await va(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=Sa(ii);return await ja(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return si(this.secretsDir,Rd)}masterKeyPath(){return si(this.secretsDir,Ed)}};oe=Symbol("SECRET_STORE")});import{Module as Td}from"@nestjs/common";import{mkdirSync as $d}from"node:fs";var Cd,Pa,Qt,ui=l(()=>{"use strict";or();Ce();Cd=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},Pa=_n();$d(Pa,{recursive:!0});Qt=class{};Qt=Cd([Td({providers:[{provide:oe,useFactory:()=>_a({dataDir:Pa})}],exports:[oe]})],Qt)});import{index as Od,sqliteTable as qd,text as Te}from"drizzle-orm/sqlite-core";var rt,li=l(()=>{"use strict";rt=qd("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=>[Od("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as Ea,integer as Dd,sqliteTable as Bd,text as ot}from"drizzle-orm/sqlite-core";var $e,pi=l(()=>{"use strict";$e=Bd("subject_views",{id:ot("id").primaryKey(),name:ot("name").notNull(),subjectType:ot("subject_type").$type().notNull(),workflowId:ot("workflow_id").notNull(),query:ot("query",{mode:"json"}).$type().notNull(),description:ot("description"),queryTemplate:ot("query_template",{mode:"json"}).$type(),providerInstanceId:ot("provider_instance_id").notNull().default(""),order:Dd("order").notNull().default(0)},n=>[Ea("subject_views_subject_type_idx").on(n.subjectType),Ea("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as Ra,integer as Fd,sqliteTable as Nd,text as Oe}from"drizzle-orm/sqlite-core";var it,sr=l(()=>{"use strict";it=Nd("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:Fd("notification_sent",{mode:"boolean"}).notNull(),createdAt:Oe("created_at").notNull(),completedAt:Oe("completed_at")},n=>[Ra("job_batches_workflow_id_idx").on(n.workflowId),Ra("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as ar,integer as Ld,sqliteTable as Jd,text as U}from"drizzle-orm/sqlite-core";var H,Pn=l(()=>{"use strict";sr();H=Jd("jobs",{id:U("id").primaryKey(),workflowId:U("workflow_id").notNull(),status:U("status").$type().notNull(),selection:U("selection",{mode:"json"}).$type(),batchId:U("batch_id").references(()=>it.id),parentJobId:U("parent_job_id"),parentStepExecutionId:U("parent_step_execution_id"),fanOutIndex:Ld("fan_out_index"),retryOf:U("retry_of"),workflowSnapshot:U("workflow_snapshot",{mode:"json"}).$type(),context:U("context",{mode:"json"}).$type().notNull(),worktreePath:U("worktree_path"),branch:U("branch"),worktreeDeletedAt:U("worktree_deleted_at"),currentStepId:U("current_step_id"),currentStepExecutionId:U("current_step_execution_id"),createdAt:U("created_at").notNull(),updatedAt:U("updated_at").notNull(),completedAt:U("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 Md,text as En}from"drizzle-orm/sqlite-core";var qe,di=l(()=>{"use strict";Pn();qe=Md("job_subjects",{id:En("id").primaryKey(),jobId:En("job_id").notNull().references(()=>H.id),subjectType:En("subject_type").$type().notNull(),subjectId:En("subject_id").notNull(),snapshot:En("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 Aa,integer as Ud,sqliteTable as Wd,text as ue}from"drizzle-orm/sqlite-core";var Pt,fi=l(()=>{"use strict";Pn();Pt=Wd("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(()=>Pt.id),iterationIndex:Ud("iteration_index")},n=>[Aa("job_step_executions_job_id_idx").on(n.jobId),Aa("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as Kd,integer as Hd,sqliteTable as Vd,text as st}from"drizzle-orm/sqlite-core";var at,mi=l(()=>{"use strict";at=Vd("schedules",{id:st("id").primaryKey(),viewId:st("view_id").notNull(),triggerType:st("trigger_type",{enum:["cron"]}).notNull(),cadence:st("cadence").notNull(),notificationOverride:st("notification_override",{mode:"json"}).$type(),missedFirePolicy:st("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:Hd("enabled",{mode:"boolean"}).notNull(),lastFiredAt:st("last_fired_at"),createdAt:st("created_at").notNull()},n=>[Kd("schedules_enabled_idx").on(n.enabled)])});import{integer as Gd,sqliteTable as Qd,text as Rn}from"drizzle-orm/sqlite-core";var De,hi=l(()=>{"use strict";De=Qd("workflow_shortcuts",{id:Rn("id").primaryKey(),name:Rn("name").notNull(),workflowId:Rn("workflow_id").notNull(),inputValues:Rn("input_values",{mode:"json"}).$type().notNull(),lastJobId:Rn("last_job_id"),order:Gd("order").notNull().default(0)})});import{sqliteTable as zd,text as kn}from"drizzle-orm/sqlite-core";var ct,yi=l(()=>{"use strict";ct=zd("context_files",{id:kn("id").primaryKey(),name:kn("name").notNull(),description:kn("description"),tier:kn("tier").$type().notNull(),path:kn("path").notNull()})});import{sqliteTable as Yd,text as Et}from"drizzle-orm/sqlite-core";var ut,gi=l(()=>{"use strict";ut=Yd("local_repositories",{id:Et("id").primaryKey(),name:Et("name").notNull(),localPath:Et("local_path").notNull(),worktreeBasePath:Et("worktree_base_path"),defaultBranch:Et("default_branch"),remoteProviderInstanceId:Et("remote_provider_instance_id"),remoteIdentifier:Et("remote_identifier")})});import{sqliteTable as Xd,text as Ca}from"drizzle-orm/sqlite-core";var An,zt,wi=l(()=>{"use strict";An="default",zt=Xd("settings",{id:Ca("id").primaryKey(),data:Ca("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Zd}from"drizzle-orm";var ef,Ta,$a=l(()=>{"use strict";li();pi();Pn();di();fi();sr();mi();hi();yi();gi();wi();ef={workflowDefinitions:rt,subjectViews:$e,jobs:H,jobSubjects:qe,jobStepExecutions:Pt,jobBatches:it,schedules:at,workflowShortcuts:De,contextFiles:ct,localRepositories:ut,settings:zt},Ta=Zd(ef,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 tf}from"drizzle-orm/node-sqlite";import{DatabaseSync as fx}from"node:sqlite";function Oa(n){return n.exec("PRAGMA foreign_keys = ON;"),tf({client:n,relations:Ta})}var qa=l(()=>{"use strict";$a()});import{existsSync as Da,readdirSync as nf}from"node:fs";import{dirname as rf,join as bi}from"node:path";import{fileURLToPath as of}from"node:url";function Ba(){let n=rf(of(import.meta.url)),e=[bi(n,"persistence/migrations"),bi(n,"migrations")];for(let t of e)if(sf(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function sf(n){return Da(n)?nf(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&Da(bi(n,e.name,"migration.sql"))):!1}var Fa=l(()=>{"use strict"});import{migrate as Na}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as af}from"drizzle-orm/migrator";function xi(n,e,t={}){let r=t.log??(()=>{}),o=Ba(),i=af({migrationsFolder:o});if(i.length===0)throw new be(`No SQL migrations in ${o}`);let s=uf(i),a=$n(n,Rt),u=cf.filter(x=>$n(n,x));if(!a&&u.length===0){Na(e,{migrationsFolder:o}),Si(n,s);return}if(!a){ff(n,s,r),hf(n,i),Si(n,s);return}mf(n,i);let c=Ja(n,s),p=Ma(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`);Na(e,{migrationsFolder:o}),Si(n,s)}function uf(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=lf(s);if(a){e.push(a);continue}let u=pf(s);if(u){r.push(u);continue}let c=df(s);c&&t.push(c)}return{tables:e,indexes:t,alterColumns:r}}function lf(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:Tn(a[1]),type:a[2]})}return{name:Tn(e[1]),createSql:`${n};`,columns:o}}function pf(n){let e=n.match(/^ALTER TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s+ADD(?:\s+COLUMN)?\s+(`[^`]+`|"[^"]+"|\w+)\s+(\w+)/i);return e?{table:Tn(e[1]),name:Tn(e[2]),type:e[3]}:null}function df(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:Tn(e[1]),sql:`${t};`}}function Tn(n){return n.replace(/^["`]|["`]$/g,"")}function Cn(n){return`\`${n.replace(/`/g,"")}\``}function ff(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(!$n(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 ${Cn(s.name)} ADD COLUMN ${Cn(u.name)} ${u.type}`),a.add(u.name),o.push(`${s.name}.${u.name}`))}for(let s of e.alterColumns)$n(n,s.table)&&(cr(n,s.table).includes(s.name)||(n.exec(`ALTER TABLE ${Cn(s.table)} ADD COLUMN ${Cn(s.name)} ${s.type}`),o.push(`${s.table}.${s.name}`)));for(let s of e.indexes)La(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 $n(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function La(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(${Cn(e)})`).all().map(r=>r.name)}function Ja(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(!$n(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)La(n,o.name)||t.push(`missing index '${o.name}'`);return t}function Si(n,e){let t=Ja(n,e);if(t.length>0)throw new be(`schema is incomplete after migrate (${t.join("; ")})`)}function Ma(n){let e=new Set(cr(n,Rt));if(!e.has("hash"))throw new be(`migrations table '${Rt}' is missing required columns`);if(!e.has("name"))throw new be(`migrations table '${Rt}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${Rt}`).all()}function mf(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of Ma(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 hf(n,e){n.exec(`
4
- CREATE TABLE IF NOT EXISTS ${Rt} (
2
+ var l=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as Gd,Get as Vd}from"@nestjs/common";var Da,Ii,Tn,Ba=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},Ii=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Tn=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};Da([Vd(),Ii("design:type",Function),Ii("design:paramtypes",[]),Ii("design:returntype",Object)],Tn.prototype,"getHealth",null);Tn=Da([Gd("health")],Tn)});import{Module as zd}from"@nestjs/common";var Qd,gr,Fa=l(()=>{"use strict";Qd=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},gr=class{};gr=Qd([zd({})],gr)});import{Module as Xd}from"@nestjs/common";var Yd,wr,Na=l(()=>{"use strict";Yd=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=Yd([Xd({})],wr)});var qn,_i=l(()=>{"use strict";qn=Symbol("NOTIFICATION_PROVIDER")});var br,La=l(()=>{"use strict";br=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});import{existsSync as Ja}from"node:fs";import{dirname as Zd,join as On}from"node:path";import{fileURLToPath as ef}from"node:url";function Dn(){let n=Zd(ef(import.meta.url)),e=On(n,"../data"),t=On(n,"../../data");return Ja(On(e,"kno.db"))?e:Ja(On(t,"kno.db"))?t:e}function Ua(){return On(Dn(),"kno.db")}var Sr=l(()=>{"use strict"});import{createCipheriv as tf,createDecipheriv as nf,randomBytes as Wa}from"node:crypto";import{mkdir as Ma,readFile as Ha,writeFile as Ka}from"node:fs/promises";import{join as Ri}from"node:path";function tn(n){return`kno.${n}.apiKey`}function af(n){return Ri(n,"secrets")}function Va(n){return new Ei(af(n.dataDir),n.keyring)}function cf(n){try{return n(vr,"__kno_probe__").getPassword(),!0}catch(e){return ki(e)}}function ki(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var vr,Ga,rf,ji,of,sf,Ei,ce,Oe=l(()=>{"use strict";vr="kno-flows";Ga="aes-256-gcm",rf=12,ji=32,of="master.key",sf="store.json",Ei=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(vr,e).getPassword();if(r!=null)return r}catch(r){ki(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(vr,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(vr,e).deletePassword()}catch(r){ki(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 cf(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 Ha(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 Ma(this.secretsDir,{recursive:!0}),await Ka(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=Wa(rf),o=tf(Ga,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=nf(Ga,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 Ma(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await Ha(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==ji)throw new Error(`Secret store master key at ${e} is not ${ji} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=Wa(ji);return await Ka(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return Ri(this.secretsDir,sf)}masterKeyPath(){return Ri(this.secretsDir,of)}};ce=Symbol("SECRET_STORE")});import{Module as lf}from"@nestjs/common";import{mkdirSync as pf}from"node:fs";var uf,Qa,nn,Pi=l(()=>{"use strict";Sr();Oe();uf=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},Qa=Dn();pf(Qa,{recursive:!0});nn=class{};nn=uf([lf({providers:[{provide:ce,useFactory:()=>Va({dataDir:Qa})}],exports:[ce]})],nn)});import{index as df,sqliteTable as ff,text as fe}from"drizzle-orm/sqlite-core";var ct,Ai=l(()=>{"use strict";ct=ff("workflow_definitions",{id:fe("id").primaryKey(),name:fe("name").notNull(),description:fe("description"),appliesTo:fe("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:fe("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:fe("input_schema",{mode:"json"}).$type().notNull(),steps:fe("steps",{mode:"json"}).$type().notNull(),notificationPolicy:fe("notification_policy",{mode:"json"}).$type().notNull(),sourceLibraryEntryId:fe("source_library_entry_id"),sourceSnapshot:fe("source_snapshot",{mode:"json"}).$type(),createdAt:fe("created_at").notNull(),updatedAt:fe("updated_at").notNull()},n=>[df("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as za,integer as mf,sqliteTable as hf,text as ut}from"drizzle-orm/sqlite-core";var De,Ci=l(()=>{"use strict";De=hf("subject_views",{id:ut("id").primaryKey(),name:ut("name").notNull(),subjectType:ut("subject_type").$type().notNull(),workflowId:ut("workflow_id").notNull(),query:ut("query",{mode:"json"}).$type().notNull(),description:ut("description"),queryTemplate:ut("query_template",{mode:"json"}).$type(),providerInstanceId:ut("provider_instance_id").notNull().default(""),order:mf("order").notNull().default(0)},n=>[za("subject_views_subject_type_idx").on(n.subjectType),za("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as Ya,integer as yf,sqliteTable as gf,text as Be}from"drizzle-orm/sqlite-core";var lt,xr=l(()=>{"use strict";lt=gf("job_batches",{id:Be("id").primaryKey(),workflowId:Be("workflow_id").notNull(),selection:Be("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:Be("resolved_subjects",{mode:"json"}).$type().notNull(),status:Be("status",{enum:["running","completed","completed_with_issues","failed","cancelled"]}).notNull(),triggeredBy:Be("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:Be("schedule_id"),notificationOverride:Be("notification_override",{mode:"json"}).$type(),notificationSent:yf("notification_sent",{mode:"boolean"}).notNull(),createdAt:Be("created_at").notNull(),completedAt:Be("completed_at")},n=>[Ya("job_batches_workflow_id_idx").on(n.workflowId),Ya("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as Ir,integer as wf,sqliteTable as bf,text as W}from"drizzle-orm/sqlite-core";var K,Bn=l(()=>{"use strict";xr();K=bf("jobs",{id:W("id").primaryKey(),workflowId:W("workflow_id").notNull(),status:W("status").$type().notNull(),selection:W("selection",{mode:"json"}).$type(),batchId:W("batch_id").references(()=>lt.id),parentJobId:W("parent_job_id"),parentStepExecutionId:W("parent_step_execution_id"),fanOutIndex:wf("fan_out_index"),retryOf:W("retry_of"),workflowSnapshot:W("workflow_snapshot",{mode:"json"}).$type(),context:W("context",{mode:"json"}).$type().notNull(),worktreePath:W("worktree_path"),branch:W("branch"),worktreeDeletedAt:W("worktree_deleted_at"),currentStepId:W("current_step_id"),currentStepExecutionId:W("current_step_execution_id"),createdAt:W("created_at").notNull(),updatedAt:W("updated_at").notNull(),completedAt:W("completed_at")},n=>[Ir("jobs_workflow_id_idx").on(n.workflowId),Ir("jobs_status_idx").on(n.status),Ir("jobs_batch_id_idx").on(n.batchId),Ir("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as Xa,sqliteTable as Sf,text as Fn}from"drizzle-orm/sqlite-core";var Fe,$i=l(()=>{"use strict";Bn();Fe=Sf("job_subjects",{id:Fn("id").primaryKey(),jobId:Fn("job_id").notNull().references(()=>K.id),subjectType:Fn("subject_type").$type().notNull(),subjectId:Fn("subject_id").notNull(),snapshot:Fn("snapshot",{mode:"json"}).$type().notNull()},n=>[Xa("job_subjects_job_id_idx").on(n.jobId),Xa("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as Za,integer as vf,sqliteTable as xf,text as me}from"drizzle-orm/sqlite-core";var Tt,Ti=l(()=>{"use strict";Bn();Tt=xf("job_step_executions",{id:me("id").primaryKey(),jobId:me("job_id").notNull().references(()=>K.id),stepDefinitionId:me("step_definition_id").notNull(),type:me("type").$type().notNull(),status:me("status").$type().notNull(),startedAt:me("started_at"),completedAt:me("completed_at"),output:me("output",{mode:"json"}).$type(),error:me("error"),failureDetails:me("failure_details",{mode:"json"}).$type(),childJobIds:me("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:me("parent_step_execution_id").references(()=>Tt.id),iterationIndex:vf("iteration_index")},n=>[Za("job_step_executions_job_id_idx").on(n.jobId),Za("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as If,integer as _f,sqliteTable as jf,text as pt}from"drizzle-orm/sqlite-core";var dt,qi=l(()=>{"use strict";dt=jf("schedules",{id:pt("id").primaryKey(),viewId:pt("view_id").notNull(),triggerType:pt("trigger_type",{enum:["cron"]}).notNull(),cadence:pt("cadence").notNull(),notificationOverride:pt("notification_override",{mode:"json"}).$type(),missedFirePolicy:pt("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:_f("enabled",{mode:"boolean"}).notNull(),lastFiredAt:pt("last_fired_at"),createdAt:pt("created_at").notNull()},n=>[If("schedules_enabled_idx").on(n.enabled)])});import{integer as Rf,sqliteTable as Ef,text as Nn}from"drizzle-orm/sqlite-core";var Ne,Oi=l(()=>{"use strict";Ne=Ef("workflow_shortcuts",{id:Nn("id").primaryKey(),name:Nn("name").notNull(),workflowId:Nn("workflow_id").notNull(),inputValues:Nn("input_values",{mode:"json"}).$type().notNull(),lastJobId:Nn("last_job_id"),order:Rf("order").notNull().default(0)})});import{sqliteTable as kf,text as Ln}from"drizzle-orm/sqlite-core";var ft,Di=l(()=>{"use strict";ft=kf("context_files",{id:Ln("id").primaryKey(),name:Ln("name").notNull(),description:Ln("description"),tier:Ln("tier").$type().notNull(),path:Ln("path").notNull()})});import{sqliteTable as Pf,text as mt}from"drizzle-orm/sqlite-core";var ht,Bi=l(()=>{"use strict";ht=Pf("local_repositories",{id:mt("id").primaryKey(),name:mt("name").notNull(),localPath:mt("local_path").notNull(),worktreeBasePath:mt("worktree_base_path"),defaultBranch:mt("default_branch"),remoteProviderInstanceId:mt("remote_provider_instance_id"),remoteIdentifier:mt("remote_identifier"),remoteDefaultReviewers:mt("remote_default_reviewers")})});import{sqliteTable as Af,text as ec}from"drizzle-orm/sqlite-core";var Jn,rn,Fi=l(()=>{"use strict";Jn="default",rn=Af("settings",{id:ec("id").primaryKey(),data:ec("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Cf}from"drizzle-orm";var $f,tc,nc=l(()=>{"use strict";Ai();Ci();Bn();$i();Ti();xr();qi();Oi();Di();Bi();Fi();$f={workflowDefinitions:ct,subjectViews:De,jobs:K,jobSubjects:Fe,jobStepExecutions:Tt,jobBatches:lt,schedules:dt,workflowShortcuts:Ne,contextFiles:ft,localRepositories:ht,settings:rn},tc=Cf($f,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 Tf}from"drizzle-orm/node-sqlite";import{DatabaseSync as rx}from"node:sqlite";function rc(n){return n.exec("PRAGMA foreign_keys = ON;"),Tf({client:n,relations:tc})}var oc=l(()=>{"use strict";nc()});import{existsSync as ic,readdirSync as qf}from"node:fs";import{dirname as Of,join as Ni}from"node:path";import{fileURLToPath as Df}from"node:url";function sc(){let n=Of(Df(import.meta.url)),e=[Ni(n,"persistence/migrations"),Ni(n,"migrations")];for(let t of e)if(Bf(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function Bf(n){return ic(n)?qf(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&ic(Ni(n,e.name,"migration.sql"))):!1}var ac=l(()=>{"use strict"});import{migrate as cc}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as Ff}from"drizzle-orm/migrator";function Ji(n,e,t={}){let r=t.log??(()=>{}),o=sc(),i=Ff({migrationsFolder:o});if(i.length===0)throw new Ie(`No SQL migrations in ${o}`);let s=Lf(i),a=Mn(n,qt),u=Nf.filter(v=>Mn(n,v));if(!a&&u.length===0){cc(e,{migrationsFolder:o}),Li(n,s);return}if(!a){Mf(n,s,r),Kf(n,i),Li(n,s);return}Hf(n,i);let c=lc(n,s),p=pc(n);if(p.length===0&&u.length>0)throw new Ie("migrations table exists but is empty while application tables are present \u2014 treating this as an interrupted update");let m=new Set(p.map(v=>v.name).filter(v=>v!=null&&v!==""));if(i.filter(v=>!m.has(v.name)).length===0&&c.length>0)throw new Ie(`migrations journal is present but the schema is incomplete (${c.join("; ")}) \u2014 treating this as an interrupted update`);cc(e,{migrationsFolder:o}),Li(n,s)}function Lf(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=Jf(s);if(a){e.push(a);continue}let u=Uf(s);if(u){r.push(u);continue}let c=Wf(s);c&&t.push(c)}return{tables:e,indexes:t,alterColumns:r}}function Jf(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:Wn(a[1]),type:a[2]})}return{name:Wn(e[1]),createSql:`${n};`,columns:o}}function Uf(n){let e=n.match(/^ALTER TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s+ADD(?:\s+COLUMN)?\s+(`[^`]+`|"[^"]+"|\w+)\s+(\w+)/i);return e?{table:Wn(e[1]),name:Wn(e[2]),type:e[3]}:null}function Wf(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:Wn(e[1]),sql:`${t};`}}function Wn(n){return n.replace(/^["`]|["`]$/g,"")}function Un(n){return`\`${n.replace(/`/g,"")}\``}function Mf(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(!Mn(n,s.name)){n.exec(s.createSql),r.push(s.name);continue}let a=new Set(_r(n,s.name));for(let u of s.columns)a.has(u.name)||(n.exec(`ALTER TABLE ${Un(s.name)} ADD COLUMN ${Un(u.name)} ${u.type}`),a.add(u.name),o.push(`${s.name}.${u.name}`))}for(let s of e.alterColumns)Mn(n,s.table)&&(_r(n,s.table).includes(s.name)||(n.exec(`ALTER TABLE ${Un(s.table)} ADD COLUMN ${Un(s.name)} ${s.type}`),o.push(`${s.table}.${s.name}`)));for(let s of e.indexes)uc(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 Mn(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function uc(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'index' AND name = ?").get(e)!=null}function _r(n,e){return n.prepare(`PRAGMA table_info(${Un(e)})`).all().map(r=>r.name)}function lc(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(!Mn(n,o)){t.push(`missing table '${o}'`);continue}let s=new Set(_r(n,o));for(let a of i)s.has(a)||t.push(`table '${o}' is missing column '${a}'`)}for(let o of e.indexes)uc(n,o.name)||t.push(`missing index '${o.name}'`);return t}function Li(n,e){let t=lc(n,e);if(t.length>0)throw new Ie(`schema is incomplete after migrate (${t.join("; ")})`)}function pc(n){let e=new Set(_r(n,qt));if(!e.has("hash"))throw new Ie(`migrations table '${qt}' is missing required columns`);if(!e.has("name"))throw new Ie(`migrations table '${qt}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${qt}`).all()}function Hf(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of pc(n)){if(r.name==null||r.name==="")throw new Ie("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 Ie(`database has unknown migration '${r.name}' that is not in this Engine build`);if(r.hash!=null&&r.hash!==o.hash)throw new Ie(`migration '${r.name}' hash does not match this Engine build \u2014 treating this as a corrupt or interrupted update`)}}function Kf(n,e){n.exec(`
4
+ CREATE TABLE IF NOT EXISTS ${qt} (
5
5
  id INTEGER PRIMARY KEY,
6
6
  hash text NOT NULL,
7
7
  created_at numeric,
8
8
  name text,
9
9
  applied_at TEXT
10
10
  )
11
- `);let t=n.prepare(`INSERT INTO ${Rt} (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 Rt,be,cf,Ua=l(()=>{"use strict";Fa();Rt="__drizzle_migrations",be=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},cf=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","context_files","local_repositories","settings"]});import{Injectable as wf,Logger as bf}from"@nestjs/common";import{mkdirSync as Sf}from"node:fs";import{dirname as xf}from"node:path";import{DatabaseSync as Wa}from"node:sqlite";var yf,gf,vi,Z,Ka=l(()=>{"use strict";or();qa();Ua();yf=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},gf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=vi=class{logger=new bf(vi.name);sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??ba();t===":memory:"?this.sqlite=new Wa(":memory:"):(Sf(xf(t),{recursive:!0}),this.sqlite=new Wa(t)),this.db=Oa(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=yf([wf(),gf("design:paramtypes",[])],Z)});import{Injectable as If}from"@nestjs/common";import{eq as Ha}from"drizzle-orm";var vf,jf,D,kt=l(()=>{"use strict";li();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)},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(rt).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(rt).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(Ha(rt.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(rt).where(Ha(rt.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=vf([If(),jf("design:paramtypes",[Object,Function])],D)});import{Injectable as Ef}from"@nestjs/common";import{eq as ji}from"drizzle-orm";var _f,Pf,Va,le,ur=l(()=>{"use strict";pi();_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)},Va=["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=Va.indexOf(t.subjectType)-Va.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=_f([Ef(),Pf("design:paramtypes",[Object])],le)});import{Injectable as Af}from"@nestjs/common";import{and as Cf,desc as Tf,eq as On,inArray as $f}from"drizzle-orm";import{randomUUID as Of}from"node:crypto";function qf(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function Df(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function Qa(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(...Qa(n,s.stepExecutions,i.id,s.index));return o}function Bf(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=>Ga(p,t(p.id)));return{index:a,stepExecutions:c,startedAt:Ff(c),...Lf(c)?{completedAt:Nf(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Ga(o,t(o.id)))}function Ga(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 Ff(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 Nf(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function Lf(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function Jf(n){return n==="completed"||n==="failed"||n==="cancelled"}var Rf,kf,Y,qn=l(()=>{"use strict";Pn();di();fi();Rf=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},kf=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(On(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=>Jf(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,On(qe.jobId,H.id)).where(Cf(On(H.workflowId,e),$f(qe.subjectId,t))).orderBy(Tf(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(On(qe.jobId,e));let r=qf(t);r.length!==0&&await this.db.insert(qe).values(r.map(o=>({id:Of(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(Pt).where(On(Pt.jobId,e));let r=Qa(e,t);r.length!==0&&await this.db.insert(Pt).values(r)}toDomain(e,t,r){let o=Df(t.map(s=>s.snapshot)),i=Bf(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=Rf([Af(),kf("design:paramtypes",[Object,Function])],Y)});import{Injectable as Wf}from"@nestjs/common";import{eq as Kf}from"drizzle-orm";var Mf,Uf,pe,lr=l(()=>{"use strict";sr();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},Uf=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(it).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(it).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(Kf(it.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=Mf([Wf(),Uf("design:paramtypes",[Object])],pe)});import{Injectable as Gf}from"@nestjs/common";import{eq as za}from"drizzle-orm";var Hf,Vf,Ke,Ii=l(()=>{"use strict";mi();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){return await this.db.insert(at).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(at).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(za(at.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(at).where(za(at.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}}};Ke=Hf([Gf(),Vf("design:paramtypes",[Object])],Ke)});import{Injectable as Yf}from"@nestjs/common";import{eq as _i}from"drizzle-orm";var Qf,zf,He,Pi=l(()=>{"use strict";hi();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)},He=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}:{}}}};He=Qf([Yf(),zf("design:paramtypes",[Object])],He)});import{Injectable as em}from"@nestjs/common";import{eq as Ya}from"drizzle-orm";var Xf,Zf,de,pr=l(()=>{"use strict";yi();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)},de=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(ct).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(ct).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(Ya(ct.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(ct).where(Ya(ct.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=Xf([em(),Zf("design:paramtypes",[Object])],de)});import{Injectable as rm}from"@nestjs/common";import{eq as Xa}from"drizzle-orm";var tm,nm,fe,dr=l(()=>{"use strict";gi();tm=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=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(ut).values(this.toRow(e)),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);if(!r)return null;let{remoteRepo:o,...i}=t,s={...r,...i,id:e};return o===null?delete s.remoteRepo:o!==void 0&&(s.remoteRepo=o),await this.db.update(ut).set(this.toRow(s)).where(Xa(ut.id,e)),this.get(e)}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(ut).where(Xa(ut.id,e)),!0):!1}toRow(e){return{id:e.id,name:e.name,localPath:e.localPath,worktreeBasePath:e.worktreeBasePath??null,defaultBranch:e.defaultBranch??null,remoteProviderInstanceId:e.remoteRepo?.providerInstanceId??null,remoteIdentifier:e.remoteRepo?.identifier??null}}toDomain(e){let t=e.remoteProviderInstanceId?.trim()??"",r=e.remoteIdentifier?.trim()??"";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}:{},...t&&r?{remoteRepo:{providerInstanceId:t,identifier:r}}:{}}}};fe=tm([rm(),nm("design:paramtypes",[Object])],fe)});import{z as A}from"zod";var Za,ec,tc,Ei,fr,nc,Ve,Ri=l(()=>{"use strict";Za=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()}),ec=A.object({id:A.string().min(1),label:A.string().min(1),params:A.array(Za)}),tc=A.object({actionId:A.string().min(1),label:A.string().min(1),params:A.array(Za)}),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())}),nc=A.object({query:A.record(A.string(),A.unknown())}),Ve=10});import{z as ee}from"zod";var ie,mr,hr,yr,gr,wr=l(()=>{"use strict";Ri();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 rc=l(()=>{"use strict";wr()});var oc=l(()=>{"use strict";Ri()});function ki(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function ic(n,e){let t=e instanceof Set?e:new Set(e),r=ki(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function sc(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&sc(t.steps,e)}function ac(n){let e=[];sc(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 cc(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 uc(n){return typeof n=="object"&&typeof n.source=="string"}function um(n){return!!(n.path?.trim()||n.pattern?.trim())}function lm(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 om,Dn,im,Ge,Be,lc,pc,dc,fc,mc,hc,sm,yc,gc,am,cm,wc,br,bc,Bn,pm,dm,fm,mm,hm,ym,gm,wm,Sc,lt,xc=l(()=>{"use strict";wr();Ai();om=f.enum(["on_fail","on_complete","on_needs_input"]),Dn=f.object({triggers:f.array(om),messageTemplate:f.string().optional()}),im=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()}),Ge=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()})]),lc=Be,pc=f.object({type:f.literal("agent"),id:f.string().min(1),name:Ge,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()}),dc=f.object({type:f.literal("interaction"),id:f.string().min(1),name:Ge,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()}),fc=f.object({type:f.literal("shell"),id:f.string().min(1),name:Ge,command:f.string().min(1),condition:Be.optional()}),mc=f.object({type:f.literal("git"),id:f.string().min(1),name:Ge,operation:f.enum(["create_worktree","checkout","create_branch","commit","push"]),params:f.record(f.string(),f.unknown()),condition:Be.optional()}),hc=f.object({type:f.literal("provider_action"),id:f.string().min(1),name:Ge,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()}),sm=f.union([f.literal("selection"),f.object({source:f.string().min(1)})]),yc=f.object({type:f.literal("sub_workflow"),id:f.string().min(1),name:Ge,workflowId:f.string().min(1),forEach:sm,condition:Be.optional()}),gc=f.discriminatedUnion("action",[f.object({action:f.literal("fail")}),f.object({action:f.literal("continue")}),f.object({action:f.literal("ask_human")})]),am=f.object({type:f.literal("loop"),id:f.string().min(1),name:Ge,steps:f.array(f.lazy(()=>br)),until:lc,maxIterations:f.number().int().nonnegative(),onMaxIterations:gc,condition:Be.optional()}),cm=f.enum(["fail","empty","ask_human"]),wc=f.object({type:f.literal("extract"),id:f.string().min(1),name:Ge,source:f.string(),path:f.string().optional(),pattern:f.string().optional(),onNoMatch:cm,condition:Be.optional()}),br=f.lazy(()=>f.discriminatedUnion("type",[mc,hc,fc,pc,dc,yc,am,wc])),bc=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(im),steps:f.array(br),notificationPolicy:Dn}),Bn=bc.superRefine((n,e)=>{let t=ac(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"&&!um(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=lm(n.steps,r);o&&e.addIssue({code:"custom",path:["steps"],message:o})}});pm=pc.extend({id:f.string().min(1).optional()}),dm=dc.extend({id:f.string().min(1).optional()}),fm=fc.extend({id:f.string().min(1).optional()}),mm=mc.extend({id:f.string().min(1).optional()}),hm=hc.extend({id:f.string().min(1).optional()}),ym=yc.extend({id:f.string().min(1).optional()}),gm=f.object({type:f.literal("loop"),id:f.string().min(1).optional(),name:Ge,steps:f.array(f.lazy(()=>Sc)),until:lc,maxIterations:f.number().int().nonnegative(),onMaxIterations:gc,condition:Be.optional()}),wm=wc.extend({id:f.string().min(1).optional()}),Sc=f.lazy(()=>f.discriminatedUnion("type",[mm,hm,fm,pm,dm,ym,gm,wm])),lt=bc.omit({id:!0,steps:!0}).extend({id:f.string().min(1).optional(),steps:f.array(Sc)})});function bm(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 vc(n,e){return{condition:n,inputs:bm(n,e)}}var jc=l(()=>{"use strict"});function Ti(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function Ic(n,e){return Ti(n).includes(e)}var $i=l(()=>{"use strict"});var _c=l(()=>{"use strict"});function Pc(n,e="none"){switch(n.type){case"agent":return xm(n.outputFormat);case"shell":return{isScalar:!1,fields:["exitCode","stdout","stderr"]};case"git":return jm(n);case"provider_action":return vm(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 Ec(n,e){let t=[];return Rc(n,e,t,!1)?t:[]}function xm(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 vm(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:Fn[t]};let r=Ti(e),o=[],i=new Set;for(let s of r)for(let a of Fn[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:[...Sm],isArray:!0};case"get_content":return{isScalar:!0};case"post_comment":case"update_status":return{isScalar:!1,fields:[]}}}function jm(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 Im(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 Rc(n,e,t,r){for(let o of n){if(Im(o,e))return!0;if(o.type==="loop"&&Array.isArray(o.steps)){if(Rc(o.steps,e,t,!0))return!0}else t.push({step:o,inLoop:r})}return!1}var Fn,Sm,Oi=l(()=>{"use strict";$i();Fn={ticket:["id","source","title","description","status","assignee","url"],pull_request:["id","source","title","description","repoIdentifier","sourceBranch","targetBranch","author","url"],documentation:["id","source","title","url"]},Sm=["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 _m(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 Pm(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 Em(n,e){return Ec(n,e).map(t=>t.step).filter(t=>t.type==="agent"&&"outputFormat"in t&&t.outputFormat==="comment_suggestions")}function Ac(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(Em(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=_m(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 Pm(i)}function Cc(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 Tc=l(()=>{"use strict";Oi()});var $c=l(()=>{"use strict";xc();jc();Ai();$i();_c();Oi();Tc()});import{z as At}from"zod";var Rm,xr,vr,jr,Oc=l(()=>{"use strict";Rm=At.enum(["user","organization","project"]),xr=At.object({id:At.string().min(1),name:At.string().min(1),description:At.string().optional(),tier:Rm,path:At.string().min(1)}),vr=xr.omit({id:!0}).extend({id:At.string().min(1).optional()}),jr=xr.partial().omit({id:!0})});var qc=l(()=>{"use strict";Oc()});import{z as Fe}from"zod";var Dc,Ir,_r,Pr,Bc=l(()=>{"use strict";Dc=Fe.object({providerInstanceId:Fe.string().min(1),identifier:Fe.string().min(1)}),Ir=Fe.object({id:Fe.string().min(1),name:Fe.string().min(1),localPath:Fe.string().min(1),worktreeBasePath:Fe.string().min(1).optional(),defaultBranch:Fe.string().min(1).optional(),remoteRepo:Dc.optional()}),_r=Ir.omit({id:!0}).extend({id:Fe.string().min(1).optional()}),Pr=Ir.partial().omit({id:!0}).extend({remoteRepo:Dc.nullable().optional()})});var Fc=l(()=>{"use strict";Bc()});var Nc=l(()=>{"use strict"});function km(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 Lc(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=km(r);if(!o)return null;t.push(o)}return t}function Jc(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 Mc=l(()=>{"use strict"});var Uc=l(()=>{"use strict";Nc();Mc()});var Wc=l(()=>{"use strict"});var Kc=l(()=>{"use strict";Wc()});import{z as te}from"zod";var Yt,Hc=l(()=>{"use strict";Yt=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 Vc=l(()=>{"use strict";Hc()});import{z as me}from"zod";var Er,Rr,kr,Ar,Gc=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()}),Rr=Er.omit({order:!0}),kr=Er.partial().omit({id:!0,order:!0}),Ar=me.object({shortcutIds:me.array(me.string().min(1)).min(1)})});var Qc=l(()=>{"use strict";Gc()});import{z as S}from"zod";function ru(n){return tu.safeParse(n).success}function Ct(n){return n.kind==="subject"}function Ne(n){return n.kind==="agent"}function iu(n){return n.maxConcurrent??Nn}var Am,zc,Yc,Xc,Nn,Zc,Cr,Tr,$r,Or,qr,Dr,eu,tu,Br,nu,ou,su=l(()=>{"use strict";wr();Am=S.enum(["jira","bitbucket","github","confluence","manual"]),zc=S.enum(["claude","cursor"]),Yc={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()},Xc=S.object({...Yc,kind:S.literal("subject"),type:Am,subjectType:ie}),Nn=2,Zc=S.object({...Yc,kind:S.literal("agent"),type:zc,maxConcurrent:S.number().int().min(1).optional()}),Cr=S.discriminatedUnion("kind",[Xc,Zc]),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",[Xc.extend({defaultAgent:S.boolean().optional()}),Zc.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:zc,apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),eu=S.object({id:S.string().min(1),displayName:S.string().min(1)}),tu=S.enum(["jira","bitbucket","github","confluence","claude","cursor"]),Br=S.object({type:tu,config:S.record(S.string(),S.unknown()).optional(),apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),nu=S.object({success:S.boolean(),message:S.string().optional(),identityMismatch:S.boolean().optional()});ou={providerInstances:[]}});var au=l(()=>{"use strict";su()});var cu=l(()=>{"use strict"});function uu(n,e){switch(n){case"questionnaire":return qi(e);case"confirmation":return Cm(e);case"conversation":return Tm(e);case"comment_review":return $m(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 Cm(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 Tm(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 $m(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 lu=l(()=>{"use strict"});var pu=l(()=>{"use strict";cu();lu()});var C=l(()=>{"use strict";rc();oc();$c();qc();Fc();Uc();Kc();Vc();Qc();au();pu()});import{Injectable as Dm}from"@nestjs/common";import{eq as Bm}from"drizzle-orm";function Fm(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??ou.providerInstances).map(Nm),...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function Nm(n){return!Ne(n)||n.maxConcurrent!=null?n:{...n,maxConcurrent:Nn}}function du(n){return n.providerInstances!==void 0}var Om,qm,_,he=l(()=>{"use strict";C();wi();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)},_=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:An}});return Di(e?e.data:{})}async update(e){let t=Fm(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:An}})?await this.db.update(zt).set({data:t}).where(Bm(zt.id,An)):await this.db.insert(zt).values({id:An,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};_=Om([Dm(),qm("design:paramtypes",[Object])],_)});import{Module as Jm}from"@nestjs/common";var Lm,Mm,Le,Ln=l(()=>{"use strict";Ka();kt();ur();qn();lr();Ii();Pi();pr();dr();he();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},Mm=[D,le,Y,pe,Ke,He,de,fe,_],Le=class{};Le=Lm([Jm({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:Ke,useFactory:n=>new Ke(n.getDb()),inject:[Z]},{provide:He,useFactory:n=>new He(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:_,useFactory:n=>new _(n.getDb()),inject:[Z]}],exports:[Z,...Mm]})],Le)});import{Injectable as Km,Logger as Hm,Inject as mu}from"@nestjs/common";async function hu(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 Vm(n,e,t){let r=await hu(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 Um,Wm,fu,Bi,pt,Fi=l(()=>{"use strict";he();Ce();Um=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},Wm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fu=function(n,e){return function(t,r){e(t,r,n)}};pt=Bi=class{secrets;settings;logger=new Hm(Bi.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Vm(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return hu(this.secrets,e.providerInstances??[])}};pt=Bi=Um([Km(),fu(0,mu(oe)),fu(1,mu(_)),Wm("design:paramtypes",[Function,_])],pt)});function Fr(n,e=Gt(n)){let t=Ym[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function yu(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 Qm){let o=e.get(r);o?.length&&t.push(`## ${Gm[r]}
11
+ `);let t=n.prepare(`INSERT INTO ${qt} (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 qt,Ie,Nf,dc=l(()=>{"use strict";ac();qt="__drizzle_migrations",Ie=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},Nf=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","context_files","local_repositories","settings"]});import{Injectable as Qf,Logger as zf}from"@nestjs/common";import{mkdirSync as Yf}from"node:fs";import{dirname as Xf}from"node:path";import{DatabaseSync as fc}from"node:sqlite";var Gf,Vf,Ui,te,mc=l(()=>{"use strict";Sr();oc();dc();Gf=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)},te=Ui=class{logger=new zf(Ui.name);sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??Ua();t===":memory:"?this.sqlite=new fc(":memory:"):(Yf(Xf(t),{recursive:!0}),this.sqlite=new fc(t)),this.db=rc(this.sqlite),Ji(this.sqlite,this.db,{log:r=>this.logger.log(r)})}async onModuleInit(){Ji(this.sqlite,this.db,{log:e=>this.logger.log(e)})}getDb(){return this.db}getSqlite(){return this.sqlite}};te=Ui=Gf([Qf(),Vf("design:paramtypes",[])],te)});import{Injectable as tm}from"@nestjs/common";import{eq as hc}from"drizzle-orm";var Zf,em,D,Ot=l(()=>{"use strict";Ai();Zf=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},em=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(ct).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,sourceLibraryEntryId:e.sourceLibraryEntryId??null,sourceSnapshot:e.sourceSnapshot??null,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(ct).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,sourceLibraryEntryId:r.sourceLibraryEntryId??null,sourceSnapshot:r.sourceSnapshot??null,updatedAt:new Date().toISOString()}).where(hc(ct.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(ct).where(hc(ct.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,...e.sourceLibraryEntryId!=null?{sourceLibraryEntryId:e.sourceLibraryEntryId}:{},...e.sourceSnapshot!=null?{sourceSnapshot:e.sourceSnapshot}:{}}}};D=Zf([tm(),em("design:paramtypes",[Object,Function])],D)});import{Injectable as om}from"@nestjs/common";import{eq as Wi}from"drizzle-orm";var nm,rm,yc,he,jr=l(()=>{"use strict";Ci();nm=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},rm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},yc=["ticket","pull_request","documentation"],he=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert(De).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(De).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(Wi(De.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(De).set({order:o}).where(Wi(De.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(De).where(Wi(De.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=yc.indexOf(t.subjectType)-yc.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}:{}}}};he=nm([om(),rm("design:paramtypes",[Object])],he)});import{Injectable as am}from"@nestjs/common";import{and as cm,desc as um,eq as Hn,inArray as lm}from"drizzle-orm";import{randomUUID as pm}from"node:crypto";function dm(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function fm(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function wc(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(...wc(n,s.stepExecutions,i.id,s.index));return o}function mm(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=>gc(p,t(p.id)));return{index:a,stepExecutions:c,startedAt:hm(c),...gm(c)?{completedAt:ym(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>gc(o,t(o.id)))}function gc(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 hm(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 ym(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function gm(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function wm(n){return n==="completed"||n==="failed"||n==="cancelled"}var im,sm,Y,Kn=l(()=>{"use strict";Bn();$i();Ti();im=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},sm=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(K).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(K).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(Hn(K.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=>wm(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:Fe.subjectId,jobId:K.id,createdAt:K.createdAt}).from(Fe).innerJoin(K,Hn(Fe.jobId,K.id)).where(cm(Hn(K.workflowId,e),lm(Fe.subjectId,t))).orderBy(um(K.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(Fe).where(Hn(Fe.jobId,e));let r=dm(t);r.length!==0&&await this.db.insert(Fe).values(r.map(o=>({id:pm(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(Tt).where(Hn(Tt.jobId,e));let r=wc(e,t);r.length!==0&&await this.db.insert(Tt).values(r)}toDomain(e,t,r){let o=fm(t.map(s=>s.snapshot)),i=mm(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=im([am(),sm("design:paramtypes",[Object,Function])],Y)});import{Injectable as vm}from"@nestjs/common";import{eq as xm}from"drizzle-orm";var bm,Sm,ye,Rr=l(()=>{"use strict";xr();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},Sm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ye=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(lt).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(lt).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(xm(lt.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}:{}}}};ye=bm([vm(),Sm("design:paramtypes",[Object])],ye)});import{Injectable as jm}from"@nestjs/common";import{eq as bc}from"drizzle-orm";var Im,_m,ze,Mi=l(()=>{"use strict";qi();Im=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)},ze=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(dt).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(dt).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(bc(dt.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(dt).where(bc(dt.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}}};ze=Im([jm(),_m("design:paramtypes",[Object])],ze)});import{Injectable as km}from"@nestjs/common";import{eq as Hi}from"drizzle-orm";var Rm,Em,Ye,Ki=l(()=>{"use strict";Oi();Rm=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},Em=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ye=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(Ne).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(Ne).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(Hi(Ne.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(Ne).set({order:r}).where(Hi(Ne.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(Ne).where(Hi(Ne.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}:{}}}};Ye=Rm([km(),Em("design:paramtypes",[Object])],Ye)});import{Injectable as Cm}from"@nestjs/common";import{eq as Sc}from"drizzle-orm";var Pm,Am,ge,Er=l(()=>{"use strict";Di();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},Am=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ge=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(ft).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(ft).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(Sc(ft.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(ft).where(Sc(ft.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}:{}}}};ge=Pm([Cm(),Am("design:paramtypes",[Object])],ge)});import{Injectable as qm}from"@nestjs/common";import{eq as vc}from"drizzle-orm";function xc(n){if(!n?.length)return[];let e=new Set,t=[];for(let r of n){let o=r.trim();!o||e.has(o)||(e.add(o),t.push(o))}return t}function Om(n){if(n==null||n.trim()==="")return[];try{let e=JSON.parse(n);return Array.isArray(e)?xc(e.map(t=>String(t))):[]}catch{return[]}}var $m,Tm,X,Gn=l(()=>{"use strict";Bi();$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},Tm=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 create(e){return await this.db.insert(ht).values(this.toRow(e)),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);if(!r)return null;let{remoteRepo:o,...i}=t,s={...r,...i,id:e};return o===null?delete s.remoteRepo:o!==void 0&&(s.remoteRepo=o),await this.db.update(ht).set(this.toRow(s)).where(vc(ht.id,e)),this.get(e)}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(ht).where(vc(ht.id,e)),!0):!1}toRow(e){let t=xc(e.remoteRepo?.defaultReviewers);return{id:e.id,name:e.name,localPath:e.localPath,worktreeBasePath:e.worktreeBasePath??null,defaultBranch:e.defaultBranch??null,remoteProviderInstanceId:e.remoteRepo?.providerInstanceId??null,remoteIdentifier:e.remoteRepo?.identifier??null,remoteDefaultReviewers:t.length>0?JSON.stringify(t):null}}toDomain(e){let t=e.remoteProviderInstanceId?.trim()??"",r=e.remoteIdentifier?.trim()??"",o=Om(e.remoteDefaultReviewers);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}:{},...t&&r?{remoteRepo:{providerInstanceId:t,identifier:r,...o.length>0?{defaultReviewers:o}:{}}}:{}}}};X=$m([qm(),Tm("design:paramtypes",[Object])],X)});import{z as A}from"zod";var Ic,_c,jc,Gi,kr,Rc,Xe,Vi=l(()=>{"use strict";Ic=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()}),_c=A.object({id:A.string().min(1),label:A.string().min(1),params:A.array(Ic)}),jc=A.object({actionId:A.string().min(1),label:A.string().min(1),params:A.array(Ic)}),Gi=A.object({templateId:A.string().min(1),params:A.record(A.string(),A.unknown())}),kr=A.object({params:A.record(A.string(),A.unknown())}),Rc=A.object({query:A.record(A.string(),A.unknown())}),Xe=10});import{z as ne}from"zod";var ue,Pr,Ar,Cr,$r,Tr=l(()=>{"use strict";Vi();ue=ne.enum(["ticket","pull_request","documentation"]),Pr=ne.object({id:ne.string().min(1),name:ne.string().min(1),subjectType:ue,workflowId:ne.string().min(1),providerInstanceId:ne.string().min(1),query:ne.record(ne.string(),ne.unknown()),description:ne.string().optional(),queryTemplate:Gi.optional(),order:ne.number().int().nonnegative()}),Ar=Pr.omit({order:!0}),Cr=Pr.partial().omit({id:!0,order:!0}).extend({queryTemplate:Gi.nullable().optional()}),$r=ne.object({viewIds:ne.array(ne.string().min(1)).min(1)})});var Ec=l(()=>{"use strict";Tr()});var kc=l(()=>{"use strict";Vi()});function Qi(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function Pc(n,e){let t=e instanceof Set?e:new Set(e),r=Qi(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function Ac(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&Ac(t.steps,e)}function Cc(n){let e=[];Ac(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 $c(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 zi=l(()=>{"use strict"});import{z as f}from"zod";function qc(n){return typeof n=="object"&&typeof n.source=="string"}function Jm(n){return!!(n.path?.trim()||n.pattern?.trim())}function Um(n,e){let t=e.sourceStepIds??[];if(t.length===0)return`comment_review step '${e.id}' requires sourceStepIds`;let r=Yi(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 Yi(n){let e=[];for(let t of n)e.push(t),t.type==="loop"&&e.push(...Yi(t.steps));return e}var Dm,Vn,Bm,Le,_e,Oc,Dc,Bc,Fc,Nc,Lc,Jc,Fm,Uc,Wc,Nm,Lm,Mc,qr,Tc,Hc,Qn,Wm,Mm,Hm,Km,Gm,Vm,Qm,zm,Ym,Kc,yt,Gc=l(()=>{"use strict";Tr();zi();Dm=f.enum(["on_fail","on_complete","on_needs_input"]),Vn=f.object({triggers:f.array(Dm),messageTemplate:f.string().optional()}),Bm=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()}),Le=f.string().min(1),_e=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()})]),Oc=_e,Dc=f.object({type:f.literal("agent"),id:f.string().min(1),name:Le,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:_e.optional()}),Bc=f.object({type:f.literal("interaction"),id:f.string().min(1),name:Le,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:_e.optional()}),Fc=f.object({type:f.literal("shell"),id:f.string().min(1),name:Le,command:f.string().min(1),condition:_e.optional()}),Nc=f.object({type:f.literal("git"),id:f.string().min(1),name:Le,operation:f.enum(["create_worktree","checkout","create_branch","commit","push"]),params:f.record(f.string(),f.unknown()),condition:_e.optional()}),Lc=f.object({type:f.literal("provider_action"),id:f.string().min(1),name:Le,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:ue,source:f.string().min(1),subjectId:f.string().min(1)}).optional(),condition:_e.optional()}),Jc=f.object({type:f.literal("engine_action"),id:f.string().min(1),name:Le,action:f.enum(["create_workflow"]),params:f.record(f.string(),f.unknown()),condition:_e.optional()}),Fm=f.union([f.literal("selection"),f.object({source:f.string().min(1)})]),Uc=f.object({type:f.literal("sub_workflow"),id:f.string().min(1),name:Le,workflowId:f.string().min(1),forEach:Fm,condition:_e.optional()}),Wc=f.discriminatedUnion("action",[f.object({action:f.literal("fail")}),f.object({action:f.literal("continue")}),f.object({action:f.literal("ask_human")})]),Nm=f.object({type:f.literal("loop"),id:f.string().min(1),name:Le,steps:f.array(f.lazy(()=>qr)),until:Oc,maxIterations:f.number().int().nonnegative(),onMaxIterations:Wc,condition:_e.optional()}),Lm=f.enum(["fail","empty","ask_human"]),Mc=f.object({type:f.literal("extract"),id:f.string().min(1),name:Le,source:f.string(),path:f.string().optional(),pattern:f.string().optional(),onNoMatch:Lm,condition:_e.optional()}),qr=f.lazy(()=>f.discriminatedUnion("type",[Nc,Lc,Jc,Fc,Dc,Bc,Uc,Nm,Mc])),Tc=f.object({name:f.string().min(1),description:f.string().optional(),appliesTo:f.union([ue,f.array(ue),f.literal("none")]),subjectHandling:f.enum(["per-subject","collection"]),inputSchema:f.array(Bm),steps:f.array(qr),notificationPolicy:Vn}),Hc=Tc.extend({id:f.string().min(1),sourceLibraryEntryId:f.string().min(1).optional(),sourceSnapshot:Tc.optional()}),Qn=Hc.superRefine((n,e)=>{let t=Cc(n.steps);t.length>0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`});for(let r of Yi(n.steps))if(r.type==="extract"&&!Jm(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=Um(n.steps,r);o&&e.addIssue({code:"custom",path:["steps"],message:o})}});Wm=Dc.extend({id:f.string().min(1).optional()}),Mm=Bc.extend({id:f.string().min(1).optional()}),Hm=Fc.extend({id:f.string().min(1).optional()}),Km=Nc.extend({id:f.string().min(1).optional()}),Gm=Lc.extend({id:f.string().min(1).optional()}),Vm=Jc.extend({id:f.string().min(1).optional()}),Qm=Uc.extend({id:f.string().min(1).optional()}),zm=f.object({type:f.literal("loop"),id:f.string().min(1).optional(),name:Le,steps:f.array(f.lazy(()=>Kc)),until:Oc,maxIterations:f.number().int().nonnegative(),onMaxIterations:Wc,condition:_e.optional()}),Ym=Mc.extend({id:f.string().min(1).optional()}),Kc=f.lazy(()=>f.discriminatedUnion("type",[Km,Gm,Vm,Hm,Wm,Mm,Qm,zm,Ym])),yt=Hc.omit({id:!0,steps:!0}).extend({id:f.string().min(1).optional(),steps:f.array(Kc)})});function Xm(n,e){let t=e[n.stepId],r=t!=null&&typeof t=="object"?t[n.field]:void 0;return{stepOutput:t,fieldValue:r}}function Or(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 Vc(n,e){return{condition:n,inputs:Xm(n,e)}}var Qc=l(()=>{"use strict"});function Xi(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function zc(n,e){return Xi(n).includes(e)}var Zi=l(()=>{"use strict"});var Yc=l(()=>{"use strict"});function Xc(n,e="none"){switch(n.type){case"agent":return eh(n.outputFormat);case"shell":return{isScalar:!1,fields:["exitCode","stdout","stderr"]};case"git":return nh(n);case"provider_action":return th(n,e);case"engine_action":return n.action==="create_workflow"?{isScalar:!1,fields:["valid","definition","error","persisted"]}:{isScalar:!1,opaque:!0};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 Zc(n,e){let t=[];return eu(n,e,t,!1)?t:[]}function eh(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 th(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:zn[t]};let r=Xi(e),o=[],i=new Set;for(let s of r)for(let a of zn[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:[...Zm],isArray:!0};case"get_content":return{isScalar:!0};case"post_comment":case"update_status":return{isScalar:!1,fields:[]}}}function nh(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 rh(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 eu(n,e,t,r){for(let o of n){if(rh(o,e))return!0;if(o.type==="loop"&&Array.isArray(o.steps)){if(eu(o.steps,e,t,!0))return!0}else t.push({step:o,inLoop:r})}return!1}var zn,Zm,es=l(()=>{"use strict";Zi();zn={ticket:["id","source","title","description","status","assignee","url"],pull_request:["id","source","title","description","repoIdentifier","sourceBranch","targetBranch","author","url"],documentation:["id","source","title","url"]},Zm=["id","subjectId","author","body","createdAt"]});function oh(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 ih(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n.suggestions;if(!Array.isArray(e))return null;let t=[];for(let r of e){let o=oh(r);if(!o)return null;t.push(o)}return t}function sh(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 ah(n,e){return Zc(n,e).map(t=>t.step).filter(t=>t.type==="agent"&&"outputFormat"in t&&t.outputFormat==="comment_suggestions")}function tu(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(ah(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=ih(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 sh(i)}function nu(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 ru=l(()=>{"use strict";es()});var ou=l(()=>{"use strict";Gc();Qc();zi();Zi();Yc();es();ru()});import{z as Dt}from"zod";var ch,Dr,Br,Fr,iu=l(()=>{"use strict";ch=Dt.enum(["user","organization","project"]),Dr=Dt.object({id:Dt.string().min(1),name:Dt.string().min(1),description:Dt.string().optional(),tier:ch,path:Dt.string().min(1)}),Br=Dr.omit({id:!0}).extend({id:Dt.string().min(1).optional()}),Fr=Dr.partial().omit({id:!0})});var su=l(()=>{"use strict";iu()});import{z as we}from"zod";var au,Nr,Lr,Jr,cu=l(()=>{"use strict";au=we.object({providerInstanceId:we.string().min(1),identifier:we.string().min(1),defaultReviewers:we.array(we.string().min(1)).optional()}),Nr=we.object({id:we.string().min(1),name:we.string().min(1),localPath:we.string().min(1),worktreeBasePath:we.string().min(1).optional(),defaultBranch:we.string().min(1).optional(),remoteRepo:au.optional()}),Lr=Nr.omit({id:!0}).extend({id:we.string().min(1).optional()}),Jr=Nr.partial().omit({id:!0}).extend({remoteRepo:au.nullable().optional()})});var uu=l(()=>{"use strict";cu()});var lu=l(()=>{"use strict"});function uh(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 pu(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=uh(r);if(!o)return null;t.push(o)}return t}function du(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 fu=l(()=>{"use strict"});function ph(n){return lh.has(n)}function dh(n){let e=n.stepHistory.find(r=>r.status==="running");if(e)return e;let t=n.stepHistory.find(r=>r.status==="queued");if(t)return t;if((n.status==="waiting_for_human"||n.status==="waiting_for_children")&&n.currentStepExecutionId){let r=n.stepHistory.find(o=>o.id===n.currentStepExecutionId);if(r)return r}return ph(n.status)&&n.stepHistory.length>0?n.stepHistory[n.stepHistory.length-1]??null:null}function mu(n,e){let t=new Map(e.map(s=>[`${s.jobId}:${s.stepExecutionId}`,s])),r=[],o=[],i=[];for(let s of n){let a=dh(s),u=a!=null?`${s.id}:${a.id}`:null,c=u!=null?t.get(u):void 0;if(c){i.push({...c,job:s});continue}if(s.status==="waiting_for_human"){r.push(s);continue}o.push(s)}return i.sort((s,a)=>s.enqueuedAt.localeCompare(a.enqueuedAt)),{waitingForHuman:r,running:o,queued:i}}var lh,hu=l(()=>{"use strict";lh=new Set(["completed","failed","cancelled"])});var yu=l(()=>{"use strict";lu();fu();hu()});var gu=l(()=>{"use strict"});var wu=l(()=>{"use strict";gu()});import{z as re}from"zod";var on,bu=l(()=>{"use strict";on=re.object({id:re.string().min(1),viewId:re.string().min(1),trigger:re.object({type:re.literal("cron"),cadence:re.string().min(1)}),notificationOverride:re.object({triggers:re.array(re.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:re.string().optional()}).optional(),missedFirePolicy:re.enum(["skip","catch_up"]),enabled:re.boolean(),lastFiredAt:re.string().optional(),createdAt:re.string()})});var Su=l(()=>{"use strict";bu()});import{z as be}from"zod";var Ur,Wr,Mr,Hr,vu=l(()=>{"use strict";Ur=be.object({id:be.string().min(1),name:be.string().min(1),workflowId:be.string().min(1),inputValues:be.record(be.string(),be.unknown()),lastJobId:be.string().min(1).optional(),order:be.number().int().nonnegative()}),Wr=Ur.omit({order:!0}),Mr=Ur.partial().omit({id:!0,order:!0}),Hr=be.object({shortcutIds:be.array(be.string().min(1)).min(1)})});var xu=l(()=>{"use strict";vu()});import{z as S}from"zod";function Au(n){return ku.safeParse(n).success}function Ze(n){return n.kind==="subject"}function Je(n){return n.kind==="agent"}function $u(n){return n.maxConcurrent??Yn}var fh,Iu,_u,ju,Yn,Ru,Kr,Gr,Vr,Qr,zr,Yr,Eu,ku,Xr,Pu,Cu,Tu=l(()=>{"use strict";Tr();fh=S.enum(["jira","bitbucket","github","confluence","manual"]),Iu=S.enum(["claude","cursor"]),_u={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()},ju=S.object({..._u,kind:S.literal("subject"),type:fh,subjectType:ue}),Yn=2,Ru=S.object({..._u,kind:S.literal("agent"),type:Iu,maxConcurrent:S.number().int().min(1).optional()}),Kr=S.discriminatedUnion("kind",[ju,Ru]),Gr=S.object({providerInstances:S.array(Kr).default([]),defaultAgentInstanceId:S.string().min(1).optional()}),Vr=S.object({providerInstances:S.array(Kr).optional(),defaultAgentInstanceId:S.string().min(1).nullable().optional()}),Qr=S.discriminatedUnion("kind",[ju.extend({defaultAgent:S.boolean().optional()}),Ru.extend({defaultAgent:S.boolean().optional()})]),zr=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()}),Yr=S.object({type:Iu,apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),Eu=S.object({id:S.string().min(1),displayName:S.string().min(1)}),ku=S.enum(["jira","bitbucket","github","confluence","claude","cursor"]),Xr=S.object({type:ku,config:S.record(S.string(),S.unknown()).optional(),apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),Pu=S.object({success:S.boolean(),message:S.string().optional(),identityMismatch:S.boolean().optional()});Cu={providerInstances:[]}});var qu=l(()=>{"use strict";Tu()});var Ou=l(()=>{"use strict"});function Du(n,e){switch(n){case"questionnaire":return ts(e);case"confirmation":return mh(e);case"conversation":return hh(e);case"comment_review":return yh(e);default:return n}}function ts(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 mh(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)?[]:ts(n)}function hh(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?ts(n):[]}function yh(n){if(!n||typeof n!="object"||Array.isArray(n))return[];let e=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 Bu=l(()=>{"use strict"});var Fu=l(()=>{"use strict";Ou();Bu()});var C=l(()=>{"use strict";Ec();kc();ou();su();uu();yu();wu();Su();xu();qu();Fu()});import{Injectable as bh}from"@nestjs/common";import{eq as Sh}from"drizzle-orm";function vh(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 ns({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function ns(n){return{providerInstances:(n.providerInstances??Cu.providerInstances).map(xh),...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function xh(n){return!Je(n)||n.maxConcurrent!=null?n:{...n,maxConcurrent:Yn}}function Nu(n){return n.providerInstances!==void 0}var gh,wh,_,le=l(()=>{"use strict";C();Fi();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},wh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:Jn}});return ns(e?e.data:{})}async update(e){let t=vh(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:Jn}})?await this.db.update(rn).set({data:t}).where(Sh(rn.id,Jn)):await this.db.insert(rn).values({id:Jn,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};_=gh([bh(),wh("design:paramtypes",[Object])],_)});import{Module as _h}from"@nestjs/common";var Ih,jh,Ue,Xn=l(()=>{"use strict";mc();Ot();jr();Kn();Rr();Mi();Ki();Er();Gn();le();Ih=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},jh=[D,he,Y,ye,ze,Ye,ge,X,_],Ue=class{};Ue=Ih([_h({providers:[te,{provide:D,useFactory:n=>new D(n.getDb(),n.getSqlite()),inject:[te]},{provide:he,useFactory:n=>new he(n.getDb()),inject:[te]},{provide:Y,useFactory:n=>new Y(n.getDb(),n.getSqlite()),inject:[te]},{provide:ye,useFactory:n=>new ye(n.getDb()),inject:[te]},{provide:ze,useFactory:n=>new ze(n.getDb()),inject:[te]},{provide:Ye,useFactory:n=>new Ye(n.getDb()),inject:[te]},{provide:ge,useFactory:n=>new ge(n.getDb()),inject:[te]},{provide:X,useFactory:n=>new X(n.getDb()),inject:[te]},{provide:_,useFactory:n=>new _(n.getDb()),inject:[te]}],exports:[te,...jh]})],Ue)});import{Injectable as kh,Logger as Ph,Inject as Ju}from"@nestjs/common";async function Uu(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 Ah(n,e,t){let r=await Uu(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 Rh,Eh,Lu,rs,gt,os=l(()=>{"use strict";le();Oe();Rh=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},Eh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Lu=function(n,e){return function(t,r){e(t,r,n)}};gt=rs=class{secrets;settings;logger=new Ph(rs.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Ah(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return Uu(this.secrets,e.providerInstances??[])}};gt=rs=Rh([kh(),Lu(0,Ju(ce)),Lu(1,Ju(_)),Eh("design:paramtypes",[Function,_])],gt)});function Zr(n,e=tn(n)){let t=qh[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function Wu(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 $h){let o=e.get(r);o?.length&&t.push(`## ${Ch[r]}
12
12
  ${o.join(`
13
13
 
14
14
  `)}`)}return t.join(`
15
15
 
16
- `)}function Jn(n){let e=[],t=yu(n.knowledge);return t&&e.push(t),e.push(`# Objective
16
+ `)}function Zn(n){let e=[],t=Wu(n.knowledge);return t&&e.push(t),e.push(`# Objective
17
17
  ${n.objective}`),e.push(`# Output format
18
- ${zm[n.outputFormat]}`),e.join(`
18
+ ${Th[n.outputFormat]}`),e.join(`
19
19
 
20
- `)}function Mn(n,e){return e==="free_text"?n:gu(n)}function gu(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 Gm,Qm,zm,Ym,Nr=l(()=>{"use strict";Ce();Gm={user:"User preferences",organization:"Organization guidelines",project:"Project context"},Qm=["user","organization","project"],zm={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."},Ym={anthropic:"Anthropic",cursor:"Cursor"}});async function Xt(n){let e=n.fetchFn??fetch;return n.type==="claude"?th(n.apiKey,e):nh(n.apiKey,e)}async function th(n,e){let t=await e(Xm,{method:"GET",headers:{"x-api-key":n,"anthropic-version":eh}});if(!t.ok)throw wu("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 nh(n,e){let t=await e(Zm,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw wu("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 wu(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 Xm,Zm,eh,Lr=l(()=>{"use strict";Xm="https://api.anthropic.com/v1/models",Zm="https://api.cursor.com/v1/models",eh="2023-06-01"});function ye(n){return{success:!1,message:n instanceof Error?n.message:String(n)}}function Zt(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 Tt=l(()=>{"use strict"});async function*oh(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 rh,en,Ni=l(()=>{"use strict";Nr();Ce();Lr();Tt();Nr();rh=Gt("anthropic"),en=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Jn(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??oh,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:Mn(a,e.outputFormat),sessionId:s}}async testConnection(){try{let e=await this.requireApiKey();return await Xt({type:"claude",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||rh,t=await this.secrets.get(e);if(!t)throw Fr("anthropic",e);return t}}});function sh(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function ah(){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 ih,tn,Li=l(()=>{"use strict";Nr();Ce();Lr();Tt();ih=Gt("cursor"),tn=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Jn(e),o=this.options.sdk??await ah(),i=sh(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:Mn(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async testConnection(){try{let e=await this.requireApiKey();return await Xt({type:"cursor",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||ih,t=await this.secrets.get(e);if(!t)throw Fr("cursor",e);return t}}});function bu(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 nn(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var Mr=l(()=>{"use strict"});function Un(n){return n==null?"":typeof n=="string"?n:Su(n).replace(/\n+$/,"")}function Ur(n){return{version:1,type:"doc",content:n.split(`
21
- `).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function Su(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(Su).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
23
- `:t}var Ji=l(()=>{"use strict"});function uh(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function vu(n){return{representation:"atlas_doc_format",value:JSON.stringify(Ur(n))}}function ju(n){return Un(lh(n))}function lh(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 ph(n){return!(n.id==null||String(n.id)===""||n.type!=null&&n.type!=="page"||n.status!=null&&n.status!=="current")}function Ui(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:dh(e,n),raw:n}}function dh(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 fh(n,e){return{id:String(n.id??""),subjectId:e,body:ju(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var ch,Mi,xu,Wr,Kr,rn,Hr=l(()=>{"use strict";Mr();Ji();Tt();ch="kno.confluence.apiToken",Mi=50,xu=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}]}],rn=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()||ch}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Ui(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 ju(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=${Mi}`,o=new Set;for(let i=0;i<xu&&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(fh(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:vu(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: ${nn(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:vu(i)}});return Ui(u,s,this.instanceId)}async queryBySpaceKey(e){let t=await this.resolveSpaceId(e);return this.collectPages(`/wiki/api/v2/spaces/${encodeURIComponent(t)}/pages?limit=${Mi}&status=current&depth=all`)}async queryByParentPageId(e){return(await this.collectPages(`/wiki/api/v2/pages/${encodeURIComponent(e)}/children?limit=${Mi}`)).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<xu&&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;ph(p)&&r.push(Ui(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=uh(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 mh}from"node:crypto";var hh,Vr,Iu=l(()=>{"use strict";hh=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:mh(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(hh.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function dt(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>Ve)throw new Error(`${e} accepts at most ${Ve} repositories, got ${n.length}`)}var Wn=l(()=>{"use strict";C()});function Wi(){return gh.replace(/\/$/,"")}function on(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 wh(n,e){return`${n}#${e}`}function Gi(n){let e=n.repoSlugs!==void 0?n.repoSlugs:n.repoSlug,t=dt(e);return Gr(t,"filter.repoSlugs"),t}function bh(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 Sh(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 Pu(n){if(!Ru(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 xh(n){if(!(Gi(n).length>0))return Pu(n)==="author"?"author":void 0}function Eu(n){if(!Ru(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 vh(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=Eu(n.state);return r&&e.push(`state="${r}"`),e.length>0?e.join(" AND "):void 0}function jh(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 Ih(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 Ru(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 _h(n){let e=n.destination?.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e.trim();throw new Error("Bitbucket pull request is missing destination.repository.full_name")}function zr(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:wh(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},repoIdentifier:_h(n),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 Ph(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 yh,gh,Ki,_u,Hi,Vi,sn,Yr=l(()=>{"use strict";Mr();Tt();Wn();yh="kno.bitbucket.apiToken",gh="https://api.bitbucket.org/2.0";Ki=50,_u=10,Hi=500,Vi=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],sn=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()||yh}async get(e){let{repoSlug:t,prNumber:r}=on(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(Pu(e)==="reviewer"){let r=Sh(e),o=await this.accountUuid();return this.queryRepos(r,{...e,reviewerUuid:o})}return xh(e)?this.queryWorkspacePullRequests(e):this.queryRepos(bh(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=vh(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=Eu(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<_u&&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??jh(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}=on(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${Ki}`;for(let u=0;u<_u&&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(Ph(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}=on(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}=on(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}=on(e),{workspace:i}=await this.requireConfig(),s=Ih(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: ${nn(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}=on(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(I=>c!=null&&I.uuid===c||p!=null&&I.account_id===p))return zr(a,o,this.instanceId);let x=[...m.map(I=>I.uuid?{uuid:I.uuid}:{account_id:I.account_id}),c?{uuid:c}:{account_id:p}],P=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:x}});return zr(P,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=Zt(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 Eh}from"node:crypto";function Rh(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Xr,ku=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=>Rh(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:Eh(),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}=Cu(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 $h(n,e,t){return`${n}/${e}#${t}`}function Cu(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 Oh(n){let e=n.repos!==void 0?n.repos:n.repo,t=dt(e);return Gr(t,"filter.repos"),t}function qh(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function Dh(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function Bh(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: ${Th.join(", ")}`)}function zi(n){let e=n.base?.repo?.full_name;return typeof e=="string"&&e.includes("/")?e.trim():Fh(n)}function Fh(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e.trim();let t=n.repository_url;if(typeof t=="string"){let o="/repos/",i=t.lastIndexOf(o);if(i>=0){let s=t.slice(i+o.length);if(s.includes("/"))return s}}let r=n.html_url;if(typeof r=="string"){let o=r.match(/github\.com\/([^/]+\/[^/]+)\//);if(o?.[1]?.includes("/"))return o[1]}throw new Error("GitHub search result is missing repository full_name")}function Yi(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:$h(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 Nh(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 kh,Ah,Ch,Zr,Au,eo,Th,an,Xi=l(()=>{"use strict";Tt();Wn();kh="2026-03-10",Ah="https://api.github.com",Ch="kno.github.apiToken",Zr=100,Au=10,eo=500,Th=["open","closed/done/completed","not_planned/wontfix"],an=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()||Ch}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 Yi(i,this.instanceId,zi(i))}async query(e){let t=Oh(e);if(t.length>0)return this.queryRepos(t,e);let r=qh(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=>Nh(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:Bh(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}=Cu(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<=Au&&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(Yi(p,this.instanceId,(()=>{try{return zi(p)}catch{return`${r}/${o}`}})()))}if(c.length<Zr)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[Dh(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<=Au&&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(Yi(m,this.instanceId,zi(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=Zt(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=`${Ah}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":kh};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 $t,y,h,B,Kn,E=l(()=>{"use strict";$t=class extends Error{details;constructor(e,t){super(e),this.name=this.constructor.name,this.details=t}},y=class extends $t{httpStatus=404},h=class extends $t{httpStatus=400},B=class extends $t{httpStatus=409},Kn=class extends Error{details;constructor(e,t){super(e),this.name="StepFailureError",this.details=t}}});function Uh(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 Tu(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 Lh,Jh,Mh,ro,cn,Zi=l(()=>{"use strict";E();Ji();Tt();Lh="kno.jira.apiToken",Jh=50,Mh=10,ro=500,cn=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()||Lh}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return Tu(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=Uh(e),o=[],i,s=new Set;for(let a=0;a<Mh&&o.length<ro;a++){let u={jql:r,maxResults:Math.min(Jh,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(Tu(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:Ur(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=Zt(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 Wh}from"node:crypto";function Kh(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var so,$u=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=>Kh(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:Wh(),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 Qe(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 Hh(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var i_,W,un=l(()=>{"use strict";C();Ni();Li();Hr();Iu();Yr();ku();Xi();Zi();$u();i_=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(Ne(e)){let o=Qe(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new en(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new tn(t,{secretKey:e.secretKey,model:o}));return}if(!Ct(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=Hh(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 cn(t,{instanceId:e.id,baseUrl:Qe(e.config,"baseUrl"),email:Qe(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new an(t,{instanceId:e.id,username:Qe(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new sn(t,{instanceId:e.id,email:Qe(e.config,"email"),workspace:Qe(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new rn(t,{instanceId:e.id,baseUrl:Qe(e.config,"baseUrl"),email:Qe(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:Qe(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=>Ct(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function Bu(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{repoSlugs:qu(n,e),role:"reviewer",state:"OPEN"};case"repo-open-prs":return{repoSlugs:qu(n,e),state:"OPEN"};default:throw new y(`Unknown Bitbucket query template: ${n}`)}}function qu(n,e){let t=dt(e.repoSlugs);if(t.length===0)throw new h(`Bitbucket template '${n}' requires params.repoSlugs`);if(t.length>Ve)throw new h(`Bitbucket template '${n}' params.repoSlugs accepts at most ${Ve} repositories, got ${t.length}`);return t}var Ou,Du,Fu=l(()=>{"use strict";E();Wn();Ou={name:"repoSlugs",label:"Repositories",type:"string[]",required:!0},Du=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[Ou]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[Ou]}]});function Lu(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:Vh(n,e),state:"open"};default:throw new y(`Unknown GitHub query template: ${n}`)}}function Vh(n,e){let t=dt(e.repos);if(t.length===0)throw new h(`GitHub template '${n}' requires params.repos`);if(t.length>Ve)throw new h(`GitHub template '${n}' params.repos accepts at most ${Ve} repositories, got ${t.length}`);return t}var Nu,Ju=l(()=>{"use strict";E();Wn();Nu=[{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 Hu(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 = ${Wu(Uu(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${Wu(Uu(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new y(`Unknown Jira query template: ${n}`)}}function Uu(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 Wu(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var Mu,Ku,Vu=l(()=>{"use strict";E();Mu={name:"project",label:"Project key",type:"string",required:!0},Ku=[{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:[Mu]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[Mu]}]});function zu(n,e){switch(n){case"all-pages-in-space":return{spaceKey:Gu(n,e,"spaceKey")};case"pages-under-page":return{parentPageId:Gu(n,e,"parentPageId")};case"manual-list":return{pageIds:[]};default:throw new y(`Unknown Confluence query template: ${n}`)}}function Gu(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 Qu,Yu=l(()=>{"use strict";E();Qu=[{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 Zu,Injectable as zh}from"@nestjs/common";function Yh(n){return n==null?!0:typeof n=="string"?n.trim()==="":Array.isArray(n)?n.every(e=>typeof e!="string"||e.trim()===""):!1}var Gh,Qh,Xu,el,ft,es=l(()=>{"use strict";C();E();he();un();Fu();Ju();Vu();Yu();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)},Xu=function(n,e){return function(t,r){e(t,r,n)}},el={bitbucket:{list:()=>Du,resolve:Bu},github:{list:()=>Nu,resolve:Lu},jira:{list:()=>Ku,resolve:Hu},confluence:{list:()=>Qu,resolve:zu}},ft=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?el[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?el[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&&Yh(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||!Ct(r)))return r.type}};ft=Gh([zh(),Xu(0,Zu(_)),Xu(1,Zu(W)),Qh("design:paramtypes",[_,W])],ft)});import{Inject as nl,Injectable as ey}from"@nestjs/common";var Xh,Zh,tl,ty,mt,ts=l(()=>{"use strict";C();he();Hr();Yr();un();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)},tl=function(n,e){return function(t,r){e(t,r,n)}},ty={bitbucket:()=>Vi,confluence:()=>Kr},mt=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||!Ct(r)?[]:ty[r.type]?.()??[]}};mt=Xh([ey(),tl(0,nl(_)),tl(1,nl(W)),Zh("design:paramtypes",[_,W])],mt)});import{Inject as rs,Injectable as oy}from"@nestjs/common";var ny,ry,ns,ln,ht,co=l(()=>{"use strict";C();he();Ce();E();Lr();ny=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},ry=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ns=function(n,e){return function(t,r){e(t,r,n)}},ln="PREVIEW_MODELS_FETCH",ht=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(!Ne(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 Xt({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")}}};ht=ny([oy(),ns(0,rs(_)),ns(1,rs(oe)),ns(2,rs(ln)),ry("design:paramtypes",[_,Function,Function])],ht)});import{Inject as is,Injectable as ay}from"@nestjs/common";function Ot(n,e){let t=n?.[e];return typeof t=="string"&&t.trim()?t.trim():void 0}var iy,sy,os,ss,as,Se,uo=l(()=>{"use strict";C();he();Ce();E();co();Zi();Xi();Yr();Hr();Ni();Li();iy=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},sy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},os=function(n,e){return function(t,r){e(t,r,n)}},ss="kno.probe.apiToken",as=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(!ru(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 as(r);return this.createProvider(e,t,o).testConnection()}createProvider(e,t,r){let o={instanceId:"probe",secretKey:ss};switch(e){case"jira":return new cn(r,{...o,baseUrl:Ot(t,"baseUrl"),email:Ot(t,"email")},this.fetchFn);case"bitbucket":return new sn(r,{...o,email:Ot(t,"email"),workspace:Ot(t,"workspace")},this.fetchFn);case"github":return new an(r,{...o,username:Ot(t,"username")},this.fetchFn);case"confluence":return new rn(r,{...o,baseUrl:Ot(t,"baseUrl"),email:Ot(t,"email")},this.fetchFn);case"claude":return new en(r,{secretKey:ss,fetchFn:this.fetchFn});case"cursor":return new tn(r,{secretKey:ss,fetchFn:this.fetchFn})}}};Se=iy([ay(),os(0,is(_)),os(1,is(oe)),os(2,is(ln)),sy("design:paramtypes",[_,Function,Function])],Se)});import{Module as uy}from"@nestjs/common";var cy,yt,lo=l(()=>{"use strict";oi();ga();ui();Ce();Ln();he();Fi();un();es();ts();co();uo();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},yt=class{};yt=cy([uy({imports:[Qt,Le],providers:[{provide:W,useFactory:async(n,e)=>{let t=await n.get();return W.fromSettings(t.providerInstances??[],e)},inject:[_,oe]},{provide:jn,useClass:rr},pt,ft,mt,{provide:ln,useValue:(n,e)=>fetch(n,e)},ht,Se],exports:[W,jn,pt,ft,mt,ht,Se,ln]})],yt)});import{Injectable as py}from"@nestjs/common";var ly,xe,po=l(()=>{"use strict";ly=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=ly([py()],xe)});import{Global as fy,Module as my}from"@nestjs/common";var dy,gt,fo=l(()=>{"use strict";po();dy=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},gt=class{};gt=dy([fy(),my({providers:[xe],exports:[xe]})],gt)});import{Injectable as yy}from"@nestjs/common";import{resolve as gy}from"node:path";var hy,wt,cs=l(()=>{"use strict";hy=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},wt=class{tails=new Map;lockKey(e){let t=gy(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}};wt=hy([yy()],wt)});import{Injectable as Sy}from"@nestjs/common";import{execFile as xy}from"node:child_process";import{mkdirSync as us,rmSync as vy}from"node:fs";import{dirname as jy,join as ho,resolve as mo}from"node:path";import{promisify as Iy}from"node:util";function rl(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function ol(n){return ho(n,"worktrees")}function Py(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 wy,by,_y,ze,ls=l(()=>{"use strict";cs();wy=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},by=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_y=Iy(xy),ze=class{worktreesRoot;fetchLocks;constructor(e,t=new wt){this.worktreesRoot=e,this.fetchLocks=t,us(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??ho(this.worktreesRoot,e);return us(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){us(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 Py(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{vy(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")?jy(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 _y("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=rl(o.stderr),s=rl(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};ze=wy([Sy(),by("design:paramtypes",[String,wt])],ze)});import{Module as Ry}from"@nestjs/common";import{mkdirSync as ky}from"node:fs";var Ey,il,yo,sl=l(()=>{"use strict";or();ls();cs();Ey=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},il=_n();ky(il,{recursive:!0});yo=class{};yo=Ey([Ry({providers:[wt,{provide:ze,useFactory:n=>new ze(ol(il),n),inject:[wt]}],exports:[ze]})],yo)});function dn(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 al(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 pn(n,e){return typeof n=="string"?dn(n,e):Array.isArray(n)?n.map(t=>pn(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,pn(r,e)])):n}var ps=l(()=>{"use strict"});function ul(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=Ay(i,e);if(r=s??i,s==null)return{kind:"no_match",sourceValue:r};o=s}if(t){let i=cl(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:cl(o),sourceValue:r}}function Ay(n,e){if(!(n==null||typeof n!="object"))return Hn(n,e)}function cl(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):n==null?"":JSON.stringify(n)}var ll=l(()=>{"use strict";ps()});function bt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=bt(r.stepExecutions,e);if(o)return o}}}function qt(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=qt(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 Dt(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Dt(t.steps,e);if(r)return r}}}function pl(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 ds(n){let e=[];for(let t of n){t.childJobIds&&e.push(...t.childJobIds);for(let r of t.iterations??[])e.push(...ds(r.stepExecutions))}return e}var dl=l(()=>{"use strict"});import{z as X}from"zod";function fl(n,e){let t=qy[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 Cy,Ty,$y,Oy,qy,ml=l(()=>{"use strict";Cy=X.object({questions:X.array(X.object({id:X.string(),prompt:X.string()}))}),Ty=X.object({approved:X.boolean()}),$y=X.object({suggestions:X.array(X.object({id:X.string().min(1),file:X.string().min(1),line:X.number().int(),body:X.string()}))}),Oy=X.string(),qy={questionnaire:Cy,confirmation:Ty,comment_suggestions:$y,free_text:Oy}});function ve(n){return n==="completed"||n==="failed"||n==="cancelled"}function fs(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 hl(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 ms=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 hs=l(()=>{"use strict";E()});import{Injectable as By}from"@nestjs/common";var Dy,Bt,ys=l(()=>{"use strict";Dy=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{requested=new Set;requestCancellation(e){this.requested.add(e)}isCancellationRequested(e){return this.requested.has(e)}clear(e){this.requested.delete(e)}};Bt=Dy([By()],Bt)});import{Inject as Jy,Injectable as My}from"@nestjs/common";var Fy,Ny,Ly,je,bo=l(()=>{"use strict";C();he();Fy=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)},Ly=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||!Ne(r)?Nn:iu(r)}};je=Fy([My(),Ly(0,Jy(_)),Ny("design:paramtypes",[Object])],je)});import{Logger as Uy}from"@nestjs/common";import{readFile as Wy}from"node:fs/promises";async function yl(n,e,t=new Uy("resolveContextFiles"),r=o=>Wy(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 gl=l(()=>{"use strict"});import{basename as Ky,dirname as Hy,join as Vy,resolve as Vn,sep as wl}from"node:path";function Gy(n){return n.replace(/-/g,"").slice(0,4)}function bl(n,e){return`${n}-${Gy(e)}`}function gs(n){return n.replace(/[\\/:*?"<>|]/g,"-")}function So(n){let e=Vn(n);return Vy(Hy(e),`${Ky(e)}-worktrees`)}function xo(n,e){let t=Vn(n),r=Vn(e);if(St(t,r))return!0;let o=t.endsWith(wl)?t:t+wl,i=process.platform==="win32"?r.toLowerCase():r,s=process.platform==="win32"?o.toLowerCase():o;return i.startsWith(s)}function St(n,e){let t=Vn(n),r=Vn(e);return process.platform==="win32"?t.toLowerCase()===r.toLowerCase():t===r}var ws=l(()=>{"use strict"});import{join as Sl}from"node:path";async function xl(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=>St(m.localPath,a)),p=u??c;if(!p)throw new h(`Unknown local repository: ${a}`);r[i.name]=p.localPath}return r}function Qy(n,e){return`No local repository is registered for \`${n}\` (instance: \`${e}\`) \u2014 register one in Manage \u2192 Local Repositories, or provide \`repoPath\` directly`}function zy(n){let e=n.subjectContext;if(!e||e.mode!=="single")throw new Error("create_worktree with resolveRepoFromSubject requires subjectContext.mode === 'single' with a PullRequest subject");let t=e.subject;if(t.subjectType!=="pull_request")throw new Error(`create_worktree with resolveRepoFromSubject requires a PullRequest subject (got '${t.subjectType}')`);return t}function Yy(n,e){let t=e.repoIdentifier?.trim()??"";if(!t)throw new Error("PullRequest is missing repoIdentifier \u2014 cannot resolve a local repository from the subject");let r=n.find(o=>o.remoteRepo?.providerInstanceId===e.source&&o.remoteRepo.identifier===t);if(!r)throw new Error(Qy(t,e.source));return r}async function vl(n){let{job:e,params:t,git:r,jobs:o,localRepositories:i}=n,s=await i.list(),a=t.resolveRepoFromSubject===!0,u,c;if(a){let I=zy(e);c=Yy(s,I),u=c.localPath,t.mode!=="existing-branch"&&jl(t,"baseBranch")==null&&c.defaultBranch?.trim()&&(t.baseBranch=c.defaultBranch.trim())}else u=vo(t,"repoPath"),c=s.find(I=>St(I.localPath,u));let p=t.mode==="existing-branch"?"existing-branch":"new-branch",m=c?.worktreeBasePath?.trim()?c.worktreeBasePath.trim():So(u);if(xo(u,m)&&!St(u,m))throw new Error(`Worktree base '${m}' must not be inside the repository at '${u}'`);if(p==="existing-branch")return Xy({job:e,repoPath:u,branch:vo(t,"branch"),worktreeBase:m,explicitPath:typeof t.worktreePath=="string"?t.worktreePath:void 0,git:r,jobs:o});let w=vo(t,"branchName"),x=bl(w,e.id),P=typeof t.worktreePath=="string"&&t.worktreePath.trim()!==""?t.worktreePath:Sl(m,gs(x));return r.createWorktree(e.id,{repoPath:u,baseBranch:vo(t,"baseBranch"),branchName:x,worktreePath:P})}async function Xy(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&&!St(w.path,t)),c=a.find(w=>w.branch===r&&St(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:Sl(o,gs(r));return i.addWorktreeForExistingBranch({repoPath:t,branch:r,worktreePath:w})}let p=u[0].path,m=await Zy(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 Zy(n,e){let r=(await n.list({liveWorktree:!0})).filter(o=>o.worktreePath!=null&&St(o.worktreePath,e));return r.find(o=>!ve(o.status))??r.sort((o,i)=>i.updatedAt.localeCompare(o.updatedAt))[0]}function jl(n,e){let t=n[e];if(!(typeof t!="string"||t.trim()===""))return t.trim()}function vo(n,e){let t=jl(n,e);if(t==null)throw new Error(`git step missing required param '${e}'`);return t}var Il=l(()=>{"use strict";E();ws();ms()});import{Inject as ae,Injectable as ng,Logger as rg}from"@nestjs/common";import{randomUUID as jo}from"node:crypto";import{exec as og}from"node:child_process";import{promisify as ig}from"node:util";async function bs(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 cg(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 xt(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 ug(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 Ft(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function lg(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 pg(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?"array":typeof n}function dg(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 _l(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 eg,tg,se,Ss,sg,ag,Ie,_o=l(()=>{"use strict";C();kt();qn();lr();ur();po();ls();he();pr();dr();un();oi();Mr();E();ps();ll();dl();ml();ms();hs();ys();bo();gl();Il();eg=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},tg=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)}},sg=ig(og),ag=new Set(["agent","shell","git","provider_action"]),Ie=Ss=class{workflows;jobs;batches;views;events;providers;notifications;contextFiles;localRepositories;git;settings;cancellation;agentGate;logger=new rg(Ss.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(P=>{let I=P;(I.type==="job_completed"||I.type==="job_failed"||I.type==="job_cancelled")&&this.onChildTerminal(I.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)}`);_l(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 xl(t.inputSchema,e.inputValues,this.localRepositories);_l(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=bt(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=Dt(o.steps,s.stepDefinitionId),u=t;if(a?.type==="interaction"&&a.interaction==="comment_review"){let $=Cc(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=qt(r.stepHistory,i);if(!w)throw new Error(`Could not locate frame for execution ${i}`);let x=this.sequenceForFrameOnJob(r,o,w),P=w.index+1,I=await this.executeStepSequence(r,o,x,w.parentLoopExecutionId,w.iterationIndex,P);return I.outcome!=="completed"?I.job:w.parentLoopExecutionId!=null&&w.iterationIndex!=null?this.continueLoopAfterBody(I.job,o,w.parentLoopExecutionId,w.iterationIndex):this.completeJob(I.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=bt(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(!ag.has(i.type))throw new B(`Step-level retry is not available for '${i.type}' steps`);let s=await this.workflowForJob(r),a=qt(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(Jc(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,P=>({...P,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 ds(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(),P=p===s?a:void 0;if(w.condition&&Sr(w.condition,c.context)){if(c=await this.recordSkippedStep(c,w,P,o,i),c.status==="cancelled")return{outcome:"cancelled",job:c};continue}let I,$=c.stepHistory;if(P){let Ae=bt(c.stepHistory,P);if(!Ae)throw new Error(`Reuse execution ${P} not found on job ${c.id}`);I=Ae}else I={id:jo(),stepDefinitionId:w.id,type:w.type,status:"running",startedAt:x},$=go(c.stepHistory,I,o,i);if(c=await this.persistJob({...c,status:c.status==="pending"?"planning":c.status,currentStepId:w.id,currentStepExecutionId:I.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,I.id,o,i,P?u:void 0);c=Ae.job;let Vt=await this.stopIfCancelled(c);if(Vt)return{outcome:"cancelled",job:Vt};if(Ae.outcome!=="completed")return Ae}catch(Ae){let Vt=await this.failJob(c,t,I.id,w.id,Ae);return Vt.status==="cancelled"?{outcome:"cancelled",job:Vt}:{outcome:"failed",job:Vt}}}return o!=null&&i!=null&&(c=await this.persistJob({...c,stepHistory:pl(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(),P=K(c.stepHistory,o,I=>({...I,status:"pending",output:w}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:P,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=Dt(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=qt(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 P=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:K(e.stepHistory,r.id,I=>({...I,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:P.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:P.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(P,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(P,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,P=>({...P,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=ug(o),s=Dt(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=qt(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=bt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Dt(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=qt(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=bt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Dt(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=lg(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(!uc(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=al(t.forEach.source);if(!i)throw new h(`sub_workflow step '${t.id}' forEach.source must be a non-empty path`);let s=Hn(xt(e),i);if(!Array.isArray(s))throw new h(`sub_workflow forEach source '${i}' must resolve to an array (got ${pg(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=fs(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=bt(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})),P=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:P,output:x})),completedAt:void 0,updatedAt:P}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:p.stepDefinitionId,timestamp:P});let I=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=fs(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=hl(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 yl(t.contextFileIds??[],this.contextFiles,this.logger),i=xt(e),s=dn(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=fl(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=pn(t.params,xt(e));switch(t.operation){case"create_worktree":{let i=await vl({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=Ft(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=Ft(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:Ft(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??pn(t.params??{},xt(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=dn(t.target.subjectId,xt(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,Ft(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=Lc(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 Kn(`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,Ft(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Ft(r,"status")),{status:Ft(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(!bu(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: ${nn(a)}`);let c=pn(i.params??{},xt(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=dn(t.command,xt(e)),i=e.worktreePath??process.cwd();try{let s=await sg(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=dn(r.source,xt(e)),s=ul({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=uu(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:Ac(r,t.steps,e.context)};let o=cg(t,r.id);return o!=null?e.context[o]:void 0}async recordSkippedStep(e,t,r,o,i){let s=new Date().toISOString(),a=vc(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 Kn?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=dg(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 bs(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return bs(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return bs(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};Ie=Ss=eg([ng(),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(jn)),se(7,ae(de)),se(8,ae(fe)),se(9,ae(ze)),se(10,ae(_)),se(11,ae(Bt)),se(12,ae(je)),tg("design:paramtypes",[D,Y,pe,le,xe,W,Object,de,fe,ze,Object,Bt,je])],Ie)});import{Module as mg}from"@nestjs/common";var fg,fn,xs=l(()=>{"use strict";Ln();lo();fo();sl();_o();ys();bo();fg=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},fn=class{};fn=fg([mg({imports:[Le,yt,gt,yo],providers:[Bt,je,Ie],exports:[Ie,je]})],fn)});import{Catch as yg}from"@nestjs/common";var hg,Po,Pl=l(()=>{"use strict";E();hg=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=hg([yg($t)],Po)});var v,ce=l(()=>{"use strict";E();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 El(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(!Ic(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function Rl(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 kl(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();E()});import{randomUUID as gg}from"node:crypto";function wg(){return gg()}function Al(n){let e=n.id??wg(),t=cc(n.steps),r=Cl(n.steps,t);return{...n,id:e,steps:r}}function Cl(n,e){return n.map(t=>{let r=t.id;return r||(r=ic(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:Cl(t.steps,e)}:{...t,id:r}})}var Tl=l(()=>{"use strict";C()});function $l(n){return n.issues.map(e=>`${e.path.join(".")||"(root)"}: ${e.message}`).join("; ")}function vs(n){let e=lt.safeParse(n);if(!e.success)throw new h(`Validation failed: ${$l(e.error)}`);return e.data}function Ol(n){let e=Al(n),t=Bn.safeParse(e);if(!t.success)throw new h(`Validation failed: ${$l(t.error)}`);return kl(t.data),t.data}async function vt(n,e){return n.create(Ol(vs(e)))}async function Ro(n,e,t){let r=Ol({...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 ko=l(()=>{"use strict";C();E();Eo();Tl()});import{z as Nt}from"zod";async function Dl(n,e){let t=vs(e.workflowDefinition),r=t.id;if(!r)return{workflow:await vt(n,t),created:!0};let o=await n.get(r);if(!o)return{workflow:await vt(n,t),created:!0};if(e.resolution==="update")return{workflow:await Ro(n,r,t),created:!1};if(e.resolution==="create_new"){let{id:i,...s}=t;return{workflow:await vt(n,s),created:!0}}throw new B(`A workflow named '${o.name}' already exists`,{conflictingWorkflowId:o.id,conflictingWorkflowName:o.name})}var Ao,ql,js=l(()=>{"use strict";E();ko();Ao=Nt.object({workflowDefinition:Nt.unknown(),resolution:Nt.enum(["update","create_new"]).optional()}),ql=Nt.object({error:Nt.string(),conflictingWorkflowId:Nt.string(),conflictingWorkflowName:Nt.string()})});import{z as bg}from"zod";function xg(n){if(n.type==="loop")return"not offered as `{{stepId}}` tokens; reference inner steps. Exit conditions use `until.stepId`.";let e=Pc(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 vg(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 jg(){return Object.keys(Fn).map(t=>{let r=Fn[t].map(o=>`\`{{subject.${o}}}\``).join(", ");return`- **${t}**: ${r}`}).join(`
24
- `)}function Ig(){return Object.keys(Bl).map(n=>`- **${n}**: ${Bl[n]}`).join(`
25
- `)}function _g(){return Sg.map(n=>`- **${vg(n)}**: ${xg(n)}`).join(`
26
- `)}function Fl(n=br){let e=bg.toJSONSchema(n),t=JSON.stringify(e,null,2);return`# Knoflows workflow authoring instructions
20
+ `)}function er(n,e){return e==="free_text"?n:Mu(n)}function Mu(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 Ch,$h,Th,qh,eo=l(()=>{"use strict";Oe();Ch={user:"User preferences",organization:"Organization guidelines",project:"Project context"},$h=["user","organization","project"],Th={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."},qh={anthropic:"Anthropic",cursor:"Cursor"}});async function sn(n){let e=n.fetchFn??fetch;return n.type==="claude"?Fh(n.apiKey,e):Nh(n.apiKey,e)}async function Fh(n,e){let t=await e(Oh,{method:"GET",headers:{"x-api-key":n,"anthropic-version":Bh}});if(!t.ok)throw Hu("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 Nh(n,e){let t=await e(Dh,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw Hu("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 Hu(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 Oh,Dh,Bh,to=l(()=>{"use strict";Oh="https://api.anthropic.com/v1/models",Dh="https://api.cursor.com/v1/models",Bh="2023-06-01"});function oe(n){return{success:!1,message:n instanceof Error?n.message:String(n)}}function wt(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 bt=l(()=>{"use strict"});async function*Jh(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 Lh,an,is=l(()=>{"use strict";eo();Oe();to();bt();eo();Lh=tn("anthropic"),an=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Zn(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??Jh,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:er(a,e.outputFormat),sessionId:s}}async testConnection(){try{let e=await this.requireApiKey();return await sn({type:"claude",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return oe(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||Lh,t=await this.secrets.get(e);if(!t)throw Zr("anthropic",e);return t}}});function Wh(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function Mh(){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 Uh,cn,ss=l(()=>{"use strict";eo();Oe();to();bt();Uh=tn("cursor"),cn=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Zn(e),o=this.options.sdk??await Mh(),i=Wh(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:er(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async testConnection(){try{let e=await this.requireApiKey();return await sn({type:"cursor",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return oe(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||Uh,t=await this.secrets.get(e);if(!t)throw Zr("cursor",e);return t}}});function Ku(n){return typeof n=="object"&&n!=null&&typeof n.listExtendedActions=="function"&&typeof n.executeExtendedAction=="function"}function St(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 vt(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var tr=l(()=>{"use strict"});function nr(n){return n==null?"":typeof n=="string"?n:Gu(n).replace(/\n+$/,"")}function no(n){return{version:1,type:"doc",content:n.split(`
21
+ `).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function Gu(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(Gu).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
23
+ `:t}var as=l(()=>{"use strict"});function Kh(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function Qu(n){return{representation:"atlas_doc_format",value:JSON.stringify(no(n))}}function zu(n){return nr(Gh(n))}function Gh(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 Vh(n){return!(n.id==null||String(n.id)===""||n.type!=null&&n.type!=="page"||n.status!=null&&n.status!=="current")}function us(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:Qh(e,n),raw:n}}function Qh(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 zh(n,e){return{id:String(n.id??""),subjectId:e,body:zu(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var Hh,cs,Vu,ro,oo,un,io=l(()=>{"use strict";tr();as();bt();Hh="kno.confluence.apiToken",cs=50,Vu=10,ro=500,oo=[{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}]}],un=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()||Hh}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return us(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 zu(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=${cs}`,o=new Set;for(let i=0;i<Vu&&t.length<ro&&!(!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>=ro)break;t.push(zh(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:Qu(t)}})}listExtendedActions(){return oo}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${vt(this.listExtendedActions())}`)}async createPage(e){let t=oo[0];St(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:Qu(i)}});return us(u,s,this.instanceId)}async queryBySpaceKey(e){let t=await this.resolveSpaceId(e);return this.collectPages(`/wiki/api/v2/spaces/${encodeURIComponent(t)}/pages?limit=${cs}&status=current&depth=all`)}async queryByParentPageId(e){return(await this.collectPages(`/wiki/api/v2/pages/${encodeURIComponent(e)}/children?limit=${cs}`)).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<Vu&&r.length<ro&&!(!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>=ro)break;Vh(p)&&r.push(us(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 oe(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=Kh(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 Yh}from"node:crypto";var Xh,so,Yu=l(()=>{"use strict";Xh=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),so=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:Yh(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(Xh.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function ao(n){if(n==null)return[];let e=Array.isArray(n)?n:typeof n=="string"?n.split(/[,;\n]/):[],t=new Set,r=[];for(let o of e){let i=String(o).trim();!i||t.has(i)||(t.add(i),r.push(i))}return r}var ls=l(()=>{"use strict"});function We(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 ln(n,e){if(n.length>Xe)throw new Error(`${e} accepts at most ${Xe} repositories, got ${n.length}`)}var pn=l(()=>{"use strict";C()});function co(){return ey.replace(/\/$/,"")}function dn(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 ty(n,e){return`${n}#${e}`}function fs(n){let e=n.repoSlugs!==void 0?n.repoSlugs:n.repoSlug,t=We(e);return ln(t,"filter.repoSlugs"),t}function ny(n){let e=fs(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 ry(n){let e=fs(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 Xu(n){if(!el(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 oy(n){if(!(fs(n).length>0))return Xu(n)==="author"?"author":void 0}function Zu(n){if(!el(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 iy(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=Zu(n.state);return r&&e.push(`state="${r}"`),e.length>0?e.join(" AND "):void 0}function sy(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 ay(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 el(n){return n!=null&&n!==""}function xt(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function cy(n,e){let t=n.trim();if(!t)throw new Error("Bitbucket create_pr requires params.repository");if(!t.includes("/"))return t;let r=t.indexOf("/"),o=t.slice(0,r),i=t.slice(r+1);if(!i||i.includes("/"))throw new Error(`Bitbucket repository identifier must be '{workspace}/{repo_slug}' or '{repo_slug}', got '${n}'`);if(o!==e)throw new Error(`Bitbucket repository '${n}' does not match configured workspace '${e}'`);return i}function uy(n){let e=n.destination?.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e.trim();throw new Error("Bitbucket pull request is missing destination.repository.full_name")}function rr(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:ty(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},repoIdentifier:uy(n),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 ly(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 Zh,ey,uo,ps,ds,lo,fn,po=l(()=>{"use strict";tr();bt();ls();pn();Zh="kno.bitbucket.apiToken",ey="https://api.bitbucket.org/2.0";uo=50,ps=10,ds=500,lo=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]},{actionId:"create_pr",label:"Create pull request",params:[{name:"repository",label:"Repository",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"description",label:"Description",type:"string",required:!1},{name:"sourceBranch",label:"Source branch",type:"string",required:!0},{name:"targetBranch",label:"Target branch",type:"string",required:!0},{name:"reviewers",label:"Reviewers",type:"string[]",required:!1}]}],fn=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()||Zh}async get(e){let{repoSlug:t,prNumber:r}=dn(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return rr(i,t,this.instanceId)}async query(e){if(Xu(e)==="reviewer"){let r=ry(e),o=await this.accountUuid();return this.queryRepos(r,{...e,reviewerUuid:o})}return oy(e)?this.queryWorkspacePullRequests(e):this.queryRepos(ny(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=iy(t),i=new URLSearchParams({pagelen:String(uo)});o&&i.set("q",o);let s=`${co()}/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(uo)}),i=Zu(e.state);i&&o.set("state",i);let s=`${co()}/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=xt(t.uuid),o=xt(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<ps&&r.length<ds&&!(!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>=ds)break;r.push(rr(p,t??sy(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}=dn(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${uo}`;for(let u=0;u<ps&&i.length<ds&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),p=Array.isArray(c.values)?c.values:[];for(let g of p)i.push(ly(g,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}=dn(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}=dn(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}=dn(e),{workspace:i}=await this.requireConfig(),s=ay(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return lo}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);if(e==="create_pr")return this.createPullRequest(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${vt(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}=dn(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=xt(u.uuid),p=xt(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(j=>c!=null&&j.uuid===c||p!=null&&j.account_id===p))return rr(a,o,this.instanceId);let v=[...m.map(j=>j.uuid?{uuid:j.uuid}:{account_id:j.account_id}),c?{uuid:c}:{account_id:p}],k=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:v}});return rr(k,o,this.instanceId)}async createPullRequest(e){let t=lo.find(v=>v.actionId==="create_pr");St(t,e);let r=String(e.repository).trim(),o=String(e.title).trim(),i=String(e.sourceBranch).trim(),s=String(e.targetBranch).trim(),a=typeof e.description=="string"&&e.description.trim()!==""?e.description:void 0,u=ao(e.reviewers),{workspace:c}=await this.requireConfig(),p=cy(r,c),m=u.length>0?await this.resolveReviewerUuidsFromWorkspaceMembers(c,u):[],g=await this.request("POST",`/repositories/${encodeURIComponent(c)}/${encodeURIComponent(p)}/pullrequests`,{body:{title:o,...a!=null?{description:a}:{},source:{branch:{name:i}},destination:{branch:{name:s}},...m.length>0?{reviewers:m}:{}}});return g.destination?.repository?.full_name||(g.destination={...g.destination,branch:g.destination?.branch??{name:s},repository:{...g.destination?.repository,name:p,full_name:`${c}/${p}`}}),rr(g,p,this.instanceId)}async resolveReviewerUuidsFromWorkspaceMembers(e,t){let r=await this.listWorkspaceMembers(e),o=[];for(let i of t){let s=i.toLowerCase(),a=r.find(c=>{let p=xt(c.nickname,c.username)?.toLowerCase(),m=xt(c.display_name)?.toLowerCase(),g=xt(c.uuid)?.toLowerCase();return p===s||m===s||g===s}),u=xt(a?.uuid);if(!u)throw new Error(`Bitbucket create_pr could not resolve reviewer username '${i}' in workspace '${e}'`);o.push({uuid:u})}return o}async listWorkspaceMembers(e){let t=[],r=`${co()}/workspaces/${encodeURIComponent(e)}/members?pagelen=${uo}`,o=0;for(;r&&o<ps;){o+=1;let i=await this.request("GET",r);for(let s of i.values??[])s.user&&t.push(s.user);r=typeof i.next=="string"&&i.next.trim()!==""?i.next:void 0}return t}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=wt(e,r);if(o)return o}return{success:!0}}catch(e){return oe(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:`${co()}${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)}}});function ms(n){return n.pull_request!=null}function et(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}=hn(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 Ss(n,e,t){return`${n}/${e}#${t}`}function hn(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 dy(n){let e=n.repos!==void 0?n.repos:n.repo,t=We(e);return ln(t,"filter.repos"),t}function fy(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function my(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function hy(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: ${py.join(", ")}`)}function hs(n){let e=n.base?.repo?.full_name;return typeof e=="string"&&e.includes("/")?e.trim():yy(n)}function yy(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e.trim();let t=n.repository_url;if(typeof t=="string"){let o="/repos/",i=t.lastIndexOf(o);if(i>=0){let s=t.slice(i+o.length);if(s.includes("/"))return s}}let r=n.html_url;if(typeof r=="string"){let o=r.match(/github\.com\/([^/]+\/[^/]+)\//);if(o?.[1]?.includes("/"))return o[1]}throw new Error("GitHub search result is missing repository full_name")}function ys(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:Ss(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 gy(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function ho(n){return n!=null&&n!==""}var gs,ws,bs,fo,tl,mo,py,mn,yo=l(()=>{"use strict";bt();pn();gs="2026-03-10",ws="https://api.github.com",bs="kno.github.apiToken",fo=100,tl=10,mo=500,py=["open","closed/done/completed","not_planned/wontfix"],mn=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()||bs}async get(e){let{owner:t,repo:r,issueNumber:o}=et(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(ms(i))throw new Error(`Ticket not found: ${e}`);return ys(i,this.instanceId,hs(i))}async query(e){let t=dy(e);if(t.length>0)return this.queryRepos(t,e);let r=fy(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}=et(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>gy(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=et(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}=et(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:hy(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}=hn(e),i=[],s=new URLSearchParams;s.set("per_page",String(fo)),ho(t.state)&&s.set("state",String(t.state)),ho(t.labels)&&s.set("labels",String(t.labels)),ho(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=tl&&i.length<mo;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(!ms(p)){if(i.length>=mo)break;i.push(ys(p,this.instanceId,(()=>{try{return hs(p)}catch{return`${r}/${o}`}})()))}if(c.length<fo)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[my(e,r),"is:issue"];ho(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=tl&&s.length<mo;a++){let u=new URLSearchParams({q:i,per_page:String(fo),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(!ms(m)){if(s.length>=mo)break;s.push(ys(m,this.instanceId,hs(m)))}if(p.length<fo)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=wt(r,t);if(o)return o}return{success:!0}}catch(e){return oe(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=`${ws}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":gs};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)}}});function wy(n){let e=n.repos!==void 0?n.repos:n.repo,t=We(e);return ln(t,"filter.repos"),t}function by(n){if(n==null||n==="")return;let e=String(n).trim().toLowerCase();if(e!=="open"&&e!=="closed"&&e!=="all")throw new Error(`GitHub pull request query filter.state must be open, closed, or all, got '${String(n)}'`);return e}function vs(n,e,t){let r=String(n.number??""),o=typeof n.base?.repo?.full_name=="string"&&n.base.repo.full_name.includes("/")?n.base.repo.full_name.trim():t,{owner:i,name:s}=hn(o),a=typeof n.body=="string"?n.body:"";return{id:Ss(i,s,r),source:e,title:String(n.title??""),...a?{description:a}:{},repoIdentifier:o,sourceBranch:String(n.head?.ref??""),targetBranch:String(n.base?.ref??""),...n.user?.login?{author:n.user.login}:{},...n.html_url?{url:n.html_url}:{},raw:n}}var go,wo,xs=l(()=>{"use strict";tr();ls();bt();pn();yo();go=[{actionId:"create_pr",label:"Create pull request",params:[{name:"repository",label:"Repository",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"description",label:"Description",type:"string",required:!1},{name:"sourceBranch",label:"Source branch",type:"string",required:!0},{name:"targetBranch",label:"Target branch",type:"string",required:!0},{name:"reviewers",label:"Reviewers",type:"string[]",required:!1}]}],wo=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()||bs}async get(e){let{owner:t,repo:r,issueNumber:o}=et(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/pulls/${encodeURIComponent(o)}`);return vs(i,this.instanceId,`${t}/${r}`)}async query(e){let t=wy(e);if(t.length===0)throw new Error("GitHub pull request query requires filter.repos (owner/repo list)");let r=by(e.state);return(await Promise.all(t.map(i=>this.queryRepo(i,r)))).flat()}async queryRepo(e,t){let{owner:r,name:o}=hn(e),i=new URLSearchParams({per_page:"100",state:t??"open"}),s=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/pulls?${i.toString()}`);return(Array.isArray(s)?s:[]).map(a=>vs(a,this.instanceId,e))}async getComments(e){let{owner:t,repo:r,issueNumber:o}=et(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(s=>({id:String(s.id??""),subjectId:e,body:s.body??"",...s.user?.login?{author:s.user.login}:{},createdAt:s.created_at??""}))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=et(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}=et(e),s=t.trim().toLowerCase();if(s==="closed"||s==="declined"||s==="rejected"){await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/pulls/${encodeURIComponent(i)}`,{body:{state:"closed"}});return}if(s==="open"||s==="reopened"){await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/pulls/${encodeURIComponent(i)}`,{body:{state:"open"}});return}if(s==="merged"){await this.request("PUT",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/pulls/${encodeURIComponent(i)}/merge`,{body:{}});return}throw new Error(`No GitHub Pulls mapping for status '${t}'. Accepted: open/reopened, closed/declined/rejected, merged`)}listExtendedActions(){return go}async executeExtendedAction(e,t){if(e==="create_pr")return this.createPullRequest(t);throw new Error(`Provider 'github' has no extended action '${e}'. Available: ${vt(this.listExtendedActions())}`)}async createPullRequest(e){let t=go[0];St(t,e);let r=String(e.repository).trim(),o=String(e.title).trim(),i=String(e.sourceBranch).trim(),s=String(e.targetBranch).trim(),a=typeof e.description=="string"&&e.description.trim()!==""?e.description:void 0,u=ao(e.reviewers),{owner:c,name:p}=hn(r),m=await this.request("POST",`/repos/${encodeURIComponent(c)}/${encodeURIComponent(p)}/pulls`,{body:{title:o,head:i,base:s,...a!=null?{body:a}:{}}}),g=m.number;if(g==null)throw new Error("GitHub create_pr response is missing pull number");return u.length>0&&await this.request("POST",`/repos/${encodeURIComponent(c)}/${encodeURIComponent(p)}/pulls/${encodeURIComponent(String(g))}/requested_reviewers`,{body:{reviewers:u}}),vs(m,this.instanceId,`${c}/${p}`)}async testConnection(){try{await this.requireToken();let e=await this.request("GET","/user"),t=typeof e.login=="string"?e.login.trim():"",r=this.username;if(r&&t){let o=wt(r,t);if(o)return o}return{success:!0}}catch(e){return oe(e)}}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Pulls 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=`${ws}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":gs};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)}}});import{randomUUID as Sy}from"node:crypto";function vy(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var bo,nl=l(()=>{"use strict";bo=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=>vy(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:Sy(),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}}});var Bt,y,h,B,or,E=l(()=>{"use strict";Bt=class extends Error{details;constructor(e,t){super(e),this.name=this.constructor.name,this.details=t}},y=class extends Bt{httpStatus=404},h=class extends Bt{httpStatus=400},B=class extends Bt{httpStatus=409},or=class extends Error{details;constructor(e,t){super(e),this.name="StepFailureError",this.details=t}}});function jy(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(vo(n.project)&&e.push(`project = ${xo(n.project)}`),vo(n.status)&&e.push(`status = ${xo(n.status)}`),vo(n.assignee)&&e.push(`assignee = ${xo(n.assignee)}`),vo(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${xo(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 vo(n){return n!=null&&n!==""}function xo(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function rl(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=nr(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 xy,Iy,_y,So,yn,Is=l(()=>{"use strict";E();as();bt();xy="kno.jira.apiToken",Iy=50,_y=10,So=500,yn=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()||xy}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return rl(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=jy(e),o=[],i,s=new Set;for(let a=0;a<_y&&o.length<So;a++){let u={jql:r,maxResults:Math.min(Iy,So-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 g of p){if(o.length>=So)break;o.push(rl(g,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=So;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:nr(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:no(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=wt(e,r);if(o)return o}return{success:!0}}catch(e){return oe(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 Ry}from"node:crypto";function Ey(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var Io,ol=l(()=>{"use strict";Io=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=>Ey(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:Ry(),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 Me(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function _o(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function ky(n){return n==="jira"?"ticket":n==="github"?"any":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var sR,M,gn=l(()=>{"use strict";C();is();ss();io();Yu();po();xs();nl();yo();Is();ol();sR=Symbol("PROVIDER_REGISTRY");M=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(Je(e)){let o=Me(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new an(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new cn(t,{secretKey:e.secretKey,model:o}));return}if(!Ze(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=ky(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 yn(t,{instanceId:e.id,baseUrl:Me(e.config,"baseUrl"),email:Me(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){if(e.subjectType==="pull_request"){this.repos.set(e.id,new wo(t,{instanceId:e.id,username:Me(e.config,"username"),secretKey:e.secretKey}));return}this.tickets.set(e.id,new mn(t,{instanceId:e.id,username:Me(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new fn(t,{instanceId:e.id,email:Me(e.config,"email"),workspace:Me(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new un(t,{instanceId:e.id,baseUrl:Me(e.config,"baseUrl"),email:Me(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new Io([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new bo([],e.id));return}this.documentation.set(e.id,new so([],{instanceId:e.id,type:Me(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw _o(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw _o(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw _o(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw _o(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 cl(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{repoSlugs:sl(n,e),role:"reviewer",state:"OPEN"};case"repo-open-prs":return{repoSlugs:sl(n,e),state:"OPEN"};default:throw new y(`Unknown Bitbucket query template: ${n}`)}}function sl(n,e){let t=We(e.repoSlugs);if(t.length===0)throw new h(`Bitbucket template '${n}' requires params.repoSlugs`);if(t.length>Xe)throw new h(`Bitbucket template '${n}' params.repoSlugs accepts at most ${Xe} repositories, got ${t.length}`);return t}var il,al,ul=l(()=>{"use strict";E();pn();il={name:"repoSlugs",label:"Repositories",type:"string[]",required:!0},al=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[il]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[il]}]});function pl(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:Py(n,e),state:"open"};default:throw new y(`Unknown GitHub query template: ${n}`)}}function Py(n,e){let t=We(e.repos);if(t.length===0)throw new h(`GitHub template '${n}' requires params.repos`);if(t.length>Xe)throw new h(`GitHub template '${n}' params.repos accepts at most ${Xe} repositories, got ${t.length}`);return t}var ll,dl=l(()=>{"use strict";E();pn();ll=[{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 gl(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 = ${hl(ml(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${hl(ml(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new y(`Unknown Jira query template: ${n}`)}}function ml(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 hl(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var fl,yl,wl=l(()=>{"use strict";E();fl={name:"project",label:"Project key",type:"string",required:!0},yl=[{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:[fl]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[fl]}]});function vl(n,e){switch(n){case"all-pages-in-space":return{spaceKey:bl(n,e,"spaceKey")};case"pages-under-page":return{parentPageId:bl(n,e,"parentPageId")};case"manual-list":return{pageIds:[]};default:throw new y(`Unknown Confluence query template: ${n}`)}}function bl(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 Sl,xl=l(()=>{"use strict";E();Sl=[{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 _l,Injectable as $y}from"@nestjs/common";function Ty(n){return n==null?!0:typeof n=="string"?n.trim()==="":Array.isArray(n)?n.every(e=>typeof e!="string"||e.trim()===""):!1}var Ay,Cy,Il,jl,It,_s=l(()=>{"use strict";C();E();le();gn();ul();dl();wl();xl();Ay=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},Cy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Il=function(n,e){return function(t,r){e(t,r,n)}},jl={bitbucket:{list:()=>al,resolve:cl},github:{list:()=>ll,resolve:pl},jira:{list:()=>yl,resolve:gl},confluence:{list:()=>Sl,resolve:vl}},It=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?jl[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?jl[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&&Ty(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||!Ze(r)))return r.type}};It=Ay([$y(),Il(0,_l(_)),Il(1,_l(M)),Cy("design:paramtypes",[_,M])],It)});import{Inject as El,Injectable as Dy}from"@nestjs/common";var qy,Oy,Rl,By,je,jo=l(()=>{"use strict";C();le();io();po();xs();gn();qy=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},Oy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Rl=function(n,e){return function(t,r){e(t,r,n)}},By={bitbucket:()=>lo,confluence:()=>oo,github:n=>n==="pull_request"?go:[]},je=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)?[]:By[r.type]?.(r.subjectType)??[]}};je=qy([Dy(),Rl(0,El(_)),Rl(1,El(M)),Oy("design:paramtypes",[_,M])],je)});import{Inject as Rs,Injectable as Ly}from"@nestjs/common";var Fy,Ny,js,wn,_t,Ro=l(()=>{"use strict";C();le();Oe();E();to();Fy=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)},js=function(n,e){return function(t,r){e(t,r,n)}},wn="PREVIEW_MODELS_FETCH",_t=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(!Je(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 sn({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")}}};_t=Fy([Ly(),js(0,Rs(_)),js(1,Rs(ce)),js(2,Rs(wn)),Ny("design:paramtypes",[_,Function,Function])],_t)});import{Inject as ks,Injectable as Wy}from"@nestjs/common";function Ft(n,e){let t=n?.[e];return typeof t=="string"&&t.trim()?t.trim():void 0}var Jy,Uy,Es,Ps,As,Re,Eo=l(()=>{"use strict";C();le();Oe();E();Ro();Is();yo();po();io();is();ss();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},Uy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Es=function(n,e){return function(t,r){e(t,r,n)}},Ps="kno.probe.apiToken",As=class{value;constructor(e){this.value=e}async get(){return this.value}};Re=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(!Au(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 As(r);return this.createProvider(e,t,o).testConnection()}createProvider(e,t,r){let o={instanceId:"probe",secretKey:Ps};switch(e){case"jira":return new yn(r,{...o,baseUrl:Ft(t,"baseUrl"),email:Ft(t,"email")},this.fetchFn);case"bitbucket":return new fn(r,{...o,email:Ft(t,"email"),workspace:Ft(t,"workspace")},this.fetchFn);case"github":return new mn(r,{...o,username:Ft(t,"username")},this.fetchFn);case"confluence":return new un(r,{...o,baseUrl:Ft(t,"baseUrl"),email:Ft(t,"email")},this.fetchFn);case"claude":return new an(r,{secretKey:Ps,fetchFn:this.fetchFn});case"cursor":return new cn(r,{secretKey:Ps,fetchFn:this.fetchFn})}}};Re=Jy([Wy(),Es(0,ks(_)),Es(1,ks(ce)),Es(2,ks(wn)),Uy("design:paramtypes",[_,Function,Function])],Re)});import{Module as Hy}from"@nestjs/common";var My,jt,ko=l(()=>{"use strict";_i();La();Pi();Oe();Xn();le();os();gn();_s();jo();Ro();Eo();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},jt=class{};jt=My([Hy({imports:[nn,Ue],providers:[{provide:M,useFactory:async(n,e)=>{let t=await n.get();return M.fromSettings(t.providerInstances??[],e)},inject:[_,ce]},{provide:qn,useClass:br},gt,It,je,{provide:wn,useValue:(n,e)=>fetch(n,e)},_t,Re],exports:[M,qn,gt,It,je,_t,Re,wn]})],jt)});import{Injectable as Gy}from"@nestjs/common";var Ky,Ee,Po=l(()=>{"use strict";Ky=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},Ee=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)}};Ee=Ky([Gy()],Ee)});import{Global as Qy,Module as zy}from"@nestjs/common";var Vy,Rt,Ao=l(()=>{"use strict";Po();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},Rt=class{};Rt=Vy([Qy(),zy({providers:[Ee],exports:[Ee]})],Rt)});import{Injectable as Xy}from"@nestjs/common";import{resolve as Zy}from"node:path";var Yy,Et,Cs=l(()=>{"use strict";Yy=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},Et=class{tails=new Map;lockKey(e){let t=Zy(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}};Et=Yy([Xy()],Et)});import{Injectable as ng}from"@nestjs/common";import{execFile as rg}from"node:child_process";import{mkdirSync as $s,rmSync as og}from"node:fs";import{dirname as ig,join as $o,resolve as Co}from"node:path";import{promisify as sg}from"node:util";function kl(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function Pl(n){return $o(n,"worktrees")}function cg(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 eg,tg,ag,tt,Ts=l(()=>{"use strict";Cs();eg=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},tg=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ag=sg(rg),tt=class{worktreesRoot;fetchLocks;constructor(e,t=new Et){this.worktreesRoot=e,this.fetchLocks=t,$s(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??$o(this.worktreesRoot,e);return $s($o(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){$s($o(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 cg(t)}async resetWorktreeToRemote(e,t){let r=Co(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=Co(e);try{let r=await this.mainRepoPath(t);await this.git(r,["worktree","remove","--force",t])}catch{og(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=Co(e),{stdout:r}=await this.git(t,["rev-parse","--git-common-dir"]),o=Co(t,r.trim());return o.endsWith(".git")?ig(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 ag("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=kl(o.stderr),s=kl(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};tt=eg([ng(),tg("design:paramtypes",[String,Et])],tt)});import{Module as lg}from"@nestjs/common";import{mkdirSync as pg}from"node:fs";var ug,Al,To,Cl=l(()=>{"use strict";Sr();Ts();Cs();ug=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=Dn();pg(Al,{recursive:!0});To=class{};To=ug([lg({providers:[Et,{provide:tt,useFactory:n=>new tt(Pl(Al),n),inject:[Et]}],exports:[tt]})],To)});function bn(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=ir(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function $l(n){let e=n.trim();return(e.match(/^\{\{\s*([^}]+?)\s*\}\}$/)?.[1]??e).trim()}function ir(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 Nt(n,e){return typeof n=="string"?bn(n,e):Array.isArray(n)?n.map(t=>Nt(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,Nt(r,e)])):n}var qs=l(()=>{"use strict"});function ql(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=dg(i,e);if(r=s??i,s==null)return{kind:"no_match",sourceValue:r};o=s}if(t){let i=Tl(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:Tl(o),sourceValue:r}}function dg(n,e){if(!(n==null||typeof n!="object"))return ir(n,e)}function Tl(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):n==null?"":JSON.stringify(n)}var Ol=l(()=>{"use strict";qs()});function kt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=kt(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 H(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:H(o.stepExecutions,e,t)}))}:r)}function qo(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:qo(i.stepExecutions,e,t,r)}))}:o})}function Jt(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Jt(t.steps,e);if(r)return r}}}function Dl(n,e,t){return H(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 Os(n){let e=[];for(let t of n){t.childJobIds&&e.push(...t.childJobIds);for(let r of t.iterations??[])e.push(...Os(r.stepExecutions))}return e}var Bl=l(()=>{"use strict"});import{z as Z}from"zod";function Fl(n,e){let t=gg[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 fg,mg,hg,yg,gg,Nl=l(()=>{"use strict";fg=Z.object({questions:Z.array(Z.object({id:Z.string(),prompt:Z.string()}))}),mg=Z.object({approved:Z.boolean()}),hg=Z.object({suggestions:Z.array(Z.object({id:Z.string().min(1),file:Z.string().min(1),line:Z.number().int(),body:Z.string()}))}),yg=Z.string(),gg={questionnaire:fg,confirmation:mg,comment_suggestions:hg,free_text:yg}});function ke(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=>ke(o.status)),groupCount:t.size}}function Ll(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 Bs=l(()=>{"use strict"});async function Oo(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 Fs=l(()=>{"use strict";E()});import{Injectable as bg}from"@nestjs/common";var wg,Ut,Ns=l(()=>{"use strict";wg=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},Ut=class{requested=new Set;requestCancellation(e){this.requested.add(e)}isCancellationRequested(e){return this.requested.has(e)}clear(e){this.requested.delete(e)}};Ut=wg([bg()],Ut)});import{Inject as Ig,Injectable as _g}from"@nestjs/common";var Sg,vg,xg,Pe,Do=l(()=>{"use strict";C();le();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},vg=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xg=function(n,e){return function(t,r){e(t,r,n)}},Pe=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||!Je(r)?Yn:$u(r)}};Pe=Sg([_g(),xg(0,Ig(_)),vg("design:paramtypes",[Object])],Pe)});import{Logger as jg}from"@nestjs/common";import{readFile as Rg}from"node:fs/promises";async function Jl(n,e,t=new jg("resolveContextFiles"),r=o=>Rg(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 Ul=l(()=>{"use strict"});import{basename as Eg,dirname as kg,join as Pg,resolve as sr,sep as Wl}from"node:path";function Ag(n){return n.replace(/-/g,"").slice(0,4)}function Ml(n,e){return`${n}-${Ag(e)}`}function Ls(n){return n.replace(/[\\/:*?"<>|]/g,"-")}function Bo(n){let e=sr(n);return Pg(kg(e),`${Eg(e)}-worktrees`)}function Fo(n,e){let t=sr(n),r=sr(e);if(Pt(t,r))return!0;let o=t.endsWith(Wl)?t:t+Wl,i=process.platform==="win32"?r.toLowerCase():r,s=process.platform==="win32"?o.toLowerCase():o;return i.startsWith(s)}function Pt(n,e){let t=sr(n),r=sr(e);return process.platform==="win32"?t.toLowerCase()===r.toLowerCase():t===r}var Js=l(()=>{"use strict"});import{join as Hl}from"node:path";async function Kl(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=>Pt(m.localPath,a)),p=u??c;if(!p)throw new h(`Unknown local repository: ${a}`);r[i.name]=p.localPath}return r}function Cg(n,e){return`No local repository is registered for \`${n}\` (instance: \`${e}\`) \u2014 register one in Manage \u2192 Local Repositories, or provide \`repoPath\` directly`}function $g(n){let e=n.subjectContext;if(!e||e.mode!=="single")throw new Error("create_worktree with resolveRepoFromSubject requires subjectContext.mode === 'single' with a PullRequest subject");let t=e.subject;if(t.subjectType!=="pull_request")throw new Error(`create_worktree with resolveRepoFromSubject requires a PullRequest subject (got '${t.subjectType}')`);return t}function Tg(n,e){let t=e.repoIdentifier?.trim()??"";if(!t)throw new Error("PullRequest is missing repoIdentifier \u2014 cannot resolve a local repository from the subject");let r=n.find(o=>o.remoteRepo?.providerInstanceId===e.source&&o.remoteRepo.identifier===t);if(!r)throw new Error(Cg(t,e.source));return r}async function Gl(n){let{job:e,params:t,git:r,jobs:o,localRepositories:i}=n,s=await i.list(),a=t.resolveRepoFromSubject===!0,u,c;if(a){let j=$g(e);c=Tg(s,j),u=c.localPath,t.mode!=="existing-branch"&&Vl(t,"baseBranch")==null&&c.defaultBranch?.trim()&&(t.baseBranch=c.defaultBranch.trim())}else u=No(t,"repoPath"),c=s.find(j=>Pt(j.localPath,u));let p=t.mode==="existing-branch"?"existing-branch":"new-branch",m=c?.worktreeBasePath?.trim()?c.worktreeBasePath.trim():Bo(u);if(Fo(u,m)&&!Pt(u,m))throw new Error(`Worktree base '${m}' must not be inside the repository at '${u}'`);if(p==="existing-branch")return qg({job:e,repoPath:u,branch:No(t,"branch"),worktreeBase:m,explicitPath:typeof t.worktreePath=="string"?t.worktreePath:void 0,git:r,jobs:o});let g=No(t,"branchName"),v=Ml(g,e.id),k=typeof t.worktreePath=="string"&&t.worktreePath.trim()!==""?t.worktreePath:Hl(m,Ls(v));return r.createWorktree(e.id,{repoPath:u,baseBranch:No(t,"baseBranch"),branchName:v,worktreePath:k})}async function qg(n){let{job:e,repoPath:t,branch:r,worktreeBase:o,git:i,jobs:s}=n,a=await i.listWorktrees(t),u=a.filter(g=>g.branch===r&&!Pt(g.path,t)),c=a.find(g=>g.branch===r&&Pt(g.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 g=n.explicitPath&&n.explicitPath.trim()!==""?n.explicitPath:Hl(o,Ls(r));return i.addWorktreeForExistingBranch({repoPath:t,branch:r,worktreePath:g})}let p=u[0].path,m=await Og(s,p);if(m&&!ke(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 Og(n,e){let r=(await n.list({liveWorktree:!0})).filter(o=>o.worktreePath!=null&&Pt(o.worktreePath,e));return r.find(o=>!ke(o.status))??r.sort((o,i)=>i.updatedAt.localeCompare(o.updatedAt))[0]}function Vl(n,e){let t=n[e];if(!(typeof t!="string"||t.trim()===""))return t.trim()}function No(n,e){let t=Vl(n,e);if(t==null)throw new Error(`git step missing required param '${e}'`);return t}var Ql=l(()=>{"use strict";E();Js();Bs()});function zl(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(!zc(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function Yl(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 Xl(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var Lo=l(()=>{"use strict";C();E()});import{randomUUID as Dg}from"node:crypto";function Bg(){return Dg()}function Zl(n){let e=n.id??Bg(),t=$c(n.steps),r=ep(n.steps,t);return{...n,id:e,steps:r}}function ep(n,e){return n.map(t=>{let r=t.id;return r||(r=Pc(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:ep(t.steps,e)}:{...t,id:r}})}var tp=l(()=>{"use strict";C()});function Jo(n){return n.issues.map(e=>`${e.path.join(".")||"(root)"}: ${e.message}`).join("; ")}function Wt(n){let e=yt.safeParse(n);if(!e.success)throw new h(`Validation failed: ${Jo(e.error)}`);return e.data}function Sn(n){let e=Zl(n),t=Qn.safeParse(e);if(!t.success)throw new h(`Validation failed: ${Jo(t.error)}`);return Xl(t.data),t.data}async function vn(n,e){return n.create(Sn(Wt(e)))}async function Uo(n,e,t){let r=Sn({...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 ar=l(()=>{"use strict";C();E();Lo();tp()});async function np(n,e){let t=n.draftDefinition;if(t==null||t==="")throw new h("engine_action create_workflow requires params.draftDefinition");let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch(a){return{valid:!1,error:`draftDefinition is not valid JSON: ${a instanceof Error?a.message:String(a)}`,persisted:!1}}let o=n.persist===!0,i;try{i=Sn(Wt(r))}catch(a){if(a instanceof h)return{valid:!1,error:a.message,persisted:!1};if(a&&typeof a=="object"&&"issues"in a)return{valid:!1,error:`Validation failed: ${Jo(a)}`,persisted:!1};throw a}return o?{valid:!0,definition:await e.create(i),persisted:!0}:{valid:!0,definition:i,persisted:!1}}var rp=l(()=>{"use strict";ar();E()});import{Inject as de,Injectable as Lg,Logger as Jg}from"@nestjs/common";import{randomUUID as Wo}from"node:crypto";import{exec as Ug}from"node:child_process";import{promisify as Wg}from"node:util";async function Us(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 Kg(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 nt(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 Gg(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 Mo(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function Mt(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Vg(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 Qg(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?"array":typeof n}function zg(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 op(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 Fg,Ng,pe,Ws,Mg,Hg,ie,cr=l(()=>{"use strict";C();Ot();Kn();Rr();jr();Po();Ts();le();Er();Gn();gn();_i();tr();E();qs();Ol();Bl();Nl();Bs();Fs();Ns();Do();Ul();Ql();rp();Fg=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},Ng=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)}},Mg=Wg(Ug),Hg=new Set(["agent","shell","git","provider_action"]),ie=Ws=class{workflows;jobs;batches;views;events;providers;notifications;contextFiles;localRepositories;git;settings;cancellation;agentGate;logger=new Jg(Ws.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,p,m,g,v){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=g,this.agentGate=v,this.events.subscribe(k=>{let j=k;(j.type==="job_completed"||j.type==="job_failed"||j.type==="job_cancelled")&&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)}`);op(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:Wo(),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 Kl(t.inputSchema,e.inputValues,this.localRepositories);op(t.inputSchema,r);let o=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),i=new Date().toISOString();return this.jobs.create({id:Wo(),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=>!ke(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(ke(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=kt(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=Jt(o.steps,s.stepDefinitionId),u=t;if(a?.type==="interaction"&&a.interaction==="comment_review"){let T=nu(t);if(!T)throw new h(`comment_review step '${a.id}' resume requires { finalComments: { file, line, body }[] }`);u=T}let c=new Date().toISOString(),p=H(r.stepHistory,i,T=>({...T,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 g=Lt(r.stepHistory,i);if(!g)throw new Error(`Could not locate frame for execution ${i}`);let v=this.sequenceForFrameOnJob(r,o,g),k=g.index+1,j=await this.executeStepSequence(r,o,v,g.parentLoopExecutionId,g.iterationIndex,k);return j.outcome!=="completed"?j.job:g.parentLoopExecutionId!=null&&g.iterationIndex!=null?this.continueLoopAfterBody(j.job,o,g.parentLoopExecutionId,g.iterationIndex):this.completeJob(j.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=H(a.stepHistory,t.parentStepExecutionId,g=>({...g,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...g.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=kt(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(!Hg.has(i.type))throw new B(`Step-level retry is not available for '${i.type}' steps`);let s=await this.workflowForJob(r),a=Lt(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(du(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 g=await this.persistJob({...r,status:"planning",context:m,completedAt:void 0,currentStepId:i.stepDefinitionId,currentStepExecutionId:i.id,stepHistory:H(r.stepHistory,i.id,k=>({...k,status:"running",error:void 0,failureDetails:void 0,completedAt:void 0,output:void 0,startedAt:p})),updatedAt:p}),v=await this.executeStepSequence(g,s,u,a.parentLoopExecutionId,a.iterationIndex,a.index,i.id,t);return v.outcome!=="completed"?v.job:a.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(v.job,s,a.parentLoopExecutionId,a.iterationIndex):this.completeJob(v.job,s)}async cancelJob(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);if(ke(t.status))throw new B(`Job ${e} is already terminal (status: ${t.status})`);for(let i of Os(t.stepHistory)){let s=await this.jobs.get(i);s&&!ke(s.status)&&await this.cancelJob(i)}let r=await this.jobs.get(e);if(ke(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)ke(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 g=r[p],v=new Date().toISOString(),k=p===s?a:void 0;if(g.condition&&Or(g.condition,c.context)){if(c=await this.recordSkippedStep(c,g,k,o,i),c.status==="cancelled")return{outcome:"cancelled",job:c};continue}let j,T=c.stepHistory;if(k){let qe=kt(c.stepHistory,k);if(!qe)throw new Error(`Reuse execution ${k} not found on job ${c.id}`);j=qe}else j={id:Wo(),stepDefinitionId:g.id,type:g.type,status:"running",startedAt:v},T=qo(c.stepHistory,j,o,i);if(c=await this.persistJob({...c,status:c.status==="pending"?"planning":c.status,currentStepId:g.id,currentStepExecutionId:j.id,stepHistory:T,updatedAt:v}),c.status==="cancelled")return{outcome:"cancelled",job:c};this.emit({type:"step_started",jobId:c.id,stepDefinitionId:g.id,timestamp:v});try{let qe=await this.dispatchStep(c,t,g,j.id,o,i,k?u:void 0);c=qe.job;let en=await this.stopIfCancelled(c);if(en)return{outcome:"cancelled",job:en};if(qe.outcome!=="completed")return qe}catch(qe){let en=await this.failJob(c,t,j.id,g.id,qe);return en.status==="cancelled"?{outcome:"cancelled",job:en}:{outcome:"failed",job:en}}}return o!=null&&i!=null&&(c=await this.persistJob({...c,stepHistory:Dl(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"engine_action":return{outcome:"completed",job:await this.executeEngineActionStep(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);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 g={maxIterationsCheckpoint:!0,nextIteration:p,effectiveMaxIterations:u},v=new Date().toISOString(),k=H(c.stepHistory,o,j=>({...j,status:"pending",output:g}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:k,updatedAt:v}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:g,questions:[`Loop '${r.id}' reached maxIterations (${u}). Extend, continue, or cancel?`],timestamp:v}),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 g=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(g)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,p,0);if(c=m.job,m.outcome!=="completed")return m;if(Or(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=Jt(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 k=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(e.stepHistory,r.id,j=>({...j,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:k.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:k.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(k,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(k,t,a.id)}let p=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+p,g=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(e.stepHistory,r.id,k=>({...k,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:g.id,answers:i,timestamp:c});let v=await this.runLoopStep(g,t,a,r.id,u?.parentLoopExecutionId,u?.iterationIndex,s.nextIteration,m);return v.outcome!=="completed"?v.job:u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(v.job,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(v.job,t,a.id)}async resumeExtract(e,t,r,o){let i=Gg(o),s=Jt(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=Lt(e.stepHistory,r.id);if(!p)throw new Error(`Could not locate frame for execution ${r.id}`);let m=this.sequenceForFrameOnJob(c,t,p),g=p.index+1,v=await this.executeStepSequence(c,t,m,p.parentLoopExecutionId,p.iterationIndex,g);return v.outcome!=="completed"?v.job:p.parentLoopExecutionId!=null&&p.iterationIndex!=null?this.continueLoopAfterBody(v.job,t,p.parentLoopExecutionId,p.iterationIndex):this.completeJob(v.job,t)}async continueLoopAfterBody(e,t,r,o){let i=kt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Jt(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(Or(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=kt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Jt(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=H(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=Vg(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(!qc(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=$l(t.forEach.source);if(!i)throw new h(`sub_workflow step '${t.id}' forEach.source must be a non-empty path`);let s=ir(nt(e),i);if(!Array.isArray(s))throw new h(`sub_workflow forEach source '${i}' must resolve to an array (got ${Qg(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(T=>T.parentStepExecutionId===t.parentStepExecutionId),i=Ds(o,T=>T.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=kt(a.stepHistory,c);if(!p||p.type!=="sub_workflow")return;let m=s.some(T=>T.status==="failed");if(s.some(T=>T.status==="cancelled"))return;if(m){await this.failExecution(a,u,c,p.stepDefinitionId,"One or more child jobs failed");return}let v=s.slice().sort((T,qe)=>(T.fanOutIndex??0)-(qe.fanOutIndex??0)).map(T=>({fanOutIndex:T.fanOutIndex,jobId:T.id,output:T.context})),k=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[p.stepDefinitionId]:v},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(a.stepHistory,c,T=>({...T,status:"completed",completedAt:k,output:v})),completedAt:void 0,updatedAt:k}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:p.stepDefinitionId,timestamp:k});let j=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=Ll(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),g=p.notificationOverride??m.notificationPolicy,v=u==="completed"?"on_complete":"on_fail";g.triggers.includes(v)&&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 Oo(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 Jl(t.contextFileIds??[],this.contextFiles,this.logger),i=nt(e),s=bn(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}:{}}),g=Fl(t.outputFormat,m.parsed);return this.finishExecution(u,r,t.id,g)}finally{c&&this.agentGate.release(a)}}async setExecutionStatus(e,t,r){let o=new Date().toISOString(),i=H(e.stepHistory,t,s=>({...s,status:r}));return this.persistJob({...e,stepHistory:i,updatedAt:o})}async executeGitStep(e,t,r){let o=Nt(t.params,nt(e));switch(t.operation){case"create_worktree":{let i=await Gl({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=Mo(e),s=Mt(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=Mo(e),s=Mt(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Mo(e),s=await this.git.commit(i,{message:Mt(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Mo(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 executeEngineActionStep(e,t,r){let o=Nt(t.params,nt(e))??{};switch(t.action){case"create_workflow":{let i=await np(o,this.workflows);return this.finishExecution(e,r,t.id,i)}default:{let i=t.action;throw new Error(`Unknown engine action: ${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??Nt(t.params??{},nt(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=bn(t.target.subjectId,nt(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,Mt(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=pu(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 or(`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,Mt(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Mt(r,"status")),{status:Mt(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=this.providers.getInstance(i.providerId);if(!s||!Ze(s))throw new Error(`This workflow requires provider instance '${i.providerId}', which isn't configured`);let a=s.subjectType==="documentation"?this.providers.getDocumentationProvider(i.providerId):s.subjectType==="ticket"?this.providers.getTicketProvider(i.providerId):s.subjectType==="pull_request"?this.providers.getRepoProvider(i.providerId):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${s.subjectType}`);if(!Ku(a))throw new Error(`Provider instance '${i.providerId}' does not support extended actions. Available: none`);let u=await a.listExtendedActions(),c=u.find(g=>g.actionId===i.actionId);if(!c)throw new Error(`Provider '${i.providerId}' has no extended action '${i.actionId}'. Available: ${vt(u)}`);let p=Nt(i.params??{},nt(e))??{};St(c,p);let m=await a.executeExtendedAction(i.actionId,{...p,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,m)}async executeShellStep(e,t,r){let o=bn(t.command,nt(e)),i=e.worktreePath??process.cwd();try{let s=await Mg(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=bn(r.source,nt(e)),s=ql({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=H(e.stepHistory,o,g=>({...g,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=H(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=Du(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:tu(r,t.steps,e.context)};let o=Kg(t,r.id);if(o!=null)return e.context[o];if(r.interaction==="confirmation"){let i=e.context["validate-draft"];return i&&typeof i=="object"&&"definition"in i?{prompt:"Review the validated workflow draft before creating it.",definition:i.definition}:{prompt:`Confirm: ${r.name}`}}}async recordSkippedStep(e,t,r,o,i){let s=new Date().toISOString(),a=Vc(t.condition,e.context),u=e.stepHistory,c=r;if(c)u=H(e.stepHistory,c,m=>({...m,status:"skipped",completedAt:s,output:a,error:void 0}));else{let m={id:Wo(),stepDefinitionId:t.id,type:t.type,status:"skipped",completedAt:s,output:a};c=m.id,u=qo(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=H(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 or?i.details:void 0,u=new Date().toISOString(),c=H(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=zg(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 Us(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return Us(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return Us(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};ie=Ws=Fg([Lg(),pe(0,de(D)),pe(1,de(Y)),pe(2,de(ye)),pe(3,de(he)),pe(4,de(Ee)),pe(5,de(M)),pe(6,de(qn)),pe(7,de(ge)),pe(8,de(X)),pe(9,de(tt)),pe(10,de(_)),pe(11,de(Ut)),pe(12,de(Pe)),Ng("design:paramtypes",[D,Y,ye,he,Ee,M,Object,ge,X,tt,Object,Ut,Pe])],ie)});import{Module as Xg}from"@nestjs/common";var Yg,xn,Ms=l(()=>{"use strict";Xn();ko();Ao();Cl();cr();Ns();Do();Yg=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},xn=class{};xn=Yg([Xg({imports:[Ue,jt,Rt,To],providers:[Ut,Pe,ie],exports:[ie,Pe]})],xn)});import{Catch as ew}from"@nestjs/common";var Zg,Ho,ip=l(()=>{"use strict";E();Zg=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},Ho=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message,...e.details??{}})}};Ho=Zg([ew(Bt)],Ho)});var x,se=l(()=>{"use strict";E();x=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{z as Ht}from"zod";async function ap(n,e){let t=Wt(e.workflowDefinition),r=t.id;if(!r)return{workflow:await vn(n,t),created:!0};let o=await n.get(r);if(!o)return{workflow:await vn(n,t),created:!0};if(e.resolution==="update")return{workflow:await Uo(n,r,t),created:!1};if(e.resolution==="create_new"){let{id:i,...s}=t;return{workflow:await vn(n,s),created:!0}}throw new B(`A workflow named '${o.name}' already exists`,{conflictingWorkflowId:o.id,conflictingWorkflowName:o.name})}var Ko,sp,Hs=l(()=>{"use strict";E();ar();Ko=Ht.object({workflowDefinition:Ht.unknown(),resolution:Ht.enum(["update","create_new"]).optional()}),sp=Ht.object({error:Ht.string(),conflictingWorkflowId:Ht.string(),conflictingWorkflowName:Ht.string()})});import{z as tw}from"zod";function rw(n){if(n.type==="loop")return"not offered as `{{stepId}}` tokens; reference inner steps. Exit conditions use `until.stepId`.";let e=Xc(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 ow(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 iw(){return Object.keys(zn).map(t=>{let r=zn[t].map(o=>`\`{{subject.${o}}}\``).join(", ");return`- **${t}**: ${r}`}).join(`
24
+ `)}function sw(){return Object.keys(cp).map(n=>`- **${n}**: ${cp[n]}`).join(`
25
+ `)}function aw(){return nw.map(n=>`- **${ow(n)}**: ${rw(n)}`).join(`
26
+ `)}function Go(n=qr){let e=tw.toJSONSchema(n),t=JSON.stringify(e,null,2);return`# Knoflows workflow authoring instructions
27
27
 
28
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
29
 
@@ -51,7 +51,7 @@ Inside a loop, each iteration overwrites that step's output; a later reference i
51
51
 
52
52
  Known \`{{subject.field}}\` paths per \`SubjectType\` (same table as the builder's Available Parameters panel):
53
53
 
54
- ${jg()}
54
+ ${iw()}
55
55
 
56
56
  Standalone workflows (\`appliesTo: "none"\`) have no subject; do not use \`{{subject.*}}\` there.
57
57
 
@@ -59,7 +59,7 @@ Standalone workflows (\`appliesTo: "none"\`) have no subject; do not use \`{{sub
59
59
 
60
60
  Hand-maintained blurbs \u2014 cosmetic only. The JSON Schema below is authoritative for fields.
61
61
 
62
- ${Ig()}
62
+ ${sw()}
63
63
 
64
64
  ## Step definition JSON Schema
65
65
 
@@ -73,7 +73,7 @@ ${t}
73
73
 
74
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
75
 
76
- ${_g()}
76
+ ${aw()}
77
77
 
78
78
  For \`get_subject\` without \`target\`, fields depend on the workflow's \`appliesTo\` subject type(s).
79
79
 
@@ -81,6 +81,10 @@ For \`get_subject\` without \`target\`, fields depend on the workflow's \`applie
81
81
 
82
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
83
 
84
+ ### \`create_pr\` ordering
85
+
86
+ Bitbucket and GitHub expose \`create_pr\` as an \`extendedAction\` (same escape hatch as Confluence \`create_page\`). A pull request can only be created from a branch that already exists on the remote \u2014 place a real \`git\` \`push\` step before \`create_pr\`. The builder does not enforce that ordering; treat it as an authoring rule. Repo identity for \`create_pr\` comes from a \`LocalRepository\` (catalog dropdown / manual path, or a \`localRepository\` workflow input earlier in the flow) via \`remoteRepo\`, not from \`resolveRepoFromSubject\` (there is no PR subject yet).
87
+
84
88
  \`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
89
 
86
90
  ### \`sub_workflow.forEach\`
@@ -109,7 +113,15 @@ A confirmation gate on the following work step uses \`field_equals\` with \`valu
109
113
  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
114
 
111
115
  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 Bl,Sg,Nl=l(()=>{"use strict";C();Bl={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."},Sg=[{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 Is,Controller as Pg,Delete as Eg,Get as Co,Header as Rg,HttpCode as kg,Inject as Ag,Param as To,Patch as Cg,Post as Ll,Query as Tg,Res as Jl}from"@nestjs/common";var Ye,T,_e,ge,Ml=l(()=>{"use strict";C();kt();E();ce();ko();js();Nl();Ye=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 Fl()}async importDefinition(e,t){let r=await Dl(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=`${ki(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 vt(this.workflows,e)}async update(e,t){return Ro(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}`)}};Ye([Co(),_e(0,Tg("subjectHandling")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"list",null);Ye([Co("instructions"),Rg("Content-Type","text/markdown; charset=utf-8"),T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",String)],ge.prototype,"instructions",null);Ye([Ll("import"),_e(0,Is(new v(Ao))),_e(1,Jl({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[Object,Object]),T("design:returntype",Promise)],ge.prototype,"importDefinition",null);Ye([Co(":id/export"),_e(0,To("id")),_e(1,Jl({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],ge.prototype,"exportDefinition",null);Ye([Co(":id"),_e(0,To("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"get",null);Ye([Ll(),_e(0,Is()),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],ge.prototype,"create",null);Ye([Cg(":id"),_e(0,To("id")),_e(1,Is(new v(lt))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],ge.prototype,"update",null);Ye([Eg(":id"),kg(204),_e(0,To("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ge.prototype,"remove",null);ge=Ye([Pg("workflows"),_e(0,Ag(D)),T("design:paramtypes",[D])],ge)});function $g(n){return Wl(n.workflowDefinition.steps,"steps")}function Ul(n){let e=$g(n);if(e.length>0)throw new Error(`Workflow library entry '${n.id}' is not portable: ${e.join(", ")}`)}function Wl(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(...Wl(r.steps,`${i}.steps`))}),t}var Kl=l(()=>{"use strict"});function Hl(){return structuredClone(_s)}function Vl(n){let e=_s.find(t=>t.id===n);return e?structuredClone(e):void 0}var Og,qg,_s,Gl=l(()=>{"use strict";Kl();Og={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"]}}},qg={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}}
116
+ `}var cp,nw,Ks=l(()=>{"use strict";C();cp={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.",engine_action:"Runs an Engine-owned capability (e.g. validate/persist a drafted WorkflowDefinition).",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."},nw=[{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:"engine_action",id:"create-workflow",name:"Create workflow",action:"create_workflow",params:{draftDefinition:"{{parse-draft}}"}},{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"}]});function up(n){let e=n.providerInstances.length===0?"_No provider instances configured._":n.providerInstances.map(o=>{let i=n.extendedActionsByInstanceId[o.id]??[],s=i.length===0?" - _(no extended actions)_":i.map(u=>{let c=u.params.length===0?"":` (params: ${u.params.map(p=>p.name).join(", ")})`;return` - \`${u.actionId}\` \u2014 ${u.label}${c}`}).join(`
117
+ `),a=o.kind==="subject"?`
118
+ - subjectType: \`${o.subjectType}\``:"";return[`### Provider instance \`${o.id}\``,`- type: \`${o.type}\``,`- kind: \`${o.kind}\``,`- displayName: ${o.displayName}${a}`,"- extendedActions:",s].join(`
119
+ `)}).join(`
120
+
121
+ `),t=n.localRepositories.length===0?"_No local repositories registered._":n.localRepositories.map(o=>{let i=o.remoteRepo?`remote: providerInstanceId=\`${o.remoteRepo.providerInstanceId}\`, identifier=\`${o.remoteRepo.identifier}\``:"remote: _(none)_";return`- **${o.name}** (\`${o.id}\`) localPath=\`${o.localPath}\`; ${i}`}).join(`
122
+ `),r=Go();return["## Current Engine configuration (author against these real ids)","","### Provider instances",e,"","### Local repositories",t,"","## WorkflowDefinition structural reference","",r].join(`
123
+ `)}function lp(n){let e=["You are authoring a Knoflows WorkflowDefinition for this Engine install.","The user described the workflow they want as:","","{{description}}","","Produce a single JSON object matching WorkflowDefinitionInput (omit top-level `id`;","step `id`s may be omitted \u2014 the Engine assigns them). Reply with ONLY the JSON object,","no markdown fences or commentary.","","If a previous validation error is present below, fix that draft instead of starting over:","{{validate-draft.error}}","",n].join(`
124
+ `);return{id:Gs,name:"Create Workflow",description:"Internal: draft a WorkflowDefinition from a plain-language description, validate, review, then persist.",appliesTo:"none",subjectHandling:"per-subject",inputSchema:[{name:"description",label:"Workflow description",type:"string",required:!0}],steps:[{type:"loop",id:"validate-and-refine",name:"Validate and refine",maxIterations:5,onMaxIterations:{action:"ask_human"},until:{type:"field_equals",stepId:"validate-draft",field:"valid",value:!0},steps:[{type:"agent",id:"draft-workflow",name:"Draft workflow",objective:e,outputFormat:"free_text"},{type:"extract",id:"parse-draft",name:"Parse draft",source:"{{draft-workflow}}",pattern:"(\\{[\\s\\S]*\\})",onNoMatch:"fail"},{type:"engine_action",id:"validate-draft",name:"Validate draft",action:"create_workflow",params:{draftDefinition:"{{parse-draft}}"}}]},{type:"interaction",id:"review-before-creating",name:"Review before creating",interaction:"confirmation"},{type:"engine_action",id:"persist-workflow",name:"Persist workflow",action:"create_workflow",params:{draftDefinition:"{{validate-draft.definition}}",persist:!0},condition:{type:"field_equals",stepId:"review-before-creating",field:"approved",value:!1}}],notificationPolicy:{triggers:["on_needs_input","on_fail"]}}}function pp(n){return n.startsWith("internal:")}var Gs,Vs=l(()=>{"use strict";Ks();Gs="internal:create-workflow"});import{Body as Qs,Controller as cw,Delete as uw,Get as Vo,Header as lw,HttpCode as pw,Inject as dw,Param as Qo,Patch as fw,Post as dp,Query as mw,Res as fp}from"@nestjs/common";var rt,$,Ae,Se,mp=l(()=>{"use strict";C();Ot();E();se();ar();Hs();Ks();Vs();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},$=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ae=function(n,e){return function(t,r){e(t,r,n)}},Se=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(await this.workflows.list(e?{subjectHandling:e}:{})).filter(r=>!pp(r.id))}instructions(){return Go()}async importDefinition(e,t){let r=await ap(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=`${Qi(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 vn(this.workflows,e)}async update(e,t){return Uo(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}`)}};rt([Vo(),Ae(0,mw("subjectHandling")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Se.prototype,"list",null);rt([Vo("instructions"),lw("Content-Type","text/markdown; charset=utf-8"),$("design:type",Function),$("design:paramtypes",[]),$("design:returntype",String)],Se.prototype,"instructions",null);rt([dp("import"),Ae(0,Qs(new x(Ko))),Ae(1,fp({passthrough:!0})),$("design:type",Function),$("design:paramtypes",[Object,Object]),$("design:returntype",Promise)],Se.prototype,"importDefinition",null);rt([Vo(":id/export"),Ae(0,Qo("id")),Ae(1,fp({passthrough:!0})),$("design:type",Function),$("design:paramtypes",[String,Object]),$("design:returntype",Promise)],Se.prototype,"exportDefinition",null);rt([Vo(":id"),Ae(0,Qo("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Se.prototype,"get",null);rt([dp(),Ae(0,Qs()),$("design:type",Function),$("design:paramtypes",[Object]),$("design:returntype",Promise)],Se.prototype,"create",null);rt([fw(":id"),Ae(0,Qo("id")),Ae(1,Qs(new x(yt))),$("design:type",Function),$("design:paramtypes",[String,Object]),$("design:returntype",Promise)],Se.prototype,"update",null);rt([uw(":id"),pw(204),Ae(0,Qo("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Se.prototype,"remove",null);Se=rt([cw("workflows"),Ae(0,dw(D)),$("design:paramtypes",[D])],Se)});function hw(n){return yp(n.workflowDefinition.steps,"steps")}function hp(n){let e=hw(n);if(e.length>0)throw new Error(`Workflow library entry '${n.id}' is not portable: ${e.join(", ")}`)}function yp(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(...yp(r.steps,`${i}.steps`))}),t}var gp=l(()=>{"use strict"});function wp(){return structuredClone(zs)}function bp(n){let e=ww.get(n);if(e)return structuredClone(e);let t=zs.find(r=>r.id===n);return t?structuredClone(t):void 0}var yw,gw,zs,ww,Sp=l(()=>{"use strict";gp();yw={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"]}}},gw={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
125
  PR title: {{subject.title}}
114
126
  PR description: {{subject.description}}
115
127
 
@@ -119,5 +131,5 @@ Checklist: {{build-requirements-checklist}}`,outputFormat:"free_text"},{type:"sh
119
131
  {{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
132
  Acceptance: {{acceptance-criteria-review}}
121
133
  Code quality: {{code-quality-review}}
122
- Testing: {{testing-review}}`,outputFormat:"free_text"}],notificationPolicy:{triggers:["on_fail","on_complete"]}}},_s=[Og,qg];for(let n of _s)Ul(n)});import{Controller as Dg,Get as Bg,Inject as Fg,Param as Ng,Post as Lg}from"@nestjs/common";var Ps,Lt,Ql,mn,zl=l(()=>{"use strict";kt();E();Gl();ko();Ps=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},Lt=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ql=function(n,e){return function(t,r){e(t,r,n)}},mn=class{workflows;constructor(e){this.workflows=e}list(){return Hl()}async add(e){let t=Vl(e);if(!t)throw new y(`Workflow library entry not found: ${e}`);let r=structuredClone(t.workflowDefinition);return delete r.id,vt(this.workflows,r)}};Ps([Bg(),Lt("design:type",Function),Lt("design:paramtypes",[]),Lt("design:returntype",Array)],mn.prototype,"list",null);Ps([Lg(":id/add"),Ql(0,Ng("id")),Lt("design:type",Function),Lt("design:paramtypes",[String]),Lt("design:returntype",Promise)],mn.prototype,"add",null);mn=Ps([Dg("workflow-library"),Ql(0,Fg(D)),Lt("design:paramtypes",[D])],mn)});import{Body as Rs,Controller as Jg,Delete as Mg,Get as ks,HttpCode as Ug,Inject as Es,Param as $o,Patch as Yl,Post as Wg,Query as Kg}from"@nestjs/common";var jt,O,Pe,Ee,Xl=l(()=>{"use strict";C();ur();kt();E();ce();Eo();un();hs();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},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);El(r,e,t)}};jt([ks(),Pe(0,Kg("subjectType")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"list",null);jt([Yl("reorder"),Pe(0,Rs(new v(gr))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],Ee.prototype,"reorder",null);jt([ks(":id/subjects"),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"listSubjects",null);jt([ks(":id"),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"get",null);jt([Wg(),Pe(0,Rs(new v(hr))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],Ee.prototype,"create",null);jt([Yl(":id"),Pe(0,$o("id")),Pe(1,Rs(new v(yr))),O("design:type",Function),O("design:paramtypes",[String,Object]),O("design:returntype",Promise)],Ee.prototype,"update",null);jt([Mg(":id"),Ug(204),Pe(0,$o("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],Ee.prototype,"remove",null);Ee=jt([Jg("views"),Pe(0,Es(le)),Pe(1,Es(D)),Pe(2,Es(W)),O("design:paramtypes",[le,D,W])],Ee)});import{Body as As,Controller as Hg,Delete as Vg,Get as ep,HttpCode as Gg,Inject as Zl,Param as Cs,Patch as tp,Post as Qg}from"@nestjs/common";var Jt,N,It,Je,np=l(()=>{"use strict";C();Pi();kt();E();ce();Eo();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},N=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},It=function(n,e){return function(t,r){e(t,r,n)}},Je=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);Rl(t,e)}};Jt([ep(),N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",Promise)],Je.prototype,"list",null);Jt([tp("reorder"),It(0,As(new v(Ar))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Je.prototype,"reorder",null);Jt([ep(":id"),It(0,Cs("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Je.prototype,"get",null);Jt([Qg(),It(0,As(new v(Rr))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Je.prototype,"create",null);Jt([tp(":id"),It(0,Cs("id")),It(1,As(new v(kr))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],Je.prototype,"update",null);Jt([Vg(":id"),Gg(204),It(0,Cs("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Je.prototype,"remove",null);Je=Jt([Hg("workflow-shortcuts"),It(0,Zl(He)),It(1,Zl(D)),N("design:paramtypes",[He,D])],Je)});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 Ts=l(()=>{"use strict"});import{z as L}from"zod";var Do,Bo,Fo,No,Lo,$s=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 zg,Get as Ds,HttpCode as rp,Inject as Os,Param as Qn,Post as Mt,Query as Xe}from"@nestjs/common";import"zod";function qs(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var Re,R,q,Yg,ne,op=l(()=>{"use strict";_o();qn();E();ce();Ts();$s();bo();Re=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},R=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)}},Yg=["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!==""&&!Yg.includes(t))throw new h(`Invalid status filter: ${t}`);let p=qs(i,"topLevelOnly"),m=qs(s,"terminal"),w=qs(a,"liveWorktree"),{limit:x,offset:P}=Oo(u,c),I=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(I,x,P)}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)}};Re([Ds(),q(0,Xe("workflowId")),q(1,Xe("status")),q(2,Xe("batchId")),q(3,Xe("parentJobId")),q(4,Xe("topLevelOnly")),q(5,Xe("terminal")),q(6,Xe("liveWorktree")),q(7,Xe("limit")),q(8,Xe("offset")),R("design:type",Function),R("design:paramtypes",[String,String,String,String,String,String,String,String,String]),R("design:returntype",Promise)],ne.prototype,"list",null);Re([Ds("queued"),R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Array)],ne.prototype,"listQueued",null);Re([Mt("latest-by-subject"),rp(200),q(0,Gn(new v(Fo))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ne.prototype,"latestBySubject",null);Re([Mt("delete-worktrees"),rp(200),q(0,Gn(new v(No))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ne.prototype,"deleteWorktrees",null);Re([Ds(":id"),q(0,Qn("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ne.prototype,"get",null);Re([Mt(),q(0,Gn(new v(Do))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ne.prototype,"create",null);Re([Mt(":id/resume"),q(0,Qn("id")),q(1,Gn(new v(Bo))),R("design:type",Function),R("design:paramtypes",[String,Object]),R("design:returntype",Promise)],ne.prototype,"resume",null);Re([Mt(":id/retry"),q(0,Qn("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ne.prototype,"retry",null);Re([Mt(":id/retry-step"),q(0,Qn("id")),q(1,Gn(new v(Lo))),R("design:type",Function),R("design:paramtypes",[String,Object]),R("design:returntype",Promise)],ne.prototype,"retryStep",null);Re([Mt(":id/cancel"),q(0,Qn("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ne.prototype,"cancel",null);ne=Re([zg("jobs"),q(0,Os(Y)),q(1,Os(Ie)),q(2,Os(je)),R("design:paramtypes",[Y,Ie,je])],ne)});import{z as re}from"zod";var Jo,Mo,Bs=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))})]),Mo=re.object({workflowId:re.string().min(1),selection:Jo,triggeredBy:re.enum(["schedule","view_bulk","multiselect"]),notificationOverride:Dn.optional(),inputValues:re.record(re.string(),re.unknown())})});import{Body as Xg,Controller as Zg,Get as Ls,Inject as Fs,Param as Js,Post as ip,Query as Ns}from"@nestjs/common";import"zod";var hn,V,Me,Ze,sp=l(()=>{"use strict";_o();lr();qn();E();ce();Ts();Bs();hn=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)},Me=function(n,e){return function(t,r){e(t,r,n)}},Ze=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)}};hn([Ls(),Me(0,Ns("workflowId")),Me(1,Ns("limit")),Me(2,Ns("offset")),V("design:type",Function),V("design:paramtypes",[String,String,String]),V("design:returntype",Promise)],Ze.prototype,"list",null);hn([Ls(":id"),Me(0,Js("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ze.prototype,"get",null);hn([Ls(":id/jobs"),Me(0,Js("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ze.prototype,"listJobs",null);hn([ip(),Me(0,Xg(new v(Mo))),V("design:type",Function),V("design:paramtypes",[Object]),V("design:returntype",Promise)],Ze.prototype,"launch",null);hn([ip(":id/cancel"),Me(0,Js("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Ze.prototype,"cancel",null);Ze=hn([Zg("batches"),Me(0,Fs(pe)),Me(1,Fs(Y)),Me(2,Fs(Ie)),V("design:paramtypes",[pe,Y,Ie])],Ze)});import{Body as ap,Controller as ew,Delete as tw,Get as cp,HttpCode as nw,Inject as rw,Param as Ms,Patch as ow,Post as iw,Query as sw}from"@nestjs/common";var yn,G,Ut,et,up=l(()=>{"use strict";C();Ii();E();ce();yn=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)},Ut=function(n,e){return function(t,r){e(t,r,n)}},et=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}`)}};yn([cp(),Ut(0,sw("enabled")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],et.prototype,"list",null);yn([cp(":id"),Ut(0,Ms("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],et.prototype,"get",null);yn([iw(),Ut(0,ap(new v(Yt))),G("design:type",Function),G("design:paramtypes",[Object]),G("design:returntype",Promise)],et.prototype,"create",null);yn([ow(":id"),Ut(0,Ms("id")),Ut(1,ap(new v(Yt.partial().omit({id:!0})))),G("design:type",Function),G("design:paramtypes",[String,Object]),G("design:returntype",Promise)],et.prototype,"update",null);yn([tw(":id"),nw(204),Ut(0,Ms("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],et.prototype,"remove",null);et=yn([ew("schedules"),Ut(0,rw(Ke)),G("design:paramtypes",[Ke])],et)});import{Controller as aw,Inject as cw,Query as lp,Sse as uw}from"@nestjs/common";import{Observable as dp}from"rxjs";var pp,Uo,Us,zn,fp=l(()=>{"use strict";po();pp=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},Uo=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 dp(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()}})}};pp([uw(),Us(0,lp("jobId")),Us(1,lp("batchId")),Uo("design:type",Function),Uo("design:paramtypes",[String,String]),Uo("design:returntype",dp)],zn.prototype,"stream",null);zn=pp([aw("events"),Us(0,cw(xe)),Uo("design:paramtypes",[xe])],zn)});import{extendZodWithOpenApi as lw}from"@asteasolutions/zod-to-openapi";import{z as pw}from"zod";var mp=l(()=>{"use strict";lw(pw)});import{z as hp}from"zod";var Wo,Ws=l(()=>{"use strict";Wo=hp.object({value:hp.string().min(1)})});import{z as ke}from"zod";var aA,dw,yp,gp=l(()=>{"use strict";aA=ke.object({path:ke.string().optional(),mode:ke.enum(["directories","files"]).optional(),extensions:ke.string().optional()}),dw=ke.object({name:ke.string().min(1),path:ke.string().min(1),isDirectory:ke.boolean()}),yp=ke.object({path:ke.string().min(1),entries:ke.array(dw)})});import{z as d}from"zod";function $w(n){let e=d.toJSONSchema(n),{$schema:t,...r}=e;return r}function bp(n){let e=(t,r)=>n.registerComponent("schemas",t,$w(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",Bn),WorkflowDefinitionInput:e("WorkflowDefinitionInput",lt),UpdateWorkflowBody:e("UpdateWorkflowBody",_w),SubjectView:e("SubjectView",mr),CreateSubjectViewBody:e("CreateSubjectViewBody",hr),ReorderViewsBody:e("ReorderViewsBody",gr),UpdateViewBody:e("UpdateViewBody",Ew),WorkflowShortcut:e("WorkflowShortcut",Er),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",Rr),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",kr),ReorderShortcutsBody:e("ReorderShortcutsBody",Ar),Schedule:e("Schedule",Yt),UpdateScheduleBody:e("UpdateScheduleBody",Rw),EngineSettings:e("EngineSettings",Tr),UpdateSettingsBody:e("UpdateSettingsBody",Aw),SettingsPatchResponse:e("SettingsPatchResponse",Tw),ProviderInstanceConfig:e("ProviderInstanceConfig",Cr),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Or),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",qr),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",Cw),SetSecretBody:e("SetSecretBody",Wo),CreateJobBody:e("CreateJobBody",Do),ResumeJobBody:e("ResumeJobBody",Bo),RetryStepBody:e("RetryStepBody",Lo),LatestBySubjectBody:e("LatestBySubjectBody",Fo),LatestBySubjectResponse:e("LatestBySubjectResponse",kw),LaunchBody:e("LaunchBody",Mo),Job:e("Job",Ks),QueuedAgentStep:e("QueuedAgentStep",bw),JobBatch:e("JobBatch",wp),LaunchResponse:e("LaunchResponse",Sw),HealthResponse:e("HealthResponse",xw),ProviderStatus:e("ProviderStatus",vw),QueryTemplate:e("QueryTemplate",ec),ProviderActionDescriptor:e("ProviderActionDescriptor",tc),PreviewModelsBody:e("PreviewModelsBody",Dr),PreviewModel:e("PreviewModel",eu),TestConnectionBody:e("TestConnectionBody",Br),TestConnectionResult:e("TestConnectionResult",nu),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",fr),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",nc),ErrorResponse:e("ErrorResponse",jw),EngineEvent:e("EngineEvent",Iw),Subject:e("Subject",Ko),WorkflowLibraryEntry:e("WorkflowLibraryEntry",Pw),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",yp),ImportWorkflowBody:e("ImportWorkflowBody",Ao),ImportConflictResponse:e("ImportConflictResponse",ql)}}var fw,mw,hw,yw,Ko,gw,ww,bw,Ks,wp,Sw,xw,vw,jw,Iw,_w,Pw,Ew,Rw,kw,Aw,Cw,Tw,k,Hs,Vs=l(()=>{"use strict";mp();C();$s();Bs();Ws();gp();js();fw=d.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),mw=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()}),hw=d.object({subjectType:d.literal("pull_request"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),repoIdentifier:d.string().min(1),sourceBranch:d.string(),targetBranch:d.string(),author:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),yw=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",[mw,hw,yw]),gw=d.discriminatedUnion("mode",[d.object({mode:d.literal("single"),subject:Ko}),d.object({mode:d.literal("collection"),subjects:d.array(Ko)})]),ww=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()}),bw=d.object({jobId:d.string(),stepExecutionId:d.string(),agentInstanceId:d.string(),enqueuedAt:d.string()}),Ks=d.object({id:d.string(),workflowId:d.string(),status:fw,subjectContext:gw.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:Bn.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(ww),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().optional()}),wp=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:Dn.optional(),notificationSent:d.boolean(),createdAt:d.string(),completedAt:d.string().optional()}),Sw=d.discriminatedUnion("kind",[d.object({kind:d.literal("job"),job:Ks}),d.object({kind:d.literal("batch"),batch:wp})]),xw=d.object({ok:d.boolean(),service:d.string(),timestamp:d.string()}),vw=d.object({providerId:d.string(),secretKey:d.string(),configured:d.boolean()}),jw=d.object({error:d.string()}),Iw=d.object({type:d.string(),timestamp:d.string()}).passthrough(),_w=lt,Pw=d.object({id:d.string().min(1),source:d.enum(["example","community","official"]),name:d.string().min(1),description:d.string(),workflowDefinition:lt}),Ew=yr,Rw=Yt.partial().omit({id:!0}),kw=d.record(d.string(),Ks.nullable()),Aw=$r,Cw=d.object({settings:Tr,restartRequired:d.literal(!0)}),Tw=d.object({settings:Tr,restartRequired:d.boolean()}),k=d.object({id:d.string().min(1)}),Hs=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 Sp(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:Hs.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:Hs.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 xp=l(()=>{"use strict";C();Vs()});import{OpenAPIRegistry as Ow,OpenApiGeneratorV31 as qw}from"@asteasolutions/zod-to-openapi";function vp(){if(Ho)return Ho;let n=new Ow,e=bp(n);return Sp(n,e),Ho=new qw(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,jp=l(()=>{"use strict";Vs();xp()});import{Controller as Dw,Get as Bw,Header as Fw}from"@nestjs/common";var Ip,Gs,Yn,_p=l(()=>{"use strict";jp();Ip=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},Gs=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Yn=class{getOpenApiDocument(){return vp()}};Ip([Bw("openapi.json"),Fw("Content-Type","application/json"),Gs("design:type",Function),Gs("design:paramtypes",[]),Gs("design:returntype",void 0)],Yn.prototype,"getOpenApiDocument",null);Yn=Ip([Dw()],Yn)});import{Controller as Nw,Get as Qs,Inject as Xn,Param as Vo,Post as zs,Body as Ys,HttpCode as Xs}from"@nestjs/common";var Wt,J,we,Ue,Pp=l(()=>{"use strict";Fi();es();ts();co();uo();C();ce();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},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)}}};Wt([Qs("status"),J("design:type",Function),J("design:paramtypes",[]),J("design:returntype",Promise)],Ue.prototype,"status",null);Wt([zs("preview-models"),Xs(200),we(0,Ys(new v(Dr))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ue.prototype,"previewAvailableModels",null);Wt([zs("test-connection"),Xs(200),we(0,Ys(new v(Br))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ue.prototype,"testConnection",null);Wt([Qs(":providerId/query-templates"),we(0,Vo("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ue.prototype,"listQueryTemplates",null);Wt([Qs(":providerId/actions"),we(0,Vo("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ue.prototype,"listExtendedActions",null);Wt([zs(":providerId/query-templates/:templateId/resolve"),Xs(200),we(0,Vo("providerId")),we(1,Vo("templateId")),we(2,Ys(new v(fr))),J("design:type",Function),J("design:paramtypes",[String,String,Object]),J("design:returntype",Promise)],Ue.prototype,"resolveQueryTemplate",null);Ue=Wt([Nw("providers"),we(0,Xn(pt)),we(1,Xn(ft)),we(2,Xn(mt)),we(3,Xn(ht)),we(4,Xn(Se)),J("design:paramtypes",[pt,ft,mt,ht,Se])],Ue)});import{Body as Lw,Controller as Jw,Get as Mw,Inject as Uw,Patch as Ww}from"@nestjs/common";var Zs,Kt,Ep,gn,Rp=l(()=>{"use strict";C();he();ce();Zs=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},Kt=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ep=function(n,e){return function(t,r){e(t,r,n)}},gn=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:du(e)}}};Zs([Mw(),Kt("design:type",Function),Kt("design:paramtypes",[]),Kt("design:returntype",Promise)],gn.prototype,"get",null);Zs([Ww(),Ep(0,Lw(new v($r))),Kt("design:type",Function),Kt("design:paramtypes",[Object]),Kt("design:returntype",Promise)],gn.prototype,"update",null);gn=Zs([Jw("settings"),Ep(0,Uw(_)),Kt("design:paramtypes",[_])],gn)});function ea(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return Ne(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 kp(n){let{defaultAgent:e,...t}=n;return t}var Ap=l(()=>{"use strict";C()});import{Body as Tp,Controller as Kw,Delete as Hw,Get as $p,HttpCode as Op,Inject as Cp,Param as Go,Patch as Vw,Post as qp}from"@nestjs/common";var Ht,M,_t,We,Dp=l(()=>{"use strict";C();he();E();ce();Ap();uo();Ht=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)}},We=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=kp(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:ea({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:ea({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}}};Ht([$p(),M("design:type",Function),M("design:paramtypes",[]),M("design:returntype",Promise)],We.prototype,"list",null);Ht([$p(":id"),_t(0,Go("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"get",null);Ht([qp(":id/test-connection"),Op(200),_t(0,Go("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"testConnection",null);Ht([qp(),_t(0,Tp(new v(Or))),M("design:type",Function),M("design:paramtypes",[Object]),M("design:returntype",Promise)],We.prototype,"create",null);Ht([Vw(":id"),_t(0,Go("id")),_t(1,Tp(new v(qr))),M("design:type",Function),M("design:paramtypes",[String,Object]),M("design:returntype",Promise)],We.prototype,"update",null);Ht([Hw(":id"),Op(200),_t(0,Go("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"remove",null);We=Ht([Kw("provider-instances"),_t(0,Cp(_)),_t(1,Cp(Se)),M("design:paramtypes",[_,Se])],We)});import{Body as Gw,Controller as Qw,HttpCode as zw,Inject as Yw,Param as Xw,Post as Zw}from"@nestjs/common";var Bp,Qo,ta,Zn,Fp=l(()=>{"use strict";Ce();E();ce();Ws();Bp=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)},ta=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)}};Bp([Zw(":key"),zw(204),ta(0,Xw("key")),ta(1,Gw(new v(Wo))),Qo("design:type",Function),Qo("design:paramtypes",[String,Object]),Qo("design:returntype",Promise)],Zn.prototype,"set",null);Zn=Bp([Qw("secrets"),ta(0,Yw(oe)),Qo("design:paramtypes",[Function])],Zn)});import{readFile as eb}from"node:fs/promises";async function na(n){try{await eb(n,"utf8")}catch(e){let t=e instanceof Error?e.message:String(e);throw new h(`Cannot read context file at '${n}': ${t}`)}}var Np=l(()=>{"use strict";E()});import{Body as Lp,Controller as tb,Delete as nb,Get as Jp,HttpCode as rb,Inject as ob,Param as ra,Patch as ib,Post as sb}from"@nestjs/common";import{randomUUID as ab}from"node:crypto";var bn,Q,wn,tt,Mp=l(()=>{"use strict";C();pr();E();ce();Np();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},Q=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)}},tt=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 na(e.path),this.files.create({id:e.id??ab(),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 na(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}`)}};bn([Jp(),Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",Promise)],tt.prototype,"list",null);bn([Jp(":id"),wn(0,ra("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],tt.prototype,"get",null);bn([sb(),wn(0,Lp(new v(vr))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],tt.prototype,"create",null);bn([ib(":id"),wn(0,ra("id")),wn(1,Lp(new v(jr))),Q("design:type",Function),Q("design:paramtypes",[String,Object]),Q("design:returntype",Promise)],tt.prototype,"update",null);bn([nb(":id"),rb(204),wn(0,ra("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],tt.prototype,"remove",null);tt=bn([tb("context-files"),wn(0,ob(de)),Q("design:paramtypes",[de])],tt)});import{execFile as cb}from"node:child_process";import{stat as ub}from"node:fs/promises";import{resolve as oa}from"node:path";import{promisify as lb}from"node:util";async function ia(n){let e=oa(n);try{if((await pb("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 sa(n,e){let t=oa(n),r=oa(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 ub(r)).isDirectory())throw new h(`Worktree base '${r}' exists and is not a directory`)}catch(o){if(o instanceof h)throw o}}var pb,Up=l(()=>{"use strict";E();ws();pb=lb(cb)});import{Body as Wp,Controller as db,Delete as fb,Get as Kp,HttpCode as mb,Inject as hb,Param as aa,Patch as yb,Post as gb}from"@nestjs/common";import{randomUUID as wb}from"node:crypto";var xn,z,Sn,nt,Hp=l(()=>{"use strict";C();dr();E();ce();Up();xn=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)},Sn=function(n,e){return function(t,r){e(t,r,n)}},nt=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 ia(e.localPath),await sa(e.localPath,e.worktreeBasePath),this.repos.create({id:e.id??wb(),name:e.name,localPath:e.localPath,...e.worktreeBasePath?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch?{defaultBranch:e.defaultBranch}:{},...e.remoteRepo?{remoteRepo:e.remoteRepo}:{}})}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 ia(o),await sa(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}`)}};xn([Kp(),z("design:type",Function),z("design:paramtypes",[]),z("design:returntype",Promise)],nt.prototype,"list",null);xn([Kp(":id"),Sn(0,aa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],nt.prototype,"get",null);xn([gb(),Sn(0,Wp(new v(_r))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],nt.prototype,"create",null);xn([yb(":id"),Sn(0,aa("id")),Sn(1,Wp(new v(Pr))),z("design:type",Function),z("design:paramtypes",[String,Object]),z("design:returntype",Promise)],nt.prototype,"update",null);xn([fb(":id"),mb(204),Sn(0,aa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],nt.prototype,"remove",null);nt=xn([db("local-repositories"),Sn(0,hb(fe)),z("design:paramtypes",[fe])],nt)});import{readdir as bb,stat as Sb}from"node:fs/promises";import{homedir as xb}from"node:os";import{join as vb,resolve as jb}from"node:path";async function Vp(n,e={}){let t=n?.trim()?n.trim():xb(),r=jb(t),o;try{o=await Sb(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 bb(r,{encoding:"utf8",withFileTypes:!0})).filter(a=>a.name!=="."&&a.name!=="..").map(a=>({name:a.name,path:vb(r,a.name),isDirectory:a.isDirectory()})).filter(a=>Ib(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 Gp(n){if(n==null||n.trim()==="")return;let e=n.split(",").map(t=>zp(t)).filter(t=>t!=null);return e.length>0?e:void 0}function Qp(n){if(!(n==null||n.trim()==="")){if(n==="directories"||n==="files")return n;throw new h(`Invalid browse mode '${n}'`)}}function Ib(n,e){if(e.mode==="directories")return n.isDirectory;if(n.isDirectory)return!0;let t=e.extensions?.map(o=>zp(o)).filter(Boolean);if(!t?.length)return!0;let r=n.name.toLowerCase();return t.some(o=>r.endsWith(o))}function zp(n){let e=n.trim().toLowerCase();if(e.length!==0)return e.startsWith(".")?e:`.${e}`}var Yp=l(()=>{"use strict";E()});import{Controller as _b,Get as Pb,Query as la}from"@nestjs/common";var Xp,ca,ua,er,Zp=l(()=>{"use strict";Yp();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},ca=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ua=function(n,e){return function(t,r){e(t,r,n)}},er=class{async browse(e,t,r){return Vp(e,{mode:Qp(t),extensions:Gp(r)})}};Xp([Pb("browse"),ua(0,la("path")),ua(1,la("mode")),ua(2,la("extensions")),ca("design:type",Function),ca("design:paramtypes",[String,String,String]),ca("design:returntype",Promise)],er.prototype,"browse",null);er=Xp([_b("filesystem")],er)});import{Module as Rb}from"@nestjs/common";import{APP_FILTER as kb}from"@nestjs/core";var Eb,zo,ed=l(()=>{"use strict";Ln();xs();fo();Pl();Ml();zl();Xl();np();op();sp();up();fp();_p();Pp();Rp();Dp();Fp();Mp();Hp();Zp();lo();ui();Eb=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=Eb([Rb({imports:[Le,fn,gt,yt,Qt],controllers:[ge,mn,Ee,Je,ne,Ze,et,zn,Yn,Ue,gn,We,Zn,tt,nt,er],providers:[{provide:kb,useClass:Po}]})],zo)});import{Module as Cb}from"@nestjs/common";var Ab,Yo,td=l(()=>{"use strict";ma();ha();ya();lo();fo();Ln();xs();ed();Ab=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=Ab([Cb({imports:[tr,nr,yt,gt,Le,fn,zo],controllers:[vn]})],Yo)});import{apiReference as Tb}from"@scalar/nestjs-api-reference";function nd(n){n.use("/api/docs",Tb({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var rd=l(()=>{"use strict"});import{createServer as $b}from"node:net";function od(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function pa(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await Ob(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function Ob(n){return new Promise(e=>{let t=$b();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var id=l(()=>{"use strict"});import{Catch as Bb,HttpStatus as Xo,NotFoundException as Fb}from"@nestjs/common";import{existsSync as sd,statSync as Nb}from"node:fs";import{extname as ad,join as da,normalize as Lb,relative as Jb,sep as Mb}from"node:path";function cd(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=Ub(e.path??"/");if(o){let i=da(n,o);if(Wb(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(ud(e)){ld(t,n,i=>{i&&!t.headersSent&&t.status(Xo.NOT_FOUND).end()});return}t.status(Xo.NOT_FOUND).end()}}function ud(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=ad(e);return!(t&&t!==".html")}function ld(n,e,t){n.sendFile("index.html",{root:e},t)}function Ub(n){if(n==="/"||n==="")return"index.html";let e=Lb(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!ad(e)?null:e}function Wb(n,e){if(!sd(e))return!1;try{if(!Nb(e).isFile())return!1}catch{return!1}let t=Jb(n,e);return t!==""&&!t.startsWith(`..${Mb}`)&&!t.startsWith("..")}function pd(n){return da(n,"index.html")}var qb,Db,Zo,dd=l(()=>{"use strict";qb=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},Db=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(ud(o)&&sd(da(this.staticRoot,"index.html"))){ld(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=qb([Bb(Fb),Db("design:paramtypes",[String])],Zo)});import{existsSync as Kb}from"node:fs";import{dirname as Hb,join as ei}from"node:path";import{fileURLToPath as Vb}from"node:url";function fd(){let n=Hb(Vb(import.meta.url)),e=[ei(n,"../static"),ei(n,"../../static"),ei(n,"static")];for(let t of e)if(Kb(ei(t,"index.html")))return t;return null}var md=l(()=>{"use strict"});var Xb={};import"reflect-metadata";import{existsSync as Gb}from"node:fs";import{Logger as Qb}from"@nestjs/common";import{NestFactory as zb}from"@nestjs/core";async function Yb(){let n=await zb.create(Yo);n.enableCors(),n.setGlobalPrefix("api"),nd(n);let e=fd(),t=e?pd(e):null;e&&t&&Gb(t)?(ti.log(`Serving UI from ${e}`),n.use(cd(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 pa(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(!od(s))throw s;o=await pa(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var ti,hd=l(()=>{"use strict";td();rd();id();dd();md();ti=new Qb("Bootstrap");Yb()});import{readFileSync as Zb}from"node:fs";function eS(){let n=Zb(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(eS()):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(()=>(hd(),Xb));
134
+ Testing: {{testing-review}}`,outputFormat:"free_text"}],notificationPolicy:{triggers:["on_fail","on_complete"]}}},zs=[yw,gw],ww=new Map;for(let n of zs)hp(n)});function vp(n){let e=structuredClone(n.workflowDefinition);delete e.id;let t=Sn(Wt(e));return n.source!=="organization"?t:{...t,sourceLibraryEntryId:n.id,sourceSnapshot:bw(t)}}function bw(n){let{id:e,sourceLibraryEntryId:t,sourceSnapshot:r,...o}=n;return o}var xp=l(()=>{"use strict";ar()});import{Controller as Sw,Get as vw,Inject as xw,Param as Iw,Post as _w}from"@nestjs/common";var Ys,Kt,Ip,In,_p=l(()=>{"use strict";Ot();E();Sp();xp();Ys=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},Kt=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)}},In=class{workflows;constructor(e){this.workflows=e}list(){return wp()}async add(e){let t=bp(e);if(!t)throw new y(`Workflow library entry not found: ${e}`);return this.workflows.create(vp(t))}};Ys([vw(),Kt("design:type",Function),Kt("design:paramtypes",[]),Kt("design:returntype",Array)],In.prototype,"list",null);Ys([_w(":id/add"),Ip(0,Iw("id")),Kt("design:type",Function),Kt("design:paramtypes",[String]),Kt("design:returntype",Promise)],In.prototype,"add",null);In=Ys([Sw("workflow-library"),Ip(0,xw(D)),Kt("design:paramtypes",[D])],In)});import{Body as jw,Controller as Rw,Get as Ew,HttpCode as kw,Inject as zo,Post as Pw}from"@nestjs/common";import{z as jp}from"zod";var Xs,Gt,ur,Aw,_n,Rp=l(()=>{"use strict";se();E();le();Gn();jo();cr();Vs();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},Gt=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ur=function(n,e){return function(t,r){e(t,r,n)}},Aw=jp.object({description:jp.string().min(1)}),_n=class{runner;settings;localRepos;extendedActions;constructor(e,t,r,o){this.runner=e,this.settings=t,this.localRepos=r,this.extendedActions=o}async createWorkflowStatus(){return(await this.settings.get()).defaultAgentInstanceId?{available:!0}:{available:!1,reason:"Configure a default agent instance in Settings to use Create Workflow with AI."}}async startCreateWorkflow(e){let t=await this.settings.get();if(!t.defaultAgentInstanceId)throw new h("Create Workflow with AI requires EngineSettings.defaultAgentInstanceId");let r=t.providerInstances??[],o={};for(let u of r)o[u.id]=await this.extendedActions.list(u.id);let i=await this.localRepos.list(),s=up({providerInstances:r,extendedActionsByInstanceId:o,localRepositories:i}),a=lp(s);return this.runner.start({workflowId:Gs,workflowSnapshot:a,inputValues:{description:e.description}})}};Xs([Ew("create-workflow/status"),Gt("design:type",Function),Gt("design:paramtypes",[]),Gt("design:returntype",Promise)],_n.prototype,"createWorkflowStatus",null);Xs([Pw("create-workflow"),kw(201),ur(0,jw(new x(Aw))),Gt("design:type",Function),Gt("design:paramtypes",[Object]),Gt("design:returntype",Promise)],_n.prototype,"startCreateWorkflow",null);_n=Xs([Rw("internal-workflows"),ur(0,zo(ie)),ur(1,zo(_)),ur(2,zo(X)),ur(3,zo(je)),Gt("design:paramtypes",[ie,_,X,je])],_n)});import{Body as ea,Controller as Cw,Delete as $w,Get as ta,HttpCode as Tw,Inject as Zs,Param as Yo,Patch as Ep,Post as qw,Query as Ow}from"@nestjs/common";var At,O,Ce,$e,kp=l(()=>{"use strict";C();jr();Ot();E();se();Lo();gn();Fs();At=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)},Ce=function(n,e){return function(t,r){e(t,r,n)}},$e=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=ue.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 Oo(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);zl(r,e,t)}};At([ta(),Ce(0,Ow("subjectType")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],$e.prototype,"list",null);At([Ep("reorder"),Ce(0,ea(new x($r))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],$e.prototype,"reorder",null);At([ta(":id/subjects"),Ce(0,Yo("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],$e.prototype,"listSubjects",null);At([ta(":id"),Ce(0,Yo("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],$e.prototype,"get",null);At([qw(),Ce(0,ea(new x(Ar))),O("design:type",Function),O("design:paramtypes",[Object]),O("design:returntype",Promise)],$e.prototype,"create",null);At([Ep(":id"),Ce(0,Yo("id")),Ce(1,ea(new x(Cr))),O("design:type",Function),O("design:paramtypes",[String,Object]),O("design:returntype",Promise)],$e.prototype,"update",null);At([$w(":id"),Tw(204),Ce(0,Yo("id")),O("design:type",Function),O("design:paramtypes",[String]),O("design:returntype",Promise)],$e.prototype,"remove",null);$e=At([Cw("views"),Ce(0,Zs(he)),Ce(1,Zs(D)),Ce(2,Zs(M)),O("design:paramtypes",[he,D,M])],$e)});import{Body as na,Controller as Dw,Delete as Bw,Get as Ap,HttpCode as Fw,Inject as Pp,Param as ra,Patch as Cp,Post as Nw}from"@nestjs/common";var Vt,N,Ct,He,$p=l(()=>{"use strict";C();Ki();Ot();E();se();Lo();Vt=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)},Ct=function(n,e){return function(t,r){e(t,r,n)}},He=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);Yl(t,e)}};Vt([Ap(),N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",Promise)],He.prototype,"list",null);Vt([Cp("reorder"),Ct(0,na(new x(Hr))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],He.prototype,"reorder",null);Vt([Ap(":id"),Ct(0,ra("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],He.prototype,"get",null);Vt([Nw(),Ct(0,na(new x(Wr))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],He.prototype,"create",null);Vt([Cp(":id"),Ct(0,ra("id")),Ct(1,na(new x(Mr))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],He.prototype,"update",null);Vt([Bw(":id"),Fw(204),Ct(0,ra("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],He.prototype,"remove",null);He=Vt([Dw("workflow-shortcuts"),Ct(0,Pp(Ye)),Ct(1,Pp(D)),N("design:paramtypes",[Ye,D])],He)});function Xo(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 Zo(n,e,t){return n.slice(t,t+e)}var oa=l(()=>{"use strict"});import{z as L}from"zod";var ei,ti,ni,ri,oi,ia=l(()=>{"use strict";ei=L.object({workflowId:L.string().min(1),subjectId:L.string().min(1).optional(),inputValues:L.record(L.string(),L.unknown())}),ti=L.object({response:L.unknown()}),ni=L.object({workflowId:L.string().min(1),subjectIds:L.array(L.string().min(1))}),ri=L.object({jobIds:L.array(L.string().min(1)).min(1)}),oi=L.object({overrideParams:L.record(L.string(),L.unknown()).optional()})});import{Body as lr,Controller as Lw,Get as si,HttpCode as Tp,Inject as sa,Param as pr,Post as Qt,Query as Ke}from"@nestjs/common";import"zod";function ii(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var ve,R,q,Jw,ee,qp=l(()=>{"use strict";C();cr();Kn();E();se();oa();ia();Do();ve=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},R=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)}},Jw=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];ee=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!==""&&!Jw.includes(t))throw new h(`Invalid status filter: ${t}`);let p=ii(i,"topLevelOnly"),m=ii(s,"terminal"),g=ii(a,"liveWorktree"),{limit:v,offset:k}=Xo(u,c),j=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}:{},...g===!0?{liveWorktree:!0}:{}});return Zo(j,v,k)}listQueued(){return this.agentGate.listQueued()}async listActive(e){let t=ii(e,"topLevelOnly"),r=await this.jobs.list({terminal:!1,...t===!0?{topLevelOnly:!0}:{}});return mu(r,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)}};ve([si(),q(0,Ke("workflowId")),q(1,Ke("status")),q(2,Ke("batchId")),q(3,Ke("parentJobId")),q(4,Ke("topLevelOnly")),q(5,Ke("terminal")),q(6,Ke("liveWorktree")),q(7,Ke("limit")),q(8,Ke("offset")),R("design:type",Function),R("design:paramtypes",[String,String,String,String,String,String,String,String,String]),R("design:returntype",Promise)],ee.prototype,"list",null);ve([si("queued"),R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Array)],ee.prototype,"listQueued",null);ve([si("active"),q(0,Ke("topLevelOnly")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ee.prototype,"listActive",null);ve([Qt("latest-by-subject"),Tp(200),q(0,lr(new x(ni))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ee.prototype,"latestBySubject",null);ve([Qt("delete-worktrees"),Tp(200),q(0,lr(new x(ri))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ee.prototype,"deleteWorktrees",null);ve([si(":id"),q(0,pr("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ee.prototype,"get",null);ve([Qt(),q(0,lr(new x(ei))),R("design:type",Function),R("design:paramtypes",[Object]),R("design:returntype",Promise)],ee.prototype,"create",null);ve([Qt(":id/resume"),q(0,pr("id")),q(1,lr(new x(ti))),R("design:type",Function),R("design:paramtypes",[String,Object]),R("design:returntype",Promise)],ee.prototype,"resume",null);ve([Qt(":id/retry"),q(0,pr("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ee.prototype,"retry",null);ve([Qt(":id/retry-step"),q(0,pr("id")),q(1,lr(new x(oi))),R("design:type",Function),R("design:paramtypes",[String,Object]),R("design:returntype",Promise)],ee.prototype,"retryStep",null);ve([Qt(":id/cancel"),q(0,pr("id")),R("design:type",Function),R("design:paramtypes",[String]),R("design:returntype",Promise)],ee.prototype,"cancel",null);ee=ve([Lw("jobs"),q(0,sa(Y)),q(1,sa(ie)),q(2,sa(Pe)),R("design:paramtypes",[Y,ie,Pe])],ee)});import{z as ae}from"zod";var ai,ci,aa=l(()=>{"use strict";C();ai=ae.discriminatedUnion("mode",[ae.object({mode:ae.literal("view"),viewId:ae.string().min(1)}),ae.object({mode:ae.literal("manual"),subjectType:ue,subjectIds:ae.array(ae.string().min(1))})]),ci=ae.object({workflowId:ae.string().min(1),selection:ai,triggeredBy:ae.enum(["schedule","view_bulk","multiselect"]),notificationOverride:Vn.optional(),inputValues:ae.record(ae.string(),ae.unknown())})});import{Body as Uw,Controller as Ww,Get as la,Inject as ca,Param as pa,Post as Op,Query as ua}from"@nestjs/common";import"zod";var jn,G,Ge,ot,Dp=l(()=>{"use strict";cr();Rr();Kn();E();se();oa();aa();jn=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)},Ge=function(n,e){return function(t,r){e(t,r,n)}},ot=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}=Xo(t,r),s=await this.batches.list(e?{workflowId:e}:{});return Zo(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)}};jn([la(),Ge(0,ua("workflowId")),Ge(1,ua("limit")),Ge(2,ua("offset")),G("design:type",Function),G("design:paramtypes",[String,String,String]),G("design:returntype",Promise)],ot.prototype,"list",null);jn([la(":id"),Ge(0,pa("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],ot.prototype,"get",null);jn([la(":id/jobs"),Ge(0,pa("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],ot.prototype,"listJobs",null);jn([Op(),Ge(0,Uw(new x(ci))),G("design:type",Function),G("design:paramtypes",[Object]),G("design:returntype",Promise)],ot.prototype,"launch",null);jn([Op(":id/cancel"),Ge(0,pa("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],ot.prototype,"cancel",null);ot=jn([Ww("batches"),Ge(0,ca(ye)),Ge(1,ca(Y)),Ge(2,ca(ie)),G("design:paramtypes",[ye,Y,ie])],ot)});import{Body as Bp,Controller as Mw,Delete as Hw,Get as Fp,HttpCode as Kw,Inject as Gw,Param as da,Patch as Vw,Post as Qw,Query as zw}from"@nestjs/common";var Rn,V,zt,it,Np=l(()=>{"use strict";C();Mi();E();se();Rn=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)},zt=function(n,e){return function(t,r){e(t,r,n)}},it=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}`)}};Rn([Fp(),zt(0,zw("enabled")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],it.prototype,"list",null);Rn([Fp(":id"),zt(0,da("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],it.prototype,"get",null);Rn([Qw(),zt(0,Bp(new x(on))),V("design:type",Function),V("design:paramtypes",[Object]),V("design:returntype",Promise)],it.prototype,"create",null);Rn([Vw(":id"),zt(0,da("id")),zt(1,Bp(new x(on.partial().omit({id:!0})))),V("design:type",Function),V("design:paramtypes",[String,Object]),V("design:returntype",Promise)],it.prototype,"update",null);Rn([Hw(":id"),Kw(204),zt(0,da("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],it.prototype,"remove",null);it=Rn([Mw("schedules"),zt(0,Gw(ze)),V("design:paramtypes",[ze])],it)});import{Controller as Yw,Inject as Xw,Query as Lp,Sse as Zw}from"@nestjs/common";import{Observable as Up}from"rxjs";var Jp,ui,fa,dr,Wp=l(()=>{"use strict";Po();Jp=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},ui=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fa=function(n,e){return function(t,r){e(t,r,n)}},dr=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()}})}};Jp([Zw(),fa(0,Lp("jobId")),fa(1,Lp("batchId")),ui("design:type",Function),ui("design:paramtypes",[String,String]),ui("design:returntype",Up)],dr.prototype,"stream",null);dr=Jp([Yw("events"),fa(0,Xw(Ee)),ui("design:paramtypes",[Ee])],dr)});import{extendZodWithOpenApi as eb}from"@asteasolutions/zod-to-openapi";import{z as tb}from"zod";var Mp=l(()=>{"use strict";eb(tb)});import{z as Hp}from"zod";var li,ma=l(()=>{"use strict";li=Hp.object({value:Hp.string().min(1)})});import{z as Te}from"zod";var AC,nb,Kp,Gp=l(()=>{"use strict";AC=Te.object({path:Te.string().optional(),mode:Te.enum(["directories","files"]).optional(),extensions:Te.string().optional()}),nb=Te.object({name:Te.string().min(1),path:Te.string().min(1),isDirectory:Te.boolean()}),Kp=Te.object({path:Te.string().min(1),entries:Te.array(nb)})});import{z as d}from"zod";function Ib(n){let e=d.toJSONSchema(n),{$schema:t,...r}=e;return r}function zp(n){let e=(t,r)=>n.registerComponent("schemas",t,Ib(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",Qn),WorkflowDefinitionInput:e("WorkflowDefinitionInput",yt),UpdateWorkflowBody:e("UpdateWorkflowBody",hb),SubjectView:e("SubjectView",Pr),CreateSubjectViewBody:e("CreateSubjectViewBody",Ar),ReorderViewsBody:e("ReorderViewsBody",$r),UpdateViewBody:e("UpdateViewBody",gb),WorkflowShortcut:e("WorkflowShortcut",Ur),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",Wr),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",Mr),ReorderShortcutsBody:e("ReorderShortcutsBody",Hr),Schedule:e("Schedule",on),UpdateScheduleBody:e("UpdateScheduleBody",wb),EngineSettings:e("EngineSettings",Gr),UpdateSettingsBody:e("UpdateSettingsBody",Sb),SettingsPatchResponse:e("SettingsPatchResponse",xb),ProviderInstanceConfig:e("ProviderInstanceConfig",Kr),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Qr),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",zr),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",vb),SetSecretBody:e("SetSecretBody",li),CreateJobBody:e("CreateJobBody",ei),ResumeJobBody:e("ResumeJobBody",ti),RetryStepBody:e("RetryStepBody",oi),LatestBySubjectBody:e("LatestBySubjectBody",ni),LatestBySubjectResponse:e("LatestBySubjectResponse",bb),LaunchBody:e("LaunchBody",ci),Job:e("Job",En),QueuedAgentStep:e("QueuedAgentStep",Vp),ActiveJobsSnapshot:e("ActiveJobsSnapshot",ub),JobBatch:e("JobBatch",Qp),LaunchResponse:e("LaunchResponse",lb),HealthResponse:e("HealthResponse",pb),ProviderStatus:e("ProviderStatus",db),QueryTemplate:e("QueryTemplate",_c),ProviderActionDescriptor:e("ProviderActionDescriptor",jc),PreviewModelsBody:e("PreviewModelsBody",Yr),PreviewModel:e("PreviewModel",Eu),TestConnectionBody:e("TestConnectionBody",Xr),TestConnectionResult:e("TestConnectionResult",Pu),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",kr),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",Rc),ErrorResponse:e("ErrorResponse",fb),EngineEvent:e("EngineEvent",mb),Subject:e("Subject",pi),WorkflowLibraryEntry:e("WorkflowLibraryEntry",yb),ContextFile:e("ContextFile",Dr),CreateContextFileBody:e("CreateContextFileBody",Br),UpdateContextFileBody:e("UpdateContextFileBody",Fr),LocalRepository:e("LocalRepository",Nr),CreateLocalRepositoryBody:e("CreateLocalRepositoryBody",Lr),UpdateLocalRepositoryBody:e("UpdateLocalRepositoryBody",Jr),DeleteWorktreesBody:e("DeleteWorktreesBody",ri),FilesystemBrowseResult:e("FilesystemBrowseResult",Kp),ImportWorkflowBody:e("ImportWorkflowBody",Ko),ImportConflictResponse:e("ImportConflictResponse",sp)}}var rb,ob,ib,sb,pi,ab,cb,Vp,En,ub,Qp,lb,pb,db,fb,mb,hb,yb,gb,wb,bb,Sb,vb,xb,P,ha,ya=l(()=>{"use strict";Mp();C();ia();aa();ma();Gp();Hs();rb=d.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),ob=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()}),ib=d.object({subjectType:d.literal("pull_request"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),repoIdentifier:d.string().min(1),sourceBranch:d.string(),targetBranch:d.string(),author:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),sb=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()}),pi=d.discriminatedUnion("subjectType",[ob,ib,sb]),ab=d.discriminatedUnion("mode",[d.object({mode:d.literal("single"),subject:pi}),d.object({mode:d.literal("collection"),subjects:d.array(pi)})]),cb=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()}),Vp=d.object({jobId:d.string(),stepExecutionId:d.string(),agentInstanceId:d.string(),enqueuedAt:d.string()}),En=d.object({id:d.string(),workflowId:d.string(),status:rb,subjectContext:ab.optional(),selection:ai.optional(),batchId:d.string().optional(),parentJobId:d.string().optional(),parentStepExecutionId:d.string().optional(),fanOutIndex:d.number().int().optional(),retryOf:d.string().optional(),workflowSnapshot:Qn.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(cb),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().optional()}),ub=d.object({waitingForHuman:d.array(En),running:d.array(En),queued:d.array(Vp.extend({job:En}))}),Qp=d.object({id:d.string(),workflowId:d.string(),selection:ai,resolvedSubjects:d.array(pi),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:Vn.optional(),notificationSent:d.boolean(),createdAt:d.string(),completedAt:d.string().optional()}),lb=d.discriminatedUnion("kind",[d.object({kind:d.literal("job"),job:En}),d.object({kind:d.literal("batch"),batch:Qp})]),pb=d.object({ok:d.boolean(),service:d.string(),timestamp:d.string()}),db=d.object({providerId:d.string(),secretKey:d.string(),configured:d.boolean()}),fb=d.object({error:d.string()}),mb=d.object({type:d.string(),timestamp:d.string()}).passthrough(),hb=yt,yb=d.object({id:d.string().min(1),source:d.enum(["example","community","official","organization"]),name:d.string().min(1),description:d.string(),workflowDefinition:yt}),gb=Cr,wb=on.partial().omit({id:!0}),bb=d.record(d.string(),En.nullable()),Sb=Vr,vb=d.object({settings:Gr,restartRequired:d.literal(!0)}),xb=d.object({settings:Gr,restartRequired:d.boolean()}),P=d.object({id:d.string().min(1)}),ha=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 I}from"zod";function w(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),w(n.ErrorResponse,t[r]??"Error")]))}function Yp(n,e){n.registerPath({method:"get",path:"/health",tags:["Health"],summary:"Health check",responses:{200:w(e.HealthResponse,"Service is healthy")}}),n.registerPath({method:"get",path:"/workflows",tags:["Workflows"],summary:"List workflow definitions",request:{query:I.object({subjectHandling:I.enum(["per-subject","collection"]).optional()})},responses:{200:w(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:w(e.WorkflowDefinition,"Updated existing workflow"),201:w(e.WorkflowDefinition,"Created workflow definition"),...b(e,400),409:w(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:P},responses:{200:w(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:P},responses:{200:w(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:w(e.WorkflowDefinition,"Created workflow definition"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:P,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:w(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:P},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:w(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:P},responses:{201:w(e.WorkflowDefinition,"Created workflow definition"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:I.object({subjectType:ue.optional()})},responses:{200:w(F(e.SubjectView),"Subject views"),...b(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:P},responses:{200:w(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:P},responses:{200:w(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:w(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:w(e.SubjectView,"Created subject view"),...b(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:P,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:w(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:P},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:ha.extend({workflowId:I.string().optional(),status:I.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]).optional(),batchId:I.string().optional(),parentJobId:I.string().optional(),topLevelOnly:I.enum(["true","false"]).optional().openapi({description:"When true, exclude jobs that belong to a batch or a parent (sub_workflow) job"}),terminal:I.enum(["true","false"]).optional().openapi({description:"When true, only completed/failed/cancelled jobs. When false, only in-progress jobs. Omitted: no terminality filter."}),liveWorktree:I.enum(["true","false"]).optional().openapi({description:"When true, only jobs with a worktreePath that has not been deleted from the management page."})})},responses:{200:w(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:w(F(e.QueuedAgentStep),"Queued agent steps")}}),n.registerPath({method:"get",path:"/jobs/active",tags:["Jobs"],summary:"Active Jobs buckets (waiting, running, queued) in one pass",request:{query:I.object({topLevelOnly:I.enum(["true","false"]).optional()})},responses:{200:w(e.ActiveJobsSnapshot,"Active Jobs snapshot")}}),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:w(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:P},responses:{200:w(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:w(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:w(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:P,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:w(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:P},responses:{200:w(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:P,body:{required:!1,content:{"application/json":{schema:e.RetryStepBody}}}},responses:{200:w(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:P},responses:{200:w(e.Job,"Cancelled job"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:ha.extend({workflowId:I.string().optional()})},responses:{200:w(F(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:P},responses:{200:w(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:P},responses:{200:w(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:w(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:P},responses:{200:w(e.JobBatch,"Cancelled batch"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:w(F(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:P},responses:{200:w(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:w(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:w(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:P,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:w(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:P},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:w(F(e.ContextFile),"Context files")}}),n.registerPath({method:"get",path:"/context-files/{id}",tags:["Context Files"],summary:"Get a context file",request:{params:P},responses:{200:w(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:w(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:P,body:{required:!0,content:{"application/json":{schema:e.UpdateContextFileBody}}}},responses:{200:w(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:P},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:w(F(e.LocalRepository),"Local repositories")}}),n.registerPath({method:"get",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Get a local repository",request:{params:P},responses:{200:w(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:w(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:P,body:{required:!0,content:{"application/json":{schema:e.UpdateLocalRepositoryBody}}}},responses:{200:w(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:P},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:I.object({path:I.string().optional(),mode:I.enum(["directories","files"]).optional(),extensions:I.string().optional()})},responses:{200:w(e.FilesystemBrowseResult,"Directory listing"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules",tags:["Schedules"],summary:"List schedules",request:{query:I.object({enabled:I.enum(["true","false"]).optional()})},responses:{200:w(F(e.Schedule),"Schedules"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:P},responses:{200:w(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:w(e.Schedule,"Created schedule"),...b(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:P,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:w(e.Schedule,"Updated schedule"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:P},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:w(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:w(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:w(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:I.object({providerId:I.string().min(1)})},responses:{200:w(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:I.object({providerId:I.string().min(1)})},responses:{200:w(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:I.object({providerId:I.string().min(1),templateId:I.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.ResolveQueryTemplateBody}}}},responses:{200:w(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:w(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:w(e.SettingsPatchResponse,"Updated settings"),...b(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:w(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:w(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:I.object({id:I.string().min(1)})},responses:{200:w(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:I.object({id:I.string().min(1)})},responses:{200:w(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:I.object({id:I.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.UpdateProviderInstanceBody}}}},responses:{200:w(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:I.object({id:I.string().min(1)})},responses:{200:w(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:I.object({key:I.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:I.object({jobId:I.string().optional(),batchId:I.string().optional()})},responses:{200:{description:"SSE stream of engine events",content:{"text/event-stream":{schema:e.EngineEvent}}}}})}var Xp=l(()=>{"use strict";C();ya()});import{OpenAPIRegistry as _b,OpenApiGeneratorV31 as jb}from"@asteasolutions/zod-to-openapi";function Zp(){if(di)return di;let n=new _b,e=zp(n);return Yp(n,e),di=new jb(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"}]}),di}var di,ed=l(()=>{"use strict";ya();Xp()});import{Controller as Rb,Get as Eb,Header as kb}from"@nestjs/common";var td,ga,fr,nd=l(()=>{"use strict";ed();td=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},ga=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fr=class{getOpenApiDocument(){return Zp()}};td([Eb("openapi.json"),kb("Content-Type","application/json"),ga("design:type",Function),ga("design:paramtypes",[]),ga("design:returntype",void 0)],fr.prototype,"getOpenApiDocument",null);fr=td([Rb()],fr)});import{Controller as Pb,Get as wa,Inject as mr,Param as fi,Post as ba,Body as Sa,HttpCode as va}from"@nestjs/common";var Yt,J,xe,Ve,rd=l(()=>{"use strict";os();_s();jo();Ro();Eo();C();se();Yt=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)},xe=function(n,e){return function(t,r){e(t,r,n)}},Ve=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)}}};Yt([wa("status"),J("design:type",Function),J("design:paramtypes",[]),J("design:returntype",Promise)],Ve.prototype,"status",null);Yt([ba("preview-models"),va(200),xe(0,Sa(new x(Yr))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ve.prototype,"previewAvailableModels",null);Yt([ba("test-connection"),va(200),xe(0,Sa(new x(Xr))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ve.prototype,"testConnection",null);Yt([wa(":providerId/query-templates"),xe(0,fi("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ve.prototype,"listQueryTemplates",null);Yt([wa(":providerId/actions"),xe(0,fi("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Ve.prototype,"listExtendedActions",null);Yt([ba(":providerId/query-templates/:templateId/resolve"),va(200),xe(0,fi("providerId")),xe(1,fi("templateId")),xe(2,Sa(new x(kr))),J("design:type",Function),J("design:paramtypes",[String,String,Object]),J("design:returntype",Promise)],Ve.prototype,"resolveQueryTemplate",null);Ve=Yt([Pb("providers"),xe(0,mr(gt)),xe(1,mr(It)),xe(2,mr(je)),xe(3,mr(_t)),xe(4,mr(Re)),J("design:paramtypes",[gt,It,je,_t,Re])],Ve)});import{Body as Ab,Controller as Cb,Get as $b,Inject as Tb,Patch as qb}from"@nestjs/common";var xa,Xt,od,kn,id=l(()=>{"use strict";C();le();se();xa=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=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},od=function(n,e){return function(t,r){e(t,r,n)}},kn=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:Nu(e)}}};xa([$b(),Xt("design:type",Function),Xt("design:paramtypes",[]),Xt("design:returntype",Promise)],kn.prototype,"get",null);xa([qb(),od(0,Ab(new x(Vr))),Xt("design:type",Function),Xt("design:paramtypes",[Object]),Xt("design:returntype",Promise)],kn.prototype,"update",null);kn=xa([Cb("settings"),od(0,Tb(_)),Xt("design:paramtypes",[_])],kn)});function Ia(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return Je(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 sd(n){let{defaultAgent:e,...t}=n;return t}var ad=l(()=>{"use strict";C()});import{Body as ud,Controller as Ob,Delete as Db,Get as ld,HttpCode as pd,Inject as cd,Param as mi,Patch as Bb,Post as dd}from"@nestjs/common";var Zt,U,$t,Qe,fd=l(()=>{"use strict";C();le();E();se();ad();Eo();Zt=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)},$t=function(n,e){return function(t,r){e(t,r,n)}},Qe=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=sd(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:Ia({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:Ia({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}}};Zt([ld(),U("design:type",Function),U("design:paramtypes",[]),U("design:returntype",Promise)],Qe.prototype,"list",null);Zt([ld(":id"),$t(0,mi("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Qe.prototype,"get",null);Zt([dd(":id/test-connection"),pd(200),$t(0,mi("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Qe.prototype,"testConnection",null);Zt([dd(),$t(0,ud(new x(Qr))),U("design:type",Function),U("design:paramtypes",[Object]),U("design:returntype",Promise)],Qe.prototype,"create",null);Zt([Bb(":id"),$t(0,mi("id")),$t(1,ud(new x(zr))),U("design:type",Function),U("design:paramtypes",[String,Object]),U("design:returntype",Promise)],Qe.prototype,"update",null);Zt([Db(":id"),pd(200),$t(0,mi("id")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Qe.prototype,"remove",null);Qe=Zt([Ob("provider-instances"),$t(0,cd(_)),$t(1,cd(Re)),U("design:paramtypes",[_,Re])],Qe)});import{Body as Fb,Controller as Nb,HttpCode as Lb,Inject as Jb,Param as Ub,Post as Wb}from"@nestjs/common";var md,hi,_a,hr,hd=l(()=>{"use strict";Oe();E();se();ma();md=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},hi=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_a=function(n,e){return function(t,r){e(t,r,n)}},hr=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)}};md([Wb(":key"),Lb(204),_a(0,Ub("key")),_a(1,Fb(new x(li))),hi("design:type",Function),hi("design:paramtypes",[String,Object]),hi("design:returntype",Promise)],hr.prototype,"set",null);hr=md([Nb("secrets"),_a(0,Jb(ce)),hi("design:paramtypes",[Function])],hr)});import{readFile as Mb}from"node:fs/promises";async function ja(n){try{await Mb(n,"utf8")}catch(e){let t=e instanceof Error?e.message:String(e);throw new h(`Cannot read context file at '${n}': ${t}`)}}var yd=l(()=>{"use strict";E()});import{Body as gd,Controller as Hb,Delete as Kb,Get as wd,HttpCode as Gb,Inject as Vb,Param as Ra,Patch as Qb,Post as zb}from"@nestjs/common";import{randomUUID as Yb}from"node:crypto";var An,Q,Pn,st,bd=l(()=>{"use strict";C();Er();E();se();yd();An=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)},Pn=function(n,e){return function(t,r){e(t,r,n)}},st=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 ja(e.path),this.files.create({id:e.id??Yb(),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 ja(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}`)}};An([wd(),Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",Promise)],st.prototype,"list",null);An([wd(":id"),Pn(0,Ra("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],st.prototype,"get",null);An([zb(),Pn(0,gd(new x(Br))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],st.prototype,"create",null);An([Qb(":id"),Pn(0,Ra("id")),Pn(1,gd(new x(Fr))),Q("design:type",Function),Q("design:paramtypes",[String,Object]),Q("design:returntype",Promise)],st.prototype,"update",null);An([Kb(":id"),Gb(204),Pn(0,Ra("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],st.prototype,"remove",null);st=An([Hb("context-files"),Pn(0,Vb(ge)),Q("design:paramtypes",[ge])],st)});import{execFile as Xb}from"node:child_process";import{stat as Zb}from"node:fs/promises";import{resolve as Ea}from"node:path";import{promisify as eS}from"node:util";async function ka(n){let e=Ea(n);try{if((await tS("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 Pa(n,e){let t=Ea(n),r=Ea(e?.trim()?e.trim():Bo(t));if(Fo(t,r))throw new h(`Worktree base '${r}' must not be inside the repository at '${t}'`);try{if(!(await Zb(r)).isDirectory())throw new h(`Worktree base '${r}' exists and is not a directory`)}catch(o){if(o instanceof h)throw o}}var tS,Sd=l(()=>{"use strict";E();Js();tS=eS(Xb)});import{Body as vd,Controller as nS,Delete as rS,Get as xd,HttpCode as oS,Inject as iS,Param as Aa,Patch as sS,Post as aS}from"@nestjs/common";import{randomUUID as cS}from"node:crypto";var $n,z,Cn,at,Id=l(()=>{"use strict";C();Gn();E();se();Sd();$n=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)},Cn=function(n,e){return function(t,r){e(t,r,n)}},at=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 ka(e.localPath),await Pa(e.localPath,e.worktreeBasePath),this.repos.create({id:e.id??cS(),name:e.name,localPath:e.localPath,...e.worktreeBasePath?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch?{defaultBranch:e.defaultBranch}:{},...e.remoteRepo?{remoteRepo:e.remoteRepo}:{}})}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 ka(o),await Pa(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}`)}};$n([xd(),z("design:type",Function),z("design:paramtypes",[]),z("design:returntype",Promise)],at.prototype,"list",null);$n([xd(":id"),Cn(0,Aa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],at.prototype,"get",null);$n([aS(),Cn(0,vd(new x(Lr))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],at.prototype,"create",null);$n([sS(":id"),Cn(0,Aa("id")),Cn(1,vd(new x(Jr))),z("design:type",Function),z("design:paramtypes",[String,Object]),z("design:returntype",Promise)],at.prototype,"update",null);$n([rS(":id"),oS(204),Cn(0,Aa("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],at.prototype,"remove",null);at=$n([nS("local-repositories"),Cn(0,iS(X)),z("design:paramtypes",[X])],at)});import{readdir as uS,stat as lS}from"node:fs/promises";import{homedir as pS}from"node:os";import{join as dS,resolve as fS}from"node:path";async function _d(n,e={}){let t=n?.trim()?n.trim():pS(),r=fS(t),o;try{o=await lS(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 uS(r,{encoding:"utf8",withFileTypes:!0})).filter(a=>a.name!=="."&&a.name!=="..").map(a=>({name:a.name,path:dS(r,a.name),isDirectory:a.isDirectory()})).filter(a=>mS(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 jd(n){if(n==null||n.trim()==="")return;let e=n.split(",").map(t=>Ed(t)).filter(t=>t!=null);return e.length>0?e:void 0}function Rd(n){if(!(n==null||n.trim()==="")){if(n==="directories"||n==="files")return n;throw new h(`Invalid browse mode '${n}'`)}}function mS(n,e){if(e.mode==="directories")return n.isDirectory;if(n.isDirectory)return!0;let t=e.extensions?.map(o=>Ed(o)).filter(Boolean);if(!t?.length)return!0;let r=n.name.toLowerCase();return t.some(o=>r.endsWith(o))}function Ed(n){let e=n.trim().toLowerCase();if(e.length!==0)return e.startsWith(".")?e:`.${e}`}var kd=l(()=>{"use strict";E()});import{Controller as hS,Get as yS,Query as Ta}from"@nestjs/common";var Pd,Ca,$a,yr,Ad=l(()=>{"use strict";kd();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},Ca=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},$a=function(n,e){return function(t,r){e(t,r,n)}},yr=class{async browse(e,t,r){return _d(e,{mode:Rd(t),extensions:jd(r)})}};Pd([yS("browse"),$a(0,Ta("path")),$a(1,Ta("mode")),$a(2,Ta("extensions")),Ca("design:type",Function),Ca("design:paramtypes",[String,String,String]),Ca("design:returntype",Promise)],yr.prototype,"browse",null);yr=Pd([hS("filesystem")],yr)});import{Module as wS}from"@nestjs/common";import{APP_FILTER as bS}from"@nestjs/core";var gS,yi,Cd=l(()=>{"use strict";Xn();Ms();Ao();ip();mp();_p();Rp();kp();$p();qp();Dp();Np();Wp();nd();rd();id();fd();hd();bd();Id();Ad();ko();Pi();gS=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=class{};yi=gS([wS({imports:[Ue,xn,Rt,jt,nn],controllers:[Se,In,_n,$e,He,ee,ot,it,dr,fr,Ve,kn,Qe,hr,st,at,yr],providers:[{provide:bS,useClass:Ho}]})],yi)});import{Module as vS}from"@nestjs/common";var SS,gi,$d=l(()=>{"use strict";Ba();Fa();Na();ko();Ao();Xn();Ms();Cd();SS=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},gi=class{};gi=SS([vS({imports:[gr,wr,jt,Rt,Ue,xn,yi],controllers:[Tn]})],gi)});import{apiReference as xS}from"@scalar/nestjs-api-reference";function Td(n){n.use("/api/docs",xS({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var qd=l(()=>{"use strict"});import{createServer as IS}from"node:net";function Od(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function qa(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await _S(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function _S(n){return new Promise(e=>{let t=IS();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var Dd=l(()=>{"use strict"});import{Catch as ES,HttpStatus as wi,NotFoundException as kS}from"@nestjs/common";import{existsSync as Bd,statSync as PS}from"node:fs";import{extname as Fd,join as Oa,normalize as AS,relative as CS,sep as $S}from"node:path";function Nd(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=TS(e.path??"/");if(o){let i=Oa(n,o);if(qS(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(Ld(e)){Jd(t,n,i=>{i&&!t.headersSent&&t.status(wi.NOT_FOUND).end()});return}t.status(wi.NOT_FOUND).end()}}function Ld(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=Fd(e);return!(t&&t!==".html")}function Jd(n,e,t){n.sendFile("index.html",{root:e},t)}function TS(n){if(n==="/"||n==="")return"index.html";let e=AS(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!Fd(e)?null:e}function qS(n,e){if(!Bd(e))return!1;try{if(!PS(e).isFile())return!1}catch{return!1}let t=CS(n,e);return t!==""&&!t.startsWith(`..${$S}`)&&!t.startsWith("..")}function Ud(n){return Oa(n,"index.html")}var jS,RS,bi,Wd=l(()=>{"use strict";jS=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},RS=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},bi=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(Ld(o)&&Bd(Oa(this.staticRoot,"index.html"))){Jd(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(wi.NOT_FOUND).json({statusCode:wi.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)}};bi=jS([ES(kS),RS("design:paramtypes",[String])],bi)});import{existsSync as OS}from"node:fs";import{dirname as DS,join as Si}from"node:path";import{fileURLToPath as BS}from"node:url";function Md(){let n=DS(BS(import.meta.url)),e=[Si(n,"../static"),Si(n,"../../static"),Si(n,"static")];for(let t of e)if(OS(Si(t,"index.html")))return t;return null}var Hd=l(()=>{"use strict"});var US={};import"reflect-metadata";import{existsSync as FS}from"node:fs";import{Logger as NS}from"@nestjs/common";import{NestFactory as LS}from"@nestjs/core";async function JS(){let n=await LS.create(gi);n.enableCors(),n.setGlobalPrefix("api"),Td(n);let e=Md(),t=e?Ud(e):null;e&&t&&FS(t)?(vi.log(`Serving UI from ${e}`),n.use(Nd(e)),n.useGlobalFilters(new bi(e))):vi.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 qa(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?vi.warn(`Port ${r} is in use; listening on ${o} instead`):vi.log(`Listening on http://localhost:${o}`);return}catch(s){if(!Od(s))throw s;o=await qa(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var vi,Kd=l(()=>{"use strict";$d();qd();Dd();Wd();Hd();vi=new NS("Bootstrap");JS()});import{readFileSync as WS}from"node:fs";function MS(){let n=WS(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var xi=process.argv.slice(2);xi.includes("--version")||xi.includes("-v")?console.log(MS()):xi.includes("--help")||xi.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(`
135
+ `)):await Promise.resolve().then(()=>(Kd(),US));