@knoflows/engine 0.1.0-alpha.14 → 0.1.0-alpha.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -10
- package/dist/engine.js +41 -20
- package/dist/migrations/20260919073531_tense_grey_gargoyle/migration.sql +1 -0
- package/dist/migrations/20260919073531_tense_grey_gargoyle/snapshot.json +1348 -0
- package/dist/migrations/20260919081637_fearless_warlock/migration.sql +1 -0
- package/dist/migrations/20260919081637_fearless_warlock/snapshot.json +1358 -0
- package/package.json +4 -4
- package/static/apple-touch-icon.png +0 -0
- package/static/assets/i18n/en.json +47 -6
- package/static/assets/i18n/es.json +47 -6
- package/static/chunk-9U0WIegY.js +1 -0
- package/static/chunk-B0kZCuEt.js +1 -0
- package/static/chunk-B2Xol2Un.js +1 -0
- package/static/chunk-B7WkIFy0.js +1 -0
- package/static/chunk-BW9BdLk-.js +1 -0
- package/static/chunk-Bgl02GNl.js +1 -0
- package/static/chunk-BhF-m2HP.js +70 -0
- package/static/chunk-BhTujCrk.js +1 -0
- package/static/chunk-Bu6_39Nh.js +1 -0
- package/static/chunk-C0HCwfa5.js +1 -0
- package/static/chunk-C2BVYtVN.js +66 -0
- package/static/chunk-C7h8oMzu.js +1 -0
- package/static/chunk-CRdEWPUM.js +1 -0
- package/static/chunk-CRv0PDB7.js +1 -0
- package/static/chunk-CecXf-CU.js +1 -0
- package/static/chunk-CenXuPs5.js +1 -0
- package/static/chunk-CeywzbyD.js +1 -0
- package/static/{chunk-CjitpVjI.js → chunk-Cg2E0vnT.js} +1 -1
- package/static/chunk-CsQ_HDGC.js +1 -0
- package/static/chunk-D19C8Gcb.js +1 -0
- package/static/chunk-DGC4TkAL.js +1 -0
- package/static/chunk-DUkiyf7y.js +1 -0
- package/static/chunk-DYzSLsNo.js +1 -0
- package/static/chunk-DZJZYEZl.js +1 -0
- package/static/chunk-DfcFBVF4.js +1 -0
- package/static/chunk-DixyYfV_.js +1 -0
- package/static/chunk-Dp4H7MY0.js +1 -0
- package/static/chunk-DtQtDE8q.js +1 -0
- package/static/chunk-Dv5GyY6h.js +1 -0
- package/static/chunk-Edaw7VGW.js +1 -0
- package/static/chunk-FOJfn_t9.js +1 -0
- package/static/chunk-Fwpw-z7T.js +1 -0
- package/static/chunk-HUIPNwd9.js +1 -0
- package/static/chunk-NZ-CPWJ2.js +1 -0
- package/static/chunk-Th9whP36.js +1 -0
- package/static/chunk-bCuvpgQS.js +1 -0
- package/static/chunk-iE460Kz5.js +1 -0
- package/static/chunk-p6dftaf8.js +5 -0
- package/static/chunk-yoe_30RI.js +1 -0
- package/static/chunk-z2vvQAle.js +1 -0
- package/static/favicon-16x16.png +0 -0
- package/static/favicon-32x32.png +0 -0
- package/static/favicon.ico +0 -0
- package/static/favicon.svg +12 -0
- package/static/icon-192.png +0 -0
- package/static/icon-512.png +0 -0
- package/static/index.html +30 -5
- package/static/main-CHQMTVIP.js +248 -0
- package/static/media/inter-latin-400-normal-55WT6UWF.woff2 +0 -0
- package/static/media/inter-latin-400-normal-FR5HOXA4.woff +0 -0
- package/static/media/inter-latin-500-normal-W62DVTXI.woff2 +0 -0
- package/static/media/inter-latin-500-normal-ZNGIZ2YB.woff +0 -0
- package/static/media/inter-latin-600-normal-R6Y2SZCR.woff2 +0 -0
- package/static/media/inter-latin-600-normal-ZYHV6QZT.woff +0 -0
- package/static/media/jetbrains-mono-latin-500-normal-ETEQEOVZ.woff +0 -0
- package/static/media/jetbrains-mono-latin-500-normal-V4XIP5OW.woff2 +0 -0
- package/static/media/space-grotesk-latin-500-normal-GESQWJQV.woff2 +0 -0
- package/static/media/space-grotesk-latin-500-normal-HV4TE4RA.woff +0 -0
- package/static/media/space-grotesk-latin-700-normal-6Z7GHSI6.woff +0 -0
- package/static/media/space-grotesk-latin-700-normal-I3MXRIUZ.woff2 +0 -0
- package/static/nz-theme-dark.css +1 -0
- package/static/nz-theme.css +1 -0
- package/static/styles-JGCTKGGH.css +1 -0
- package/static/chunk-7nUPxia9.js +0 -1
- package/static/chunk-B5OZfu7U.js +0 -1
- package/static/chunk-B6yhN6h_.js +0 -1
- package/static/chunk-B8xDFyOW.js +0 -1
- package/static/chunk-BCQYv6zO.js +0 -1
- package/static/chunk-BGD9WiFM.js +0 -1
- package/static/chunk-BRQzRdUy.js +0 -1
- package/static/chunk-BT1tqKUa.js +0 -1
- package/static/chunk-BbMJvJVR.js +0 -5
- package/static/chunk-Bdf1gK_x.js +0 -1
- package/static/chunk-BgZJenki.js +0 -1
- package/static/chunk-BhOOhcFV.js +0 -1
- package/static/chunk-BphvnLVV.js +0 -1
- package/static/chunk-C4ekQTdr.js +0 -1
- package/static/chunk-CMCOXbTF.js +0 -1
- package/static/chunk-CVunAaEq.js +0 -1
- package/static/chunk-CWPY-qdb.js +0 -1
- package/static/chunk-C_RmBwoX.js +0 -1
- package/static/chunk-CkEV4Kdw.js +0 -1
- package/static/chunk-CmjHhm0_.js +0 -1
- package/static/chunk-Cprdc3WE.js +0 -1
- package/static/chunk-CsI-lLXP.js +0 -1
- package/static/chunk-D1s098WO.js +0 -1
- package/static/chunk-D5uYKhQI.js +0 -1
- package/static/chunk-DCwYXBAy.js +0 -1
- package/static/chunk-DDsAcugC.js +0 -66
- package/static/chunk-DWyVd0g2.js +0 -1
- package/static/chunk-Dn9gu9_q.js +0 -1
- package/static/chunk-Doaes0Yg.js +0 -7
- package/static/chunk-Dqf92YVW.js +0 -1
- package/static/chunk-Oq0qp-a6.js +0 -1
- package/static/chunk-PTPh9FQ2.js +0 -1
- package/static/chunk-PfPOHfb1.js +0 -1
- package/static/chunk-WIfL3i6D.js +0 -1
- package/static/chunk-ZTjXJrt4.js +0 -1
- package/static/chunk-bbBn-iZU.js +0 -1
- package/static/chunk-gl_-d0La.js +0 -1
- package/static/chunk-hTFsYp4X.js +0 -1
- package/static/chunk-szOy8Im7.js +0 -1
- package/static/main-OG6DVLH6.js +0 -249
- package/static/styles-4UB6RUIG.css +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 gp,Get as wp}from"@nestjs/common";var Rs,ko,nn,As=l(()=>{"use strict";Rs=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},ko=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},nn=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};Rs([wp(),ko("design:type",Function),ko("design:paramtypes",[]),ko("design:returntype",Object)],nn.prototype,"getHealth",null);nn=Rs([gp("health")],nn)});import{Module as bp}from"@nestjs/common";var yp,Tn,Cs=l(()=>{"use strict";yp=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},Tn=class{};Tn=yp([bp({})],Tn)});import{Module as xp}from"@nestjs/common";var Sp,On,Ts=l(()=>{"use strict";Sp=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},On=class{};On=Sp([xp({})],On)});var rn,Ro=l(()=>{"use strict";rn=Symbol("NOTIFICATION_PROVIDER")});var $n,Os=l(()=>{"use strict";$n=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});import{existsSync as $s}from"node:fs";import{dirname as vp,join as on}from"node:path";import{fileURLToPath as jp}from"node:url";function sn(){let n=vp(jp(import.meta.url)),e=on(n,"../data"),t=on(n,"../../data");return $s(on(e,"kno.db"))?e:$s(on(t,"kno.db"))?t:e}function qs(){return on(sn(),"kno.db")}var qn=l(()=>{"use strict"});import{createCipheriv as Ip,createDecipheriv as _p,randomBytes as Ds}from"node:crypto";import{mkdir as Bs,readFile as Fs,writeFile as Ns}from"node:fs/promises";import{join as Co}from"node:path";function $t(n){return`kno.${n}.apiKey`}function Rp(n){return Co(n,"secrets")}function Ls(n){return new To(Rp(n.dataDir),n.keyring)}function Ap(n){try{return n(Dn,"__kno_probe__").getPassword(),!0}catch(e){return Oo(e)}}function Oo(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var Dn,Js,Ep,Ao,Pp,kp,To,me,Be=l(()=>{"use strict";Dn="kno-flows";Js="aes-256-gcm",Ep=12,Ao=32,Pp="master.key",kp="store.json",To=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(Dn,e).getPassword();if(r!=null)return r}catch(r){Oo(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(Dn,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(Dn,e).deletePassword()}catch(r){Oo(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 Ap(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 Fs(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 Bs(this.secretsDir,{recursive:!0}),await Ns(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=Ds(Ep),o=Ip(Js,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=_p(Js,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 Bs(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await Fs(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==Ao)throw new Error(`Secret store master key at ${e} is not ${Ao} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=Ds(Ao);return await Ns(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return Co(this.secretsDir,kp)}masterKeyPath(){return Co(this.secretsDir,Pp)}};me=Symbol("SECRET_STORE")});import{Module as Tp}from"@nestjs/common";import{mkdirSync as Op}from"node:fs";var Cp,Us,qt,$o=l(()=>{"use strict";qn();Be();Cp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Us=sn();Op(Us,{recursive:!0});qt=class{};qt=Cp([Tp({providers:[{provide:me,useFactory:()=>Ls({dataDir:Us})}],exports:[me]})],qt)});import{index as $p,sqliteTable as qp,text as Pe}from"drizzle-orm/sqlite-core";var Ye,qo=l(()=>{"use strict";Ye=qp("workflow_definitions",{id:Pe("id").primaryKey(),name:Pe("name").notNull(),description:Pe("description"),appliesTo:Pe("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:Pe("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:Pe("input_schema",{mode:"json"}).$type().notNull(),steps:Pe("steps",{mode:"json"}).$type().notNull(),notificationPolicy:Pe("notification_policy",{mode:"json"}).$type().notNull(),createdAt:Pe("created_at").notNull(),updatedAt:Pe("updated_at").notNull()},n=>[$p("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as Ms,integer as Dp,sqliteTable as Bp,text as Ze}from"drizzle-orm/sqlite-core";var ke,Do=l(()=>{"use strict";ke=Bp("subject_views",{id:Ze("id").primaryKey(),name:Ze("name").notNull(),subjectType:Ze("subject_type").$type().notNull(),workflowId:Ze("workflow_id").notNull(),query:Ze("query",{mode:"json"}).$type().notNull(),description:Ze("description"),queryTemplate:Ze("query_template",{mode:"json"}).$type(),providerInstanceId:Ze("provider_instance_id").notNull().default(""),order:Dp("order").notNull().default(0)},n=>[Ms("subject_views_subject_type_idx").on(n.subjectType),Ms("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as Ws,integer as Fp,sqliteTable as Np,text as Re}from"drizzle-orm/sqlite-core";var et,Bn=l(()=>{"use strict";et=Np("job_batches",{id:Re("id").primaryKey(),workflowId:Re("workflow_id").notNull(),selection:Re("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:Re("resolved_subjects",{mode:"json"}).$type().notNull(),status:Re("status",{enum:["running","completed","completed_with_issues","failed","cancelled"]}).notNull(),triggeredBy:Re("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:Re("schedule_id"),notificationOverride:Re("notification_override",{mode:"json"}).$type(),notificationSent:Fp("notification_sent",{mode:"boolean"}).notNull(),createdAt:Re("created_at").notNull(),completedAt:Re("completed_at")},n=>[Ws("job_batches_workflow_id_idx").on(n.workflowId),Ws("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as Fn,integer as Jp,sqliteTable as Lp,text as J}from"drizzle-orm/sqlite-core";var U,an=l(()=>{"use strict";Bn();U=Lp("jobs",{id:J("id").primaryKey(),workflowId:J("workflow_id").notNull(),status:J("status").$type().notNull(),selection:J("selection",{mode:"json"}).$type(),batchId:J("batch_id").references(()=>et.id),parentJobId:J("parent_job_id"),parentStepExecutionId:J("parent_step_execution_id"),fanOutIndex:Jp("fan_out_index"),retryOf:J("retry_of"),workflowSnapshot:J("workflow_snapshot",{mode:"json"}).$type(),context:J("context",{mode:"json"}).$type().notNull(),worktreePath:J("worktree_path"),branch:J("branch"),worktreeDeletedAt:J("worktree_deleted_at"),currentStepId:J("current_step_id"),currentStepExecutionId:J("current_step_execution_id"),createdAt:J("created_at").notNull(),updatedAt:J("updated_at").notNull(),completedAt:J("completed_at")},n=>[Fn("jobs_workflow_id_idx").on(n.workflowId),Fn("jobs_status_idx").on(n.status),Fn("jobs_batch_id_idx").on(n.batchId),Fn("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as Hs,sqliteTable as Up,text as cn}from"drizzle-orm/sqlite-core";var Ae,Bo=l(()=>{"use strict";an();Ae=Up("job_subjects",{id:cn("id").primaryKey(),jobId:cn("job_id").notNull().references(()=>U.id),subjectType:cn("subject_type").$type().notNull(),subjectId:cn("subject_id").notNull(),snapshot:cn("snapshot",{mode:"json"}).$type().notNull()},n=>[Hs("job_subjects_job_id_idx").on(n.jobId),Hs("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as Gs,integer as Mp,sqliteTable as Wp,text as he}from"drizzle-orm/sqlite-core";var yt,Fo=l(()=>{"use strict";an();yt=Wp("job_step_executions",{id:he("id").primaryKey(),jobId:he("job_id").notNull().references(()=>U.id),stepDefinitionId:he("step_definition_id").notNull(),type:he("type").$type().notNull(),status:he("status").$type().notNull(),startedAt:he("started_at"),completedAt:he("completed_at"),output:he("output",{mode:"json"}).$type(),error:he("error"),childJobIds:he("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:he("parent_step_execution_id").references(()=>yt.id),iterationIndex:Mp("iteration_index")},n=>[Gs("job_step_executions_job_id_idx").on(n.jobId),Gs("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as Hp,integer as Gp,sqliteTable as Kp,text as tt}from"drizzle-orm/sqlite-core";var nt,No=l(()=>{"use strict";nt=Kp("schedules",{id:tt("id").primaryKey(),viewId:tt("view_id").notNull(),triggerType:tt("trigger_type",{enum:["cron"]}).notNull(),cadence:tt("cadence").notNull(),notificationOverride:tt("notification_override",{mode:"json"}).$type(),missedFirePolicy:tt("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:Gp("enabled",{mode:"boolean"}).notNull(),lastFiredAt:tt("last_fired_at"),createdAt:tt("created_at").notNull()},n=>[Hp("schedules_enabled_idx").on(n.enabled)])});import{integer as Vp,sqliteTable as Qp,text as un}from"drizzle-orm/sqlite-core";var Ce,Jo=l(()=>{"use strict";Ce=Qp("workflow_shortcuts",{id:un("id").primaryKey(),name:un("name").notNull(),workflowId:un("workflow_id").notNull(),inputValues:un("input_values",{mode:"json"}).$type().notNull(),lastJobId:un("last_job_id"),order:Vp("order").notNull().default(0)})});import{sqliteTable as zp,text as ln}from"drizzle-orm/sqlite-core";var rt,Lo=l(()=>{"use strict";rt=zp("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 Xp,text as Nn}from"drizzle-orm/sqlite-core";var ot,Uo=l(()=>{"use strict";ot=Xp("local_repositories",{id:Nn("id").primaryKey(),name:Nn("name").notNull(),localPath:Nn("local_path").notNull(),worktreeBasePath:Nn("worktree_base_path")})});import{sqliteTable as Yp,text as Ks}from"drizzle-orm/sqlite-core";var pn,Dt,Mo=l(()=>{"use strict";pn="default",Dt=Yp("settings",{id:Ks("id").primaryKey(),data:Ks("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Zp}from"drizzle-orm";var ed,Vs,Qs=l(()=>{"use strict";qo();Do();an();Bo();Fo();Bn();No();Jo();Lo();Uo();Mo();ed={workflowDefinitions:Ye,subjectViews:ke,jobs:U,jobSubjects:Ae,jobStepExecutions:yt,jobBatches:et,schedules:nt,workflowShortcuts:Ce,contextFiles:rt,localRepositories:ot,settings:Dt},Vs=Zp(ed,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 td}from"drizzle-orm/node-sqlite";import{DatabaseSync as Qb}from"node:sqlite";function zs(n){return n.exec("PRAGMA foreign_keys = ON;"),td({client:n,relations:Vs})}var Xs=l(()=>{"use strict";Qs()});import{existsSync as Ys,readdirSync as nd}from"node:fs";import{dirname as rd,join as Wo}from"node:path";import{fileURLToPath as od}from"node:url";function Zs(){let n=rd(od(import.meta.url)),e=[Wo(n,"persistence/migrations"),Wo(n,"migrations")];for(let t of e)if(id(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function id(n){return Ys(n)?nd(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&Ys(Wo(n,e.name,"migration.sql"))):!1}var ea=l(()=>{"use strict"});import{migrate as ta}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as sd}from"drizzle-orm/migrator";function Go(n,e,t={}){let r=t.log??(()=>{}),o=Zs(),i=sd({migrationsFolder:o});if(i.length===0)throw new ge(`No SQL migrations in ${o}`);let s=cd(i),a=mn(n,bt),c=ad.filter(S=>mn(n,S));if(!a&&c.length===0){ta(e,{migrationsFolder:o}),Ho(n,s);return}if(!a){dd(n,s,r),md(n,i),Ho(n,s);return}fd(n,i);let u=ra(n,s),d=oa(n);if(d.length===0&&c.length>0)throw new ge("migrations table exists but is empty while application tables are present \u2014 treating this as an interrupted update");let m=new Set(d.map(S=>S.name).filter(S=>S!=null&&S!==""));if(i.filter(S=>!m.has(S.name)).length===0&&u.length>0)throw new ge(`migrations journal is present but the schema is incomplete (${u.join("; ")}) \u2014 treating this as an interrupted update`);ta(e,{migrationsFolder:o}),Ho(n,s)}function cd(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=ud(s);if(a){e.push(a);continue}let c=ld(s);if(c){r.push(c);continue}let u=pd(s);u&&t.push(u)}return{tables:e,indexes:t,alterColumns:r}}function ud(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:
|
|
4
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
2
|
+
var l=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as Zp,Get as ed}from"@nestjs/common";var oa,Xo,bn,ia=l(()=>{"use strict";oa=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},Xo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},bn=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};oa([ed(),Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",Object)],bn.prototype,"getHealth",null);bn=oa([Zp("health")],bn)});import{Module as nd}from"@nestjs/common";var td,Yn,sa=l(()=>{"use strict";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},Yn=class{};Yn=td([nd({})],Yn)});import{Module as od}from"@nestjs/common";var rd,Zn,aa=l(()=>{"use strict";rd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zn=class{};Zn=rd([od({})],Zn)});var Sn,Yo=l(()=>{"use strict";Sn=Symbol("NOTIFICATION_PROVIDER")});var er,ca=l(()=>{"use strict";er=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});import{existsSync as ua}from"node:fs";import{dirname as id,join as xn}from"node:path";import{fileURLToPath as sd}from"node:url";function vn(){let n=id(sd(import.meta.url)),e=xn(n,"../data"),t=xn(n,"../../data");return ua(xn(e,"kno.db"))?e:ua(xn(t,"kno.db"))?t:e}function la(){return xn(vn(),"kno.db")}var tr=l(()=>{"use strict"});import{createCipheriv as ad,createDecipheriv as cd,randomBytes as pa}from"node:crypto";import{mkdir as da,readFile as fa,writeFile as ma}from"node:fs/promises";import{join as ei}from"node:path";function Ht(n){return`kno.${n}.apiKey`}function dd(n){return ei(n,"secrets")}function ya(n){return new ti(dd(n.dataDir),n.keyring)}function fd(n){try{return n(nr,"__kno_probe__").getPassword(),!0}catch(e){return ni(e)}}function ni(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var nr,ha,ud,Zo,ld,pd,ti,oe,Ce=l(()=>{"use strict";nr="kno-flows";ha="aes-256-gcm",ud=12,Zo=32,ld="master.key",pd="store.json",ti=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(nr,e).getPassword();if(r!=null)return r}catch(r){ni(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(nr,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(nr,e).deletePassword()}catch(r){ni(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 fd(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 fa(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 da(this.secretsDir,{recursive:!0}),await ma(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=pa(ud),o=ad(ha,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=cd(ha,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 da(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await fa(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==Zo)throw new Error(`Secret store master key at ${e} is not ${Zo} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=pa(Zo);return await ma(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return ei(this.secretsDir,pd)}masterKeyPath(){return ei(this.secretsDir,ld)}};oe=Symbol("SECRET_STORE")});import{Module as hd}from"@nestjs/common";import{mkdirSync as yd}from"node:fs";var md,wa,Kt,ri=l(()=>{"use strict";tr();Ce();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},wa=vn();yd(wa,{recursive:!0});Kt=class{};Kt=md([hd({providers:[{provide:oe,useFactory:()=>ya({dataDir:wa})}],exports:[oe]})],Kt)});import{index as wd,sqliteTable as gd,text as Te}from"drizzle-orm/sqlite-core";var tt,oi=l(()=>{"use strict";tt=gd("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=>[wd("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as ga,integer as bd,sqliteTable as Sd,text as nt}from"drizzle-orm/sqlite-core";var Oe,ii=l(()=>{"use strict";Oe=Sd("subject_views",{id:nt("id").primaryKey(),name:nt("name").notNull(),subjectType:nt("subject_type").$type().notNull(),workflowId:nt("workflow_id").notNull(),query:nt("query",{mode:"json"}).$type().notNull(),description:nt("description"),queryTemplate:nt("query_template",{mode:"json"}).$type(),providerInstanceId:nt("provider_instance_id").notNull().default(""),order:bd("order").notNull().default(0)},n=>[ga("subject_views_subject_type_idx").on(n.subjectType),ga("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as ba,integer as xd,sqliteTable as vd,text as $e}from"drizzle-orm/sqlite-core";var rt,rr=l(()=>{"use strict";rt=vd("job_batches",{id:$e("id").primaryKey(),workflowId:$e("workflow_id").notNull(),selection:$e("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:$e("resolved_subjects",{mode:"json"}).$type().notNull(),status:$e("status",{enum:["running","completed","completed_with_issues","failed","cancelled"]}).notNull(),triggeredBy:$e("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:$e("schedule_id"),notificationOverride:$e("notification_override",{mode:"json"}).$type(),notificationSent:xd("notification_sent",{mode:"boolean"}).notNull(),createdAt:$e("created_at").notNull(),completedAt:$e("completed_at")},n=>[ba("job_batches_workflow_id_idx").on(n.workflowId),ba("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as or,integer as jd,sqliteTable as Id,text as W}from"drizzle-orm/sqlite-core";var K,jn=l(()=>{"use strict";rr();K=Id("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(()=>rt.id),parentJobId:W("parent_job_id"),parentStepExecutionId:W("parent_step_execution_id"),fanOutIndex:jd("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=>[or("jobs_workflow_id_idx").on(n.workflowId),or("jobs_status_idx").on(n.status),or("jobs_batch_id_idx").on(n.batchId),or("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as Sa,sqliteTable as _d,text as In}from"drizzle-orm/sqlite-core";var qe,si=l(()=>{"use strict";jn();qe=_d("job_subjects",{id:In("id").primaryKey(),jobId:In("job_id").notNull().references(()=>K.id),subjectType:In("subject_type").$type().notNull(),subjectId:In("subject_id").notNull(),snapshot:In("snapshot",{mode:"json"}).$type().notNull()},n=>[Sa("job_subjects_job_id_idx").on(n.jobId),Sa("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as xa,integer as Pd,sqliteTable as Ed,text as ue}from"drizzle-orm/sqlite-core";var jt,ai=l(()=>{"use strict";jn();jt=Ed("job_step_executions",{id:ue("id").primaryKey(),jobId:ue("job_id").notNull().references(()=>K.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(()=>jt.id),iterationIndex:Pd("iteration_index")},n=>[xa("job_step_executions_job_id_idx").on(n.jobId),xa("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as kd,integer as Rd,sqliteTable as Ad,text as ot}from"drizzle-orm/sqlite-core";var it,ci=l(()=>{"use strict";it=Ad("schedules",{id:ot("id").primaryKey(),viewId:ot("view_id").notNull(),triggerType:ot("trigger_type",{enum:["cron"]}).notNull(),cadence:ot("cadence").notNull(),notificationOverride:ot("notification_override",{mode:"json"}).$type(),missedFirePolicy:ot("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:Rd("enabled",{mode:"boolean"}).notNull(),lastFiredAt:ot("last_fired_at"),createdAt:ot("created_at").notNull()},n=>[kd("schedules_enabled_idx").on(n.enabled)])});import{integer as Cd,sqliteTable as Td,text as _n}from"drizzle-orm/sqlite-core";var De,ui=l(()=>{"use strict";De=Td("workflow_shortcuts",{id:_n("id").primaryKey(),name:_n("name").notNull(),workflowId:_n("workflow_id").notNull(),inputValues:_n("input_values",{mode:"json"}).$type().notNull(),lastJobId:_n("last_job_id"),order:Cd("order").notNull().default(0)})});import{sqliteTable as Od,text as Pn}from"drizzle-orm/sqlite-core";var st,li=l(()=>{"use strict";st=Od("context_files",{id:Pn("id").primaryKey(),name:Pn("name").notNull(),description:Pn("description"),tier:Pn("tier").$type().notNull(),path:Pn("path").notNull()})});import{sqliteTable as $d,text as En}from"drizzle-orm/sqlite-core";var at,pi=l(()=>{"use strict";at=$d("local_repositories",{id:En("id").primaryKey(),name:En("name").notNull(),localPath:En("local_path").notNull(),worktreeBasePath:En("worktree_base_path"),defaultBranch:En("default_branch")})});import{sqliteTable as qd,text as va}from"drizzle-orm/sqlite-core";var kn,Vt,di=l(()=>{"use strict";kn="default",Vt=qd("settings",{id:va("id").primaryKey(),data:va("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Dd}from"drizzle-orm";var Bd,ja,Ia=l(()=>{"use strict";oi();ii();jn();si();ai();rr();ci();ui();li();pi();di();Bd={workflowDefinitions:tt,subjectViews:Oe,jobs:K,jobSubjects:qe,jobStepExecutions:jt,jobBatches:rt,schedules:it,workflowShortcuts:De,contextFiles:st,localRepositories:at,settings:Vt},ja=Dd(Bd,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 Fd}from"drizzle-orm/node-sqlite";import{DatabaseSync as WS}from"node:sqlite";function _a(n){return n.exec("PRAGMA foreign_keys = ON;"),Fd({client:n,relations:ja})}var Pa=l(()=>{"use strict";Ia()});import{existsSync as Ea,readdirSync as Nd}from"node:fs";import{dirname as Jd,join as fi}from"node:path";import{fileURLToPath as Ld}from"node:url";function ka(){let n=Jd(Ld(import.meta.url)),e=[fi(n,"persistence/migrations"),fi(n,"migrations")];for(let t of e)if(Md(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function Md(n){return Ea(n)?Nd(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&Ea(fi(n,e.name,"migration.sql"))):!1}var Ra=l(()=>{"use strict"});import{migrate as Aa}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as Wd}from"drizzle-orm/migrator";function hi(n,e,t={}){let r=t.log??(()=>{}),o=ka(),i=Wd({migrationsFolder:o});if(i.length===0)throw new be(`No SQL migrations in ${o}`);let s=Hd(i),a=Cn(n,It),u=Ud.filter(x=>Cn(n,x));if(!a&&u.length===0){Aa(e,{migrationsFolder:o}),mi(n,s);return}if(!a){Qd(n,s,r),Xd(n,i),mi(n,s);return}zd(n,i);let c=Ta(n,s),d=Oa(n);if(d.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(d.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`);Aa(e,{migrationsFolder:o}),mi(n,s)}function Hd(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=Kd(s);if(a){e.push(a);continue}let u=Vd(s);if(u){r.push(u);continue}let c=Gd(s);c&&t.push(c)}return{tables:e,indexes:t,alterColumns:r}}function Kd(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:An(a[1]),type:a[2]})}return{name:An(e[1]),createSql:`${n};`,columns:o}}function Vd(n){let e=n.match(/^ALTER TABLE\s+(`[^`]+`|"[^"]+"|\w+)\s+ADD(?:\s+COLUMN)?\s+(`[^`]+`|"[^"]+"|\w+)\s+(\w+)/i);return e?{table:An(e[1]),name:An(e[2]),type:e[3]}:null}function Gd(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:An(e[1]),sql:`${t};`}}function An(n){return n.replace(/^["`]|["`]$/g,"")}function Rn(n){return`\`${n.replace(/`/g,"")}\``}function Qd(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(!Cn(n,s.name)){n.exec(s.createSql),r.push(s.name);continue}let a=new Set(ir(n,s.name));for(let u of s.columns)a.has(u.name)||(n.exec(`ALTER TABLE ${Rn(s.name)} ADD COLUMN ${Rn(u.name)} ${u.type}`),a.add(u.name),o.push(`${s.name}.${u.name}`))}for(let s of e.alterColumns)Cn(n,s.table)&&(ir(n,s.table).includes(s.name)||(n.exec(`ALTER TABLE ${Rn(s.table)} ADD COLUMN ${Rn(s.name)} ${s.type}`),o.push(`${s.table}.${s.name}`)));for(let s of e.indexes)Ca(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 Cn(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function Ca(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'index' AND name = ?").get(e)!=null}function ir(n,e){return n.prepare(`PRAGMA table_info(${Rn(e)})`).all().map(r=>r.name)}function Ta(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(!Cn(n,o)){t.push(`missing table '${o}'`);continue}let s=new Set(ir(n,o));for(let a of i)s.has(a)||t.push(`table '${o}' is missing column '${a}'`)}for(let o of e.indexes)Ca(n,o.name)||t.push(`missing index '${o.name}'`);return t}function mi(n,e){let t=Ta(n,e);if(t.length>0)throw new be(`schema is incomplete after migrate (${t.join("; ")})`)}function Oa(n){let e=new Set(ir(n,It));if(!e.has("hash"))throw new be(`migrations table '${It}' is missing required columns`);if(!e.has("name"))throw new be(`migrations table '${It}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${It}`).all()}function zd(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of Oa(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 Xd(n,e){n.exec(`
|
|
4
|
+
CREATE TABLE IF NOT EXISTS ${It} (
|
|
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 ${bt} (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 bt,ge,ad,ia=l(()=>{"use strict";ea();bt="__drizzle_migrations",ge=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},ad=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","context_files","local_repositories","settings"]});import{Injectable as wd,Logger as yd}from"@nestjs/common";import{mkdirSync as bd}from"node:fs";import{dirname as Sd}from"node:path";import{DatabaseSync as sa}from"node:sqlite";var hd,gd,Ko,Y,aa=l(()=>{"use strict";qn();Xs();ia();hd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},gd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Y=Ko=class{logger=new yd(Ko.name);sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??qs();t===":memory:"?this.sqlite=new sa(":memory:"):(bd(Sd(t),{recursive:!0}),this.sqlite=new sa(t)),this.db=zs(this.sqlite),Go(this.sqlite,this.db,{log:r=>this.logger.log(r)})}async onModuleInit(){Go(this.sqlite,this.db,{log:e=>this.logger.log(e)})}getDb(){return this.db}getSqlite(){return this.sqlite}};Y=Ko=hd([wd(),gd("design:paramtypes",[])],Y)});import{Injectable as jd}from"@nestjs/common";import{eq as ca}from"drizzle-orm";var xd,vd,q,St=l(()=>{"use strict";qo();xd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},vd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},q=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){let t=new Date().toISOString();return await this.db.insert(Ye).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(Ye).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(ca(Ye.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(Ye).where(ca(Ye.id,e))}finally{this.sqlite?.exec("PRAGMA foreign_keys = ON")}return!0}toDomain(e){return{id:e.id,name:e.name,...e.description!=null?{description:e.description}:{},appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy}}};q=xd([jd(),vd("design:paramtypes",[Object,Function])],q)});import{Injectable as Ed}from"@nestjs/common";import{eq as Vo}from"drizzle-orm";var Id,_d,ua,ae,Ln=l(()=>{"use strict";Do();Id=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},_d=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ua=["ticket","pull_request","documentation"],ae=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert(ke).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(ke).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(Vo(ke.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(ke).set({order:o}).where(Vo(ke.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(ke).where(Vo(ke.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=ua.indexOf(t.subjectType)-ua.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}:{}}}};ae=Id([Ed(),_d("design:paramtypes",[Object])],ae)});import{Injectable as Rd}from"@nestjs/common";import{and as Ad,desc as Cd,eq as hn,inArray as Td}from"drizzle-orm";import{randomUUID as Od}from"node:crypto";function $d(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function qd(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function pa(n,e,t=null,r=null){let o=[];for(let i of e)if(o.push({id:i.id,jobId:n,stepDefinitionId:i.stepDefinitionId,type:i.type,status:i.status,startedAt:i.startedAt??null,completedAt:i.completedAt??null,output:i.output??null,error:i.error??null,childJobIds:i.childJobIds??null,parentStepExecutionId:t,iterationIndex:r}),i.iterations)for(let s of i.iterations)o.push(...pa(n,s.stepExecutions,i.id,s.index));return o}function Dd(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 c=s.get(a.iterationIndex)??[];c.push(a),s.set(a.iterationIndex,c)}if(s.size!==0)return[...s.entries()].sort(([a],[c])=>a-c).map(([a,c])=>{let u=c.map(d=>la(d,t(d.id)));return{index:a,stepExecutions:u,startedAt:Bd(u),...Nd(u)?{completedAt:Fd(u)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>la(o,t(o.id)))}function la(n,e){return{id:n.id,stepDefinitionId:n.stepDefinitionId,type:n.type,status:n.status,...n.startedAt!=null?{startedAt:n.startedAt}:{},...n.completedAt!=null?{completedAt:n.completedAt}:{},...n.output!==null&&n.output!==void 0?{output:n.output}:{},...n.error!=null?{error:n.error}:{},...n.childJobIds!=null?{childJobIds:n.childJobIds}:{},...e&&e.length>0?{iterations:e}:{}}}function Bd(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 Fd(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function Nd(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function Jd(n){return n==="completed"||n==="failed"||n==="cancelled"}var Pd,kd,z,gn=l(()=>{"use strict";an();Bo();Fo();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},kd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},z=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){return await this.withoutForeignKeys(async()=>{await this.db.insert(U).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(U).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(U.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=>Jd(s.status)===e.terminal)}async latestBySubject(e,t){let r={};for(let u of t)r[u]=null;if(t.length===0)return r;let o=await this.db.select({subjectId:Ae.subjectId,jobId:U.id,createdAt:U.createdAt}).from(Ae).innerJoin(U,hn(Ae.jobId,U.id)).where(Ad(hn(U.workflowId,e),Td(Ae.subjectId,t))).orderBy(Cd(U.createdAt)),i=new Map;for(let u of o)i.has(u.subjectId)||i.set(u.subjectId,u.jobId);let s=[...new Set(i.values())],a=await Promise.all(s.map(u=>this.get(u))),c=new Map(a.filter(u=>u!=null).map(u=>[u.id,u]));for(let[u,d]of i)r[u]=c.get(d)??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(Ae).where(hn(Ae.jobId,e));let r=$d(t);r.length!==0&&await this.db.insert(Ae).values(r.map(o=>({id:Od(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(yt).where(hn(yt.jobId,e));let r=pa(e,t);r.length!==0&&await this.db.insert(yt).values(r)}toDomain(e,t,r){let o=qd(t.map(s=>s.snapshot)),i=Dd(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}:{}}}};z=Pd([Rd(),kd("design:paramtypes",[Object,Function])],z)});import{Injectable as Md}from"@nestjs/common";import{eq as Wd}from"drizzle-orm";var Ld,Ud,ce,Un=l(()=>{"use strict";Bn();Ld=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},Ud=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ce=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(et).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(et).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(Wd(et.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}:{}}}};ce=Ld([Md(),Ud("design:paramtypes",[Object])],ce)});import{Injectable as Kd}from"@nestjs/common";import{eq as da}from"drizzle-orm";var Hd,Gd,Fe,Qo=l(()=>{"use strict";No();Hd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Gd=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(nt).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(nt).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(da(nt.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(nt).where(da(nt.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}}};Fe=Hd([Kd(),Gd("design:paramtypes",[Object])],Fe)});import{Injectable as zd}from"@nestjs/common";import{eq as zo}from"drizzle-orm";var Vd,Qd,Ne,Xo=l(()=>{"use strict";Jo();Vd=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},Qd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ne=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(Ce).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(Ce).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(zo(Ce.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(Ce).set({order:r}).where(zo(Ce.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(Ce).where(zo(Ce.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}:{}}}};Ne=Vd([zd(),Qd("design:paramtypes",[Object])],Ne)});import{Injectable as Zd}from"@nestjs/common";import{eq as fa}from"drizzle-orm";var Xd,Yd,ue,Mn=l(()=>{"use strict";Lo();Xd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Yd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ue=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(rt).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(rt).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(fa(rt.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(rt).where(fa(rt.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}:{}}}};ue=Xd([Zd(),Yd("design:paramtypes",[Object])],ue)});import{Injectable as nf}from"@nestjs/common";import{eq as ma}from"drizzle-orm";var ef,tf,le,Wn=l(()=>{"use strict";Uo();ef=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},tf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},le=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(ot).values({id:e.id,name:e.name,localPath:e.localPath,worktreeBasePath:e.worktreeBasePath??null}),await this.get(e.id)}async get(e){let t=await this.db.query.localRepositories.findFirst({where:{id:e}});return t?this.toDomain(t):null}async findByLocalPath(e){let r=(await this.db.query.localRepositories.findMany()).find(o=>o.localPath===e);return r?this.toDomain(r):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(ot).set({name:t.name??r.name,localPath:t.localPath??r.localPath,worktreeBasePath:t.worktreeBasePath!==void 0?t.worktreeBasePath??null:r.worktreeBasePath??null}).where(ma(ot.id,e)),this.get(e)):null}async list(){return(await this.db.query.localRepositories.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.name.localeCompare(r.name))}async delete(e){return await this.get(e)?(await this.db.delete(ot).where(ma(ot.id,e)),!0):!1}toDomain(e){return{id:e.id,name:e.name,localPath:e.localPath,...e.worktreeBasePath!=null&&e.worktreeBasePath!==""?{worktreeBasePath:e.worktreeBasePath}:{}}}};le=ef([nf(),tf("design:paramtypes",[Object])],le)});import{z as R}from"zod";var ha,ga,wa,Yo,Hn,ya,Zo=l(()=>{"use strict";ha=R.object({name:R.string().min(1),label:R.string().min(1),type:R.enum(["string","select"]),options:R.array(R.string()).optional(),required:R.boolean()}),ga=R.object({id:R.string().min(1),label:R.string().min(1),params:R.array(ha)}),wa=R.object({actionId:R.string().min(1),label:R.string().min(1),params:R.array(ha)}),Yo=R.object({templateId:R.string().min(1),params:R.record(R.string(),R.unknown())}),Hn=R.object({params:R.record(R.string(),R.unknown())}),ya=R.object({query:R.record(R.string(),R.unknown())})});import{z as Z}from"zod";var re,Gn,Kn,Vn,Qn,zn=l(()=>{"use strict";Zo();re=Z.enum(["ticket","pull_request","documentation"]),Gn=Z.object({id:Z.string().min(1),name:Z.string().min(1),subjectType:re,workflowId:Z.string().min(1),providerInstanceId:Z.string().min(1),query:Z.record(Z.string(),Z.unknown()),description:Z.string().optional(),queryTemplate:Yo.optional(),order:Z.number().int().nonnegative()}),Kn=Gn.omit({order:!0}),Vn=Gn.partial().omit({id:!0,order:!0}).extend({queryTemplate:Yo.nullable().optional()}),Qn=Z.object({viewIds:Z.array(Z.string().min(1)).min(1)})});var ba=l(()=>{"use strict";zn()});var Sa=l(()=>{"use strict";Zo()});function ei(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function xa(n,e){let t=e instanceof Set?e:new Set(e),r=ei(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function va(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&va(t.steps,e)}function ja(n){let e=[];va(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 Ia(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 ti=l(()=>{"use strict"});import{z as f}from"zod";function cf(n){return!!(n.path?.trim()||n.pattern?.trim())}function qa(n){let e=[];for(let t of n)e.push(t),t.type==="loop"&&e.push(...qa(t.steps));return e}var rf,wn,of,Je,_a,Ea,Pa,ka,Ra,Aa,Ca,Ta,sf,af,Oa,Xn,$a,yn,uf,lf,pf,df,ff,mf,hf,gf,Da,it,Ba=l(()=>{"use strict";zn();ti();rf=f.enum(["on_fail","on_complete","on_needs_input"]),wn=f.object({triggers:f.array(rf),messageTemplate:f.string().optional()}),of=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()}),Je=f.string().min(1),_a=f.object({type:f.literal("agent"),id:f.string().min(1),name:Je,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()}),Ea=f.object({type:f.literal("interaction"),id:f.string().min(1),name:Je,interaction:f.union([f.literal("questionnaire"),f.literal("confirmation"),f.literal("conversation")]),notify:f.boolean().optional()}),Pa=f.object({type:f.literal("shell"),id:f.string().min(1),name:Je,command:f.string().min(1)}),ka=f.object({type:f.literal("git"),id:f.string().min(1),name:Je,operation:f.enum(["create_worktree","checkout","create_branch","commit","push"]),params:f.record(f.string(),f.unknown())}),Ra=f.object({type:f.literal("provider_action"),id:f.string().min(1),name:Je,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:re,source:f.string().min(1),subjectId:f.string().min(1)}).optional()}),Aa=f.object({type:f.literal("sub_workflow"),id:f.string().min(1),name:Je,workflowId:f.string().min(1),forEach:f.literal("selection")}),Ca=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()})]),Ta=f.discriminatedUnion("action",[f.object({action:f.literal("fail")}),f.object({action:f.literal("continue")}),f.object({action:f.literal("ask_human")})]),sf=f.object({type:f.literal("loop"),id:f.string().min(1),name:Je,steps:f.array(f.lazy(()=>Xn)),until:Ca,maxIterations:f.number().int().nonnegative(),onMaxIterations:Ta}),af=f.enum(["fail","empty","ask_human"]),Oa=f.object({type:f.literal("extract"),id:f.string().min(1),name:Je,source:f.string(),path:f.string().optional(),pattern:f.string().optional(),onNoMatch:af}),Xn=f.lazy(()=>f.discriminatedUnion("type",[ka,Ra,Pa,_a,Ea,Aa,sf,Oa])),$a=f.object({id:f.string().min(1),name:f.string().min(1),description:f.string().optional(),appliesTo:f.union([re,f.array(re),f.literal("none")]),subjectHandling:f.enum(["per-subject","collection"]),inputSchema:f.array(of),steps:f.array(Xn),notificationPolicy:wn}),yn=$a.superRefine((n,e)=>{let t=ja(n.steps);t.length>0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`});for(let r of qa(n.steps))r.type==="extract"&&(cf(r)||e.addIssue({code:"custom",path:["steps"],message:`Extract step '${r.id}' must set at least one of path or pattern`}))});uf=_a.extend({id:f.string().min(1).optional()}),lf=Ea.extend({id:f.string().min(1).optional()}),pf=Pa.extend({id:f.string().min(1).optional()}),df=ka.extend({id:f.string().min(1).optional()}),ff=Ra.extend({id:f.string().min(1).optional()}),mf=Aa.extend({id:f.string().min(1).optional()}),hf=f.object({type:f.literal("loop"),id:f.string().min(1).optional(),name:Je,steps:f.array(f.lazy(()=>Da)),until:Ca,maxIterations:f.number().int().nonnegative(),onMaxIterations:Ta}),gf=Oa.extend({id:f.string().min(1).optional()}),Da=f.lazy(()=>f.discriminatedUnion("type",[df,ff,pf,uf,lf,mf,hf,gf])),it=$a.omit({id:!0,steps:!0}).extend({id:f.string().min(1).optional(),steps:f.array(Da)})});function ni(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function Fa(n,e){return ni(n).includes(e)}var ri=l(()=>{"use strict"});var Na=l(()=>{"use strict"});function Ja(n,e="none"){switch(n.type){case"agent":return yf(n.outputFormat);case"shell":return{isScalar:!1,fields:["exitCode","stdout","stderr"]};case"git":return Sf(n);case"provider_action":return bf(n,e);case"interaction":return{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 yf(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"]}}}function bf(n,e){if(n.extendedAction)return{isScalar:!1,opaque:!0};switch(n.action){case"get_subject":{let t=n.target?.subjectType;if(t)return{isScalar:!1,fields:bn[t]};let r=ni(e),o=[],i=new Set;for(let s of r)for(let a of bn[s])i.has(a)||(i.add(a),o.push(a));return{isScalar:!1,fields:o,...r.length>1?{fieldsDependOnSubjectType:!0}:{}}}case"get_comments":return{isScalar:!1,fields:[...wf],isArray:!0};case"get_content":return{isScalar:!0};case"post_comment":case"update_status":return{isScalar:!1,fields:[]}}}function Sf(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:[]}}}var bn,wf,La=l(()=>{"use strict";ri();bn={ticket:["id","source","title","description","status","assignee","url"],pull_request:["id","source","title","description","sourceBranch","targetBranch","author","url"],documentation:["id","source","title","url"]},wf=["id","subjectId","author","body","createdAt"]});var Ua=l(()=>{"use strict";Ba();ti();ri();Na();La()});import{z as xt}from"zod";var xf,Yn,Zn,er,Ma=l(()=>{"use strict";xf=xt.enum(["user","organization","project"]),Yn=xt.object({id:xt.string().min(1),name:xt.string().min(1),description:xt.string().optional(),tier:xf,path:xt.string().min(1)}),Zn=Yn.omit({id:!0}).extend({id:xt.string().min(1).optional()}),er=Yn.partial().omit({id:!0})});var Wa=l(()=>{"use strict";Ma()});import{z as Bt}from"zod";var tr,nr,rr,Ha=l(()=>{"use strict";tr=Bt.object({id:Bt.string().min(1),name:Bt.string().min(1),localPath:Bt.string().min(1),worktreeBasePath:Bt.string().min(1).optional()}),nr=tr.omit({id:!0}).extend({id:Bt.string().min(1).optional()}),rr=tr.partial().omit({id:!0})});var Ga=l(()=>{"use strict";Ha()});var Ka=l(()=>{"use strict"});var Va=l(()=>{"use strict";Ka()});var Qa=l(()=>{"use strict"});var za=l(()=>{"use strict";Qa()});import{z as ee}from"zod";var Ft,Xa=l(()=>{"use strict";Ft=ee.object({id:ee.string().min(1),viewId:ee.string().min(1),trigger:ee.object({type:ee.literal("cron"),cadence:ee.string().min(1)}),notificationOverride:ee.object({triggers:ee.array(ee.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:ee.string().optional()}).optional(),missedFirePolicy:ee.enum(["skip","catch_up"]),enabled:ee.boolean(),lastFiredAt:ee.string().optional(),createdAt:ee.string()})});var Ya=l(()=>{"use strict";Xa()});import{z as pe}from"zod";var or,ir,sr,ar,Za=l(()=>{"use strict";or=pe.object({id:pe.string().min(1),name:pe.string().min(1),workflowId:pe.string().min(1),inputValues:pe.record(pe.string(),pe.unknown()),lastJobId:pe.string().min(1).optional(),order:pe.number().int().nonnegative()}),ir=or.omit({order:!0}),sr=or.partial().omit({id:!0,order:!0}),ar=pe.object({shortcutIds:pe.array(pe.string().min(1)).min(1)})});var ec=l(()=>{"use strict";Za()});import{z as x}from"zod";function vt(n){return n.kind==="subject"}function Te(n){return n.kind==="agent"}function ac(n){return n.maxConcurrent??Sn}var vf,tc,nc,rc,Sn,oc,cr,ur,lr,pr,dr,fr,ic,sc,cc=l(()=>{"use strict";zn();vf=x.enum(["jira","bitbucket","github","confluence","manual"]),tc=x.enum(["claude","cursor"]),nc={id:x.string().min(1),displayName:x.string().min(1),config:x.record(x.string(),x.unknown()),secretKey:x.string().min(1),expiresOn:x.string().min(1).optional()},rc=x.object({...nc,kind:x.literal("subject"),type:vf,subjectType:re}),Sn=2,oc=x.object({...nc,kind:x.literal("agent"),type:tc,maxConcurrent:x.number().int().min(1).optional()}),cr=x.discriminatedUnion("kind",[rc,oc]),ur=x.object({providerInstances:x.array(cr).default([]),defaultAgentInstanceId:x.string().min(1).optional()}),lr=x.object({providerInstances:x.array(cr).optional(),defaultAgentInstanceId:x.string().min(1).nullable().optional()}),pr=x.discriminatedUnion("kind",[rc.extend({defaultAgent:x.boolean().optional()}),oc.extend({defaultAgent:x.boolean().optional()})]),dr=x.object({displayName:x.string().min(1).optional(),config:x.record(x.string(),x.unknown()).optional(),secretKey:x.string().min(1).optional(),expiresOn:x.union([x.string().min(1),x.null()]).optional(),defaultAgent:x.boolean().optional(),maxConcurrent:x.number().int().min(1).optional()}),fr=x.object({type:tc,apiKey:x.string().min(1).optional(),instanceId:x.string().min(1).optional()}),ic=x.object({id:x.string().min(1),displayName:x.string().min(1)}),sc={providerInstances:[]}});var uc=l(()=>{"use strict";cc()});var lc=l(()=>{"use strict"});var pc=l(()=>{"use strict";lc()});var T=l(()=>{"use strict";ba();Sa();Ua();Wa();Ga();Va();za();Ya();ec();uc();pc()});import{Injectable as _f}from"@nestjs/common";import{eq as Ef}from"drizzle-orm";function Pf(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 oi({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function oi(n){return{providerInstances:(n.providerInstances??sc.providerInstances).map(kf),...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function kf(n){return!Te(n)||n.maxConcurrent!=null?n:{...n,maxConcurrent:Sn}}function dc(n){return n.providerInstances!==void 0}var jf,If,_,we=l(()=>{"use strict";T();Mo();jf=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},If=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:pn}});return oi(e?e.data:{})}async update(e){let t=Pf(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:pn}})?await this.db.update(Dt).set({data:t}).where(Ef(Dt.id,pn)):await this.db.insert(Dt).values({id:pn,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};_=jf([_f(),If("design:paramtypes",[Object])],_)});import{Module as Af}from"@nestjs/common";var Rf,Cf,Oe,xn=l(()=>{"use strict";aa();St();Ln();gn();Un();Qo();Xo();Mn();Wn();we();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},Cf=[q,ae,z,ce,Fe,Ne,ue,le,_],Oe=class{};Oe=Rf([Af({providers:[Y,{provide:q,useFactory:n=>new q(n.getDb(),n.getSqlite()),inject:[Y]},{provide:ae,useFactory:n=>new ae(n.getDb()),inject:[Y]},{provide:z,useFactory:n=>new z(n.getDb(),n.getSqlite()),inject:[Y]},{provide:ce,useFactory:n=>new ce(n.getDb()),inject:[Y]},{provide:Fe,useFactory:n=>new Fe(n.getDb()),inject:[Y]},{provide:Ne,useFactory:n=>new Ne(n.getDb()),inject:[Y]},{provide:ue,useFactory:n=>new ue(n.getDb()),inject:[Y]},{provide:le,useFactory:n=>new le(n.getDb()),inject:[Y]},{provide:_,useFactory:n=>new _(n.getDb()),inject:[Y]}],exports:[Y,...Cf]})],Oe)});import{Injectable as $f,Logger as qf,Inject as mc}from"@nestjs/common";async function hc(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 Df(n,e,t){let r=await hc(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 Tf,Of,fc,ii,st,si=l(()=>{"use strict";we();Be();Tf=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},Of=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fc=function(n,e){return function(t,r){e(t,r,n)}};st=ii=class{secrets;settings;logger=new qf(ii.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Df(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return hc(this.secrets,e.providerInstances??[])}};st=ii=Tf([$f(),fc(0,mc(me)),fc(1,mc(_)),Of("design:paramtypes",[Function,_])],st)});function mr(n,e=$t(n)){let t=Jf[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function gc(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 Ff){let o=e.get(r);o?.length&&t.push(`## ${Bf[r]}
|
|
11
|
+
`);let t=n.prepare(`INSERT INTO ${It} (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 It,be,Ud,$a=l(()=>{"use strict";Ra();It="__drizzle_migrations",be=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},Ud=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","context_files","local_repositories","settings"]});import{Injectable as ef,Logger as tf}from"@nestjs/common";import{mkdirSync as nf}from"node:fs";import{dirname as rf}from"node:path";import{DatabaseSync as qa}from"node:sqlite";var Yd,Zd,yi,Z,Da=l(()=>{"use strict";tr();Pa();$a();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},Zd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=yi=class{logger=new tf(yi.name);sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??la();t===":memory:"?this.sqlite=new qa(":memory:"):(nf(rf(t),{recursive:!0}),this.sqlite=new qa(t)),this.db=_a(this.sqlite),hi(this.sqlite,this.db,{log:r=>this.logger.log(r)})}async onModuleInit(){hi(this.sqlite,this.db,{log:e=>this.logger.log(e)})}getDb(){return this.db}getSqlite(){return this.sqlite}};Z=yi=Yd([ef(),Zd("design:paramtypes",[])],Z)});import{Injectable as af}from"@nestjs/common";import{eq as Ba}from"drizzle-orm";var of,sf,D,_t=l(()=>{"use strict";oi();of=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},sf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},D=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){let t=new Date().toISOString();return await this.db.insert(tt).values({id:e.id,name:e.name,description:e.description??null,appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy,createdAt:t,updatedAt:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowDefinitions.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(tt).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,appliesTo:t.appliesTo??r.appliesTo,subjectHandling:t.subjectHandling??r.subjectHandling,inputSchema:t.inputSchema??r.inputSchema,steps:t.steps??r.steps,notificationPolicy:t.notificationPolicy??r.notificationPolicy,updatedAt:new Date().toISOString()}).where(Ba(tt.id,e)),this.get(e)):null}async list(e={}){return(e.subjectHandling?await this.db.query.workflowDefinitions.findMany({where:{subjectHandling:e.subjectHandling}}):await this.db.query.workflowDefinitions.findMany()).map(r=>this.toDomain(r))}async delete(e){if(!await this.get(e))return!1;try{this.sqlite?.exec("PRAGMA foreign_keys = OFF"),await this.db.delete(tt).where(Ba(tt.id,e))}finally{this.sqlite?.exec("PRAGMA foreign_keys = ON")}return!0}toDomain(e){return{id:e.id,name:e.name,...e.description!=null?{description:e.description}:{},appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy}}};D=of([af(),sf("design:paramtypes",[Object,Function])],D)});import{Injectable as lf}from"@nestjs/common";import{eq as wi}from"drizzle-orm";var cf,uf,Fa,le,sr=l(()=>{"use strict";ii();cf=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)},Fa=["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(Oe).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(Oe).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(Oe.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(Oe).set({order:o}).where(wi(Oe.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(Oe).where(wi(Oe.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=Fa.indexOf(t.subjectType)-Fa.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=cf([lf(),uf("design:paramtypes",[Object])],le)});import{Injectable as ff}from"@nestjs/common";import{and as mf,desc as hf,eq as Tn,inArray as yf}from"drizzle-orm";import{randomUUID as wf}from"node:crypto";function gf(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function bf(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function Ja(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(...Ja(n,s.stepExecutions,i.id,s.index));return o}function Sf(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(d=>Na(d,t(d.id)));return{index:a,stepExecutions:c,startedAt:xf(c),...jf(c)?{completedAt:vf(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Na(o,t(o.id)))}function Na(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 xf(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 vf(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function jf(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function If(n){return n==="completed"||n==="failed"||n==="cancelled"}var pf,df,X,On=l(()=>{"use strict";jn();si();ai();pf=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},df=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},X=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(Tn(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=>If(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:K.id,createdAt:K.createdAt}).from(qe).innerJoin(K,Tn(qe.jobId,K.id)).where(mf(Tn(K.workflowId,e),yf(qe.subjectId,t))).orderBy(hf(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,d]of i)r[c]=u.get(d)??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(Tn(qe.jobId,e));let r=gf(t);r.length!==0&&await this.db.insert(qe).values(r.map(o=>({id:wf(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(jt).where(Tn(jt.jobId,e));let r=Ja(e,t);r.length!==0&&await this.db.insert(jt).values(r)}toDomain(e,t,r){let o=bf(t.map(s=>s.snapshot)),i=Sf(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}:{}}}};X=pf([ff(),df("design:paramtypes",[Object,Function])],X)});import{Injectable as Ef}from"@nestjs/common";import{eq as kf}from"drizzle-orm";var _f,Pf,pe,ar=l(()=>{"use strict";rr();_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)},pe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(rt).values({id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,status:e.status,triggeredBy:e.triggeredBy,scheduleId:e.scheduleId??null,notificationOverride:e.notificationOverride??null,notificationSent:e.notificationSent,createdAt:e.createdAt,completedAt:e.completedAt??null}),await this.get(e.id)}async get(e){let t=await this.db.query.jobBatches.findFirst({where:{id:e},with:{jobs:!0}});return t?this.toDomain(t,t.jobs.map(r=>r.id)):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(rt).set({workflowId:t.workflowId??r.workflowId,selection:t.selection??r.selection,resolvedSubjects:t.resolvedSubjects??r.resolvedSubjects,status:t.status??r.status,triggeredBy:t.triggeredBy??r.triggeredBy,scheduleId:t.scheduleId!==void 0?t.scheduleId??null:r.scheduleId??null,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,notificationSent:t.notificationSent??r.notificationSent,createdAt:t.createdAt??r.createdAt,completedAt:t.completedAt!==void 0?t.completedAt??null:r.completedAt??null}).where(kf(rt.id,e)),this.get(e)):null}async list(e={}){return(e.workflowId?await this.db.query.jobBatches.findMany({where:{workflowId:e.workflowId},with:{jobs:!0}}):await this.db.query.jobBatches.findMany({with:{jobs:!0}})).map(r=>this.toDomain(r,r.jobs.map(o=>o.id)))}toDomain(e,t){return{id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,jobIds:t,status:e.status,triggeredBy:e.triggeredBy,...e.scheduleId!=null?{scheduleId:e.scheduleId}:{},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},notificationSent:e.notificationSent,createdAt:e.createdAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};pe=_f([Ef(),Pf("design:paramtypes",[Object])],pe)});import{Injectable as Cf}from"@nestjs/common";import{eq as La}from"drizzle-orm";var Rf,Af,Ue,gi=l(()=>{"use strict";ci();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},Af=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ue=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(it).values({id:e.id,viewId:e.viewId,triggerType:e.trigger.type,cadence:e.trigger.cadence,notificationOverride:e.notificationOverride??null,missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,lastFiredAt:e.lastFiredAt??null,createdAt:e.createdAt}),await this.get(e.id)}async get(e){let t=await this.db.query.schedules.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.trigger??r.trigger;return await this.db.update(it).set({viewId:t.viewId??r.viewId,triggerType:o.type,cadence:o.cadence,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,missedFirePolicy:t.missedFirePolicy??r.missedFirePolicy,enabled:t.enabled??r.enabled,lastFiredAt:t.lastFiredAt!==void 0?t.lastFiredAt??null:r.lastFiredAt??null,createdAt:t.createdAt??r.createdAt}).where(La(it.id,e)),this.get(e)}async list(e={}){return(e.enabled!==void 0?await this.db.query.schedules.findMany({where:{enabled:e.enabled}}):await this.db.query.schedules.findMany()).map(r=>this.toDomain(r))}async delete(e){return await this.get(e)?(await this.db.delete(it).where(La(it.id,e)),!0):!1}async findDue(e){return(await this.list({enabled:!0})).filter(r=>r.lastFiredAt==null||r.lastFiredAt<e)}toDomain(e){return{id:e.id,viewId:e.viewId,trigger:{type:"cron",cadence:e.cadence},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,...e.lastFiredAt!=null?{lastFiredAt:e.lastFiredAt}:{},createdAt:e.createdAt}}};Ue=Rf([Cf(),Af("design:paramtypes",[Object])],Ue)});import{Injectable as $f}from"@nestjs/common";import{eq as bi}from"drizzle-orm";var Tf,Of,He,Si=l(()=>{"use strict";ui();Tf=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},Of=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(bi(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(bi(De.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(De).where(bi(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=Tf([$f(),Of("design:paramtypes",[Object])],He)});import{Injectable as Bf}from"@nestjs/common";import{eq as Ma}from"drizzle-orm";var qf,Df,de,cr=l(()=>{"use strict";li();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},Df=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},de=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(st).values({id:e.id,name:e.name,description:e.description??null,tier:e.tier,path:e.path}),await this.get(e.id)}async get(e){let t=await this.db.query.contextFiles.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(st).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,tier:t.tier??r.tier,path:t.path??r.path}).where(Ma(st.id,e)),this.get(e)):null}async list(){return(await this.db.query.contextFiles.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.name.localeCompare(r.name))}async delete(e){return await this.get(e)?(await this.db.delete(st).where(Ma(st.id,e)),!0):!1}toDomain(e){return{id:e.id,name:e.name,tier:e.tier,path:e.path,...e.description!=null&&e.description!==""?{description:e.description}:{}}}};de=qf([Bf(),Df("design:paramtypes",[Object])],de)});import{Injectable as Jf}from"@nestjs/common";import{eq as Wa}from"drizzle-orm";var Ff,Nf,fe,ur=l(()=>{"use strict";pi();Ff=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Nf=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(at).values({id:e.id,name:e.name,localPath:e.localPath,worktreeBasePath:e.worktreeBasePath??null,defaultBranch:e.defaultBranch??null}),await this.get(e.id)}async get(e){let t=await this.db.query.localRepositories.findFirst({where:{id:e}});return t?this.toDomain(t):null}async findByLocalPath(e){let r=(await this.db.query.localRepositories.findMany()).find(o=>o.localPath===e);return r?this.toDomain(r):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(at).set({name:t.name??r.name,localPath:t.localPath??r.localPath,worktreeBasePath:t.worktreeBasePath!==void 0?t.worktreeBasePath??null:r.worktreeBasePath??null,defaultBranch:t.defaultBranch!==void 0?t.defaultBranch??null:r.defaultBranch??null}).where(Wa(at.id,e)),this.get(e)):null}async list(){return(await this.db.query.localRepositories.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.name.localeCompare(r.name))}async delete(e){return await this.get(e)?(await this.db.delete(at).where(Wa(at.id,e)),!0):!1}toDomain(e){return{id:e.id,name:e.name,localPath:e.localPath,...e.worktreeBasePath!=null&&e.worktreeBasePath!==""?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch!=null&&e.defaultBranch!==""?{defaultBranch:e.defaultBranch}:{}}}};fe=Ff([Jf(),Nf("design:paramtypes",[Object])],fe)});import{z as A}from"zod";var Ua,Ha,Ka,xi,lr,Va,vi=l(()=>{"use strict";Ua=A.object({name:A.string().min(1),label:A.string().min(1),type:A.enum(["string","select"]),options:A.array(A.string()).optional(),required:A.boolean()}),Ha=A.object({id:A.string().min(1),label:A.string().min(1),params:A.array(Ua)}),Ka=A.object({actionId:A.string().min(1),label:A.string().min(1),params:A.array(Ua)}),xi=A.object({templateId:A.string().min(1),params:A.record(A.string(),A.unknown())}),lr=A.object({params:A.record(A.string(),A.unknown())}),Va=A.object({query:A.record(A.string(),A.unknown())})});import{z as ee}from"zod";var ie,pr,dr,fr,mr,hr=l(()=>{"use strict";vi();ie=ee.enum(["ticket","pull_request","documentation"]),pr=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:xi.optional(),order:ee.number().int().nonnegative()}),dr=pr.omit({order:!0}),fr=pr.partial().omit({id:!0,order:!0}).extend({queryTemplate:xi.nullable().optional()}),mr=ee.object({viewIds:ee.array(ee.string().min(1)).min(1)})});var Ga=l(()=>{"use strict";hr()});var Qa=l(()=>{"use strict";vi()});function ji(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function za(n,e){let t=e instanceof Set?e:new Set(e),r=ji(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function Xa(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&Xa(t.steps,e)}function Ya(n){let e=[];Xa(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 Za(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 Ii=l(()=>{"use strict"});import{z as f}from"zod";function ec(n){return typeof n=="object"&&typeof n.source=="string"}function Kf(n){return!!(n.path?.trim()||n.pattern?.trim())}function Vf(n,e){let t=e.sourceStepIds??[];if(t.length===0)return`comment_review step '${e.id}' requires sourceStepIds`;let r=_i(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 _i(n){let e=[];for(let t of n)e.push(t),t.type==="loop"&&e.push(..._i(t.steps));return e}var Lf,$n,Mf,Ke,Be,tc,nc,rc,oc,ic,sc,Wf,ac,cc,Uf,Hf,uc,yr,lc,qn,Gf,Qf,zf,Xf,Yf,Zf,em,tm,pc,ct,dc=l(()=>{"use strict";hr();Ii();Lf=f.enum(["on_fail","on_complete","on_needs_input"]),$n=f.object({triggers:f.array(Lf),messageTemplate:f.string().optional()}),Mf=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()}),Ke=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()})]),tc=Be,nc=f.object({type:f.literal("agent"),id:f.string().min(1),name:Ke,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()}),rc=f.object({type:f.literal("interaction"),id:f.string().min(1),name:Ke,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()}),oc=f.object({type:f.literal("shell"),id:f.string().min(1),name:Ke,command:f.string().min(1),condition:Be.optional()}),ic=f.object({type:f.literal("git"),id:f.string().min(1),name:Ke,operation:f.enum(["create_worktree","checkout","create_branch","commit","push"]),params:f.record(f.string(),f.unknown()),condition:Be.optional()}),sc=f.object({type:f.literal("provider_action"),id:f.string().min(1),name:Ke,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()}),Wf=f.union([f.literal("selection"),f.object({source:f.string().min(1)})]),ac=f.object({type:f.literal("sub_workflow"),id:f.string().min(1),name:Ke,workflowId:f.string().min(1),forEach:Wf,condition:Be.optional()}),cc=f.discriminatedUnion("action",[f.object({action:f.literal("fail")}),f.object({action:f.literal("continue")}),f.object({action:f.literal("ask_human")})]),Uf=f.object({type:f.literal("loop"),id:f.string().min(1),name:Ke,steps:f.array(f.lazy(()=>yr)),until:tc,maxIterations:f.number().int().nonnegative(),onMaxIterations:cc,condition:Be.optional()}),Hf=f.enum(["fail","empty","ask_human"]),uc=f.object({type:f.literal("extract"),id:f.string().min(1),name:Ke,source:f.string(),path:f.string().optional(),pattern:f.string().optional(),onNoMatch:Hf,condition:Be.optional()}),yr=f.lazy(()=>f.discriminatedUnion("type",[ic,sc,oc,nc,rc,ac,Uf,uc])),lc=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(Mf),steps:f.array(yr),notificationPolicy:$n}),qn=lc.superRefine((n,e)=>{let t=Ya(n.steps);t.length>0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`});for(let r of _i(n.steps))if(r.type==="extract"&&!Kf(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=Vf(n.steps,r);o&&e.addIssue({code:"custom",path:["steps"],message:o})}});Gf=nc.extend({id:f.string().min(1).optional()}),Qf=rc.extend({id:f.string().min(1).optional()}),zf=oc.extend({id:f.string().min(1).optional()}),Xf=ic.extend({id:f.string().min(1).optional()}),Yf=sc.extend({id:f.string().min(1).optional()}),Zf=ac.extend({id:f.string().min(1).optional()}),em=f.object({type:f.literal("loop"),id:f.string().min(1).optional(),name:Ke,steps:f.array(f.lazy(()=>pc)),until:tc,maxIterations:f.number().int().nonnegative(),onMaxIterations:cc,condition:Be.optional()}),tm=uc.extend({id:f.string().min(1).optional()}),pc=f.lazy(()=>f.discriminatedUnion("type",[Xf,Yf,zf,Gf,Qf,Zf,em,tm])),ct=lc.omit({id:!0,steps:!0}).extend({id:f.string().min(1).optional(),steps:f.array(pc)})});function nm(n,e){let t=e[n.stepId],r=t!=null&&typeof t=="object"?t[n.field]:void 0;return{stepOutput:t,fieldValue:r}}function wr(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 fc(n,e){return{condition:n,inputs:nm(n,e)}}var mc=l(()=>{"use strict"});function Pi(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function hc(n,e){return Pi(n).includes(e)}var Ei=l(()=>{"use strict"});var yc=l(()=>{"use strict"});function wc(n,e="none"){switch(n.type){case"agent":return om(n.outputFormat);case"shell":return{isScalar:!1,fields:["exitCode","stdout","stderr"]};case"git":return sm(n);case"provider_action":return im(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 gc(n,e){let t=[];return bc(n,e,t,!1)?t:[]}function om(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 im(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:Dn[t]};let r=Pi(e),o=[],i=new Set;for(let s of r)for(let a of Dn[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:[...rm],isArray:!0};case"get_content":return{isScalar:!0};case"post_comment":case"update_status":return{isScalar:!1,fields:[]}}}function sm(n){switch(n.operation){case"create_worktree":return{isScalar:!1,fields:["worktreePath","branch"]};case"commit":return{isScalar:!1,fields:["sha"]};case"checkout":case"create_branch":case"push":return{isScalar:!1,fields:[]}}}function am(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 bc(n,e,t,r){for(let o of n){if(am(o,e))return!0;if(o.type==="loop"&&Array.isArray(o.steps)){if(bc(o.steps,e,t,!0))return!0}else t.push({step:o,inLoop:r})}return!1}var Dn,rm,ki=l(()=>{"use strict";Ei();Dn={ticket:["id","source","title","description","status","assignee","url"],pull_request:["id","source","title","description","sourceBranch","targetBranch","author","url"],documentation:["id","source","title","url"]},rm=["id","subjectId","author","body","createdAt"]});function Sc(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 cm(n){if(Array.isArray(n)){let r=[];for(let o of n){let i=Sc(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=Sc(r);if(!o)return null;t.push(o)}return t}function um(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 lm(n,e){return gc(n,e).map(t=>t.step).filter(t=>t.type==="agent"&&"outputFormat"in t&&t.outputFormat==="comment_suggestions")}function xc(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(lm(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=cm(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 um(i)}function vc(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 jc=l(()=>{"use strict";ki()});var Ic=l(()=>{"use strict";dc();mc();Ii();Ei();yc();ki();jc()});import{z as Pt}from"zod";var pm,gr,br,Sr,_c=l(()=>{"use strict";pm=Pt.enum(["user","organization","project"]),gr=Pt.object({id:Pt.string().min(1),name:Pt.string().min(1),description:Pt.string().optional(),tier:pm,path:Pt.string().min(1)}),br=gr.omit({id:!0}).extend({id:Pt.string().min(1).optional()}),Sr=gr.partial().omit({id:!0})});var Pc=l(()=>{"use strict";_c()});import{z as Et}from"zod";var xr,vr,jr,Ec=l(()=>{"use strict";xr=Et.object({id:Et.string().min(1),name:Et.string().min(1),localPath:Et.string().min(1),worktreeBasePath:Et.string().min(1).optional(),defaultBranch:Et.string().min(1).optional()}),vr=xr.omit({id:!0}).extend({id:Et.string().min(1).optional()}),jr=xr.partial().omit({id:!0})});var kc=l(()=>{"use strict";Ec()});var Rc=l(()=>{"use strict"});function dm(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 Ac(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=dm(r);if(!o)return null;t.push(o)}return t}function Cc(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 Tc=l(()=>{"use strict"});var Oc=l(()=>{"use strict";Rc();Tc()});var $c=l(()=>{"use strict"});var qc=l(()=>{"use strict";$c()});import{z as te}from"zod";var Gt,Dc=l(()=>{"use strict";Gt=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 Bc=l(()=>{"use strict";Dc()});import{z as me}from"zod";var Ir,_r,Pr,Er,Fc=l(()=>{"use strict";Ir=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()}),_r=Ir.omit({order:!0}),Pr=Ir.partial().omit({id:!0,order:!0}),Er=me.object({shortcutIds:me.array(me.string().min(1)).min(1)})});var Nc=l(()=>{"use strict";Fc()});import{z as S}from"zod";function Vc(n){return Hc.safeParse(n).success}function kt(n){return n.kind==="subject"}function Fe(n){return n.kind==="agent"}function Qc(n){return n.maxConcurrent??Bn}var fm,Jc,Lc,Mc,Bn,Wc,kr,Rr,Ar,Cr,Tr,Or,Uc,Hc,$r,Kc,Gc,zc=l(()=>{"use strict";hr();fm=S.enum(["jira","bitbucket","github","confluence","manual"]),Jc=S.enum(["claude","cursor"]),Lc={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()},Mc=S.object({...Lc,kind:S.literal("subject"),type:fm,subjectType:ie}),Bn=2,Wc=S.object({...Lc,kind:S.literal("agent"),type:Jc,maxConcurrent:S.number().int().min(1).optional()}),kr=S.discriminatedUnion("kind",[Mc,Wc]),Rr=S.object({providerInstances:S.array(kr).default([]),defaultAgentInstanceId:S.string().min(1).optional()}),Ar=S.object({providerInstances:S.array(kr).optional(),defaultAgentInstanceId:S.string().min(1).nullable().optional()}),Cr=S.discriminatedUnion("kind",[Mc.extend({defaultAgent:S.boolean().optional()}),Wc.extend({defaultAgent:S.boolean().optional()})]),Tr=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()}),Or=S.object({type:Jc,apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),Uc=S.object({id:S.string().min(1),displayName:S.string().min(1)}),Hc=S.enum(["jira","bitbucket","github","confluence","claude","cursor"]),$r=S.object({type:Hc,config:S.record(S.string(),S.unknown()).optional(),apiKey:S.string().min(1).optional(),instanceId:S.string().min(1).optional()}),Kc=S.object({success:S.boolean(),message:S.string().optional(),identityMismatch:S.boolean().optional()});Gc={providerInstances:[]}});var Xc=l(()=>{"use strict";zc()});var Yc=l(()=>{"use strict"});function Zc(n,e){switch(n){case"questionnaire":return Ri(e);case"confirmation":return mm(e);case"conversation":return hm(e);case"comment_review":return ym(e);default:return n}}function Ri(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 mm(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)?[]:Ri(n)}function hm(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?Ri(n):[]}function ym(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 eu=l(()=>{"use strict"});var tu=l(()=>{"use strict";Yc();eu()});var C=l(()=>{"use strict";Ga();Qa();Ic();Pc();kc();Oc();qc();Bc();Nc();Xc();tu()});import{Injectable as bm}from"@nestjs/common";import{eq as Sm}from"drizzle-orm";function xm(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 Ai({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function Ai(n){return{providerInstances:(n.providerInstances??Gc.providerInstances).map(vm),...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function vm(n){return!Fe(n)||n.maxConcurrent!=null?n:{...n,maxConcurrent:Bn}}function nu(n){return n.providerInstances!==void 0}var wm,gm,I,he=l(()=>{"use strict";C();di();wm=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},gm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},I=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:kn}});return Ai(e?e.data:{})}async update(e){let t=xm(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:kn}})?await this.db.update(Vt).set({data:t}).where(Sm(Vt.id,kn)):await this.db.insert(Vt).values({id:kn,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};I=wm([bm(),gm("design:paramtypes",[Object])],I)});import{Module as Im}from"@nestjs/common";var jm,_m,Ne,Fn=l(()=>{"use strict";Da();_t();sr();On();ar();gi();Si();cr();ur();he();jm=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=[D,le,X,pe,Ue,He,de,fe,I],Ne=class{};Ne=jm([Im({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:X,useFactory:n=>new X(n.getDb(),n.getSqlite()),inject:[Z]},{provide:pe,useFactory:n=>new pe(n.getDb()),inject:[Z]},{provide:Ue,useFactory:n=>new Ue(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:I,useFactory:n=>new I(n.getDb()),inject:[Z]}],exports:[Z,..._m]})],Ne)});import{Injectable as km,Logger as Rm,Inject as ou}from"@nestjs/common";async function iu(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 Am(n,e,t){let r=await iu(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 Pm,Em,ru,Ci,ut,Ti=l(()=>{"use strict";he();Ce();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},Em=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ru=function(n,e){return function(t,r){e(t,r,n)}};ut=Ci=class{secrets;settings;logger=new Rm(Ci.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Am(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return iu(this.secrets,e.providerInstances??[])}};ut=Ci=Pm([km(),ru(0,ou(oe)),ru(1,ou(I)),Em("design:paramtypes",[Function,I])],ut)});function qr(n,e=Ht(n)){let t=$m[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function su(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 Tm){let o=e.get(r);o?.length&&t.push(`## ${Cm[r]}
|
|
12
12
|
${o.join(`
|
|
13
13
|
|
|
14
14
|
`)}`)}return t.join(`
|
|
15
15
|
|
|
16
|
-
`)}function
|
|
16
|
+
`)}function Nn(n){let e=[],t=su(n.knowledge);return t&&e.push(t),e.push(`# Objective
|
|
17
17
|
${n.objective}`),e.push(`# Output format
|
|
18
|
-
${
|
|
18
|
+
${Om[n.outputFormat]}`),e.join(`
|
|
19
19
|
|
|
20
|
-
`)}function
|
|
21
|
-
`).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function
|
|
22
|
-
`;let t=(e.content??[]).map(
|
|
23
|
-
`:t}var ai=l(()=>{"use strict"});function Qf(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function jc(n){return{representation:"atlas_doc_format",value:JSON.stringify(Sr(n))}}function _c(n){return In(zf(n))}function zf(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 Ic(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:Xf(e,n),raw:n}}function Xf(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 Yf(n,e){return{id:String(n.id??""),subjectId:e,body:_c(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var Gf,Kf,Vf,vc,xr,vr,ci=l(()=>{"use strict";br();ai();Gf="kno.confluence.apiToken",Kf=50,Vf=10,vc=500,xr=[{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}]}],vr=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()||Gf}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Ic(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 _c(t.body)}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){await this.requireConfig();let t=[],r=`/wiki/api/v2/pages/${encodeURIComponent(e)}/footer-comments?body-format=atlas_doc_format&limit=${Kf}`,o=new Set;for(let i=0;i<Vf&&t.length<vc&&!(!r||o.has(r));i++){o.add(r);let s=await this.request("GET",r),a=Array.isArray(s.results)?s.results:[];for(let u of a){if(t.length>=vc)break;t.push(Yf(u,e))}let c=typeof s._links?.next=="string"?s._links.next:void 0;if(!c||a.length===0)break;r=c}return t}async postComment(e,t){await this.requireConfig(),await this.request("POST","/wiki/api/v2/footer-comments",{body:{pageId:e,body:jc(t)}})}listExtendedActions(){return xr}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${Nt(this.listExtendedActions())}`)}async createPage(e){let t=xr[0];yr(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),c=await this.request("POST","/wiki/api/v2/pages",{body:{spaceId:a,status:"current",title:o,body:jc(i)}});return Ic(c,s,this.instanceId)}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Confluence instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=Qf(o,t),c={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(c["Content-Type"]="application/json");let u=await this.fetchFn(a,{method:e,headers:c,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let m=await u.text().catch(()=>"");throw new Error(`Confluence ${e} ${t} failed (${u.status}): ${m||u.statusText}`)}if(u.status===204)return;let d=await u.text();if(d)return JSON.parse(d)}}});import{randomUUID as Zf}from"node:crypto";var em,jr,Ec=l(()=>{"use strict";em=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),jr=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:Zf(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(em.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function ui(){return nm.replace(/\/$/,"")}function _n(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 rm(n,e){return`${n}#${e}`}function om(n){let e=n.repoSlug;if(typeof e!="string"||e.trim().length===0)throw new Error("Bitbucket query requires filter.repoSlug or filter.role \u2014 repo-scoped listing needs repoSlug; workspace-wide listing needs role (author|reviewer)");return e.trim()}function im(n){if(typeof n.repoSlug=="string"&&n.repoSlug.trim().length>0||!Rc(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 kc(n){if(!Rc(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 sm(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=kc(n.state);if(e)return`state="${e}"`}function am(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 cm(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 Rc(n){return n!=null&&n!==""}function di(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function Ir(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:rm(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},sourceBranch:String(n.source?.branch?.name??""),targetBranch:String(n.destination?.branch?.name??""),...n.author?.display_name?{author:n.author.display_name}:{},...n.links?.html?.href?{url:n.links.html.href}:{},raw:n}}function um(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 tm,nm,li,Pc,pi,fi,_r,mi=l(()=>{"use strict";br();tm="kno.bitbucket.apiToken",nm="https://api.bitbucket.org/2.0";li=50,Pc=10,pi=500,fi=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],_r=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()||tm}async get(e){let{repoSlug:t,prNumber:r}=_n(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return Ir(i,t,this.instanceId)}async query(e){let t=im(e);if(t)return this.queryWorkspacePullRequests(t,e);let r=om(e),{workspace:o}=await this.requireConfig(),i=sm(e),s=new URLSearchParams({pagelen:String(li)});i&&s.set("q",i);let a=`${ui()}/repositories/${encodeURIComponent(o)}/${encodeURIComponent(r)}/pullrequests?${s.toString()}`;return this.collectPullRequests(a,r)}async queryWorkspacePullRequests(e,t){let{workspace:r}=await this.requireConfig(),o=await this.selectedUser(),i=new URLSearchParams({pagelen:String(li)}),s=kc(t.state);s&&i.set("state",s),e==="reviewer"&&i.set("role","REVIEWER");let a=`${ui()}/workspaces/${encodeURIComponent(r)}/pullrequests/${encodeURIComponent(o)}?${i.toString()}`;return this.collectPullRequests(a)}selectedUserCache;async selectedUser(){let{email:e}=await this.requireConfig();if(this.selectedUserCache?.email===e)return this.selectedUserCache.id;let t=await this.request("GET","/user"),r=di(t.uuid,t.account_id,t.username);if(!r)throw new Error("Bitbucket GET /user did not return uuid, account_id, or username \u2014 cannot list workspace pull requests");return this.selectedUserCache={email:e,id:r},r}async collectPullRequests(e,t){let r=[],o=new Set,i=e;for(let s=0;s<Pc&&r.length<pi&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),c=Array.isArray(a.values)?a.values:[];for(let d of c){if(r.length>=pi)break;r.push(Ir(d,t??am(d),this.instanceId))}let u=typeof a.next=="string"&&a.next.length>0?a.next:void 0;if(!u||c.length===0)break;i=u}return r}async getComments(e){let{repoSlug:t,prNumber:r}=_n(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${li}`;for(let c=0;c<Pc&&i.length<pi&&!(!a||s.has(a));c++){s.add(a);let u=await this.request("GET",a),d=Array.isArray(u.values)?u.values:[];for(let b of d)i.push(um(b,e));let m=typeof u.next=="string"&&u.next.length>0?u.next:void 0;if(!m||d.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=_n(e),{workspace:i}=await this.requireConfig();await this.request("POST",`${this.prPath(i,r,o)}/comments`,{body:{content:{raw:t}}})}async updateStatus(e,t){let{repoSlug:r,prNumber:o}=_n(e),{workspace:i}=await this.requireConfig(),s=cm(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return fi}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${Nt(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}=_n(t),{workspace:s}=await this.requireConfig(),a=await this.request("GET",this.prPath(s,o,i)),c=await this.request("GET",`/users/${encodeURIComponent(r)}`),u=di(c.uuid),d=di(c.account_id);if(!u&&!d)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(O=>u!=null&&O.uuid===u||d!=null&&O.account_id===d))return Ir(a,o,this.instanceId);let S=[...m.map(O=>O.uuid?{uuid:O.uuid}:{account_id:O.account_id}),u?{uuid:u}:{account_id:d}],k=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:S}});return Ir(k,o,this.instanceId)}prPath(e,t,r){return`/repositories/${encodeURIComponent(e)}/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}`}async requireConfig(){let e=this.email,t=this.workspace,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.email"),t||o.push("config.workspace"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Bitbucket instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set email and workspace on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{email:e,workspace:t,token:r}}async request(e,t,r={}){let{email:o,token:i}=await this.requireConfig(),s=t.startsWith("http://")||t.startsWith("https://")?t:`${ui()}${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 c=await this.fetchFn(s,{method:e,headers:a,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let d=await c.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${c.status}): ${d||c.statusText}`)}if(c.status===204)return;let u=await c.text();if(u)return JSON.parse(u)}}});import{randomUUID as lm}from"node:crypto";function pm(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Er,Ac=l(()=>{"use strict";Er=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=>pm(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:lm(),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 hi(n){return n.pull_request!=null}function Pr(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}=Cc(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 gm(n,e,t){return`${n}/${e}#${t}`}function Cc(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 wm(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function ym(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function bm(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: ${hm.join(", ")}`)}function Sm(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function gi(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:gm(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 xm(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function kr(n){return n!=null&&n!==""}var dm,fm,mm,hm,Rr,Tc=l(()=>{"use strict";dm="2026-03-10",fm="https://api.github.com",mm="kno.github.apiToken",hm=["open","closed/done/completed","not_planned/wontfix"],Rr=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()||mm}async get(e){let{owner:t,repo:r,issueNumber:o}=Pr(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(hi(i))throw new Error(`Ticket not found: ${e}`);return gi(i,this.instanceId,`${t}/${r}`)}async query(e){let t=typeof e.repo=="string"?e.repo.trim():"";if(t)return this.queryRepoIssues(t,e);let r=wm(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repo ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=Pr(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>xm(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=Pr(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}=Pr(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:bm(t)})}async queryRepoIssues(e,t){let{owner:r,name:o}=Cc(e),i=[],s=new URLSearchParams;s.set("per_page",String(100)),kr(t.state)&&s.set("state",String(t.state)),kr(t.labels)&&s.set("labels",String(t.labels)),kr(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=10&&i.length<500;a++){s.set("page",String(a));let c=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues?${s.toString()}`),u=Array.isArray(c)?c:[];if(u.length===0)break;for(let d of u)if(!hi(d)){if(i.length>=500)break;i.push(gi(d,this.instanceId,`${r}/${o}`))}if(u.length<100)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[ym(e,r),"is:issue"];kr(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=10&&s.length<500;a++){let c=new URLSearchParams({q:i,per_page:String(100),page:String(a)}),u=await this.request("GET",`/search/issues?${c.toString()}`),d=Array.isArray(u.items)?u.items:[];if(d.length===0)break;for(let m of d)if(!hi(m)){if(s.length>=500)break;s.push(gi(m,this.instanceId,Sm(m)))}if(d.length<100)break}return s}requireUsername(){if(!this.username)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing config.username`);return this.username}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing SecretStore '${this.secretKey}'. Store the token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`);return e}async request(e,t,r={}){let o=await this.requireToken(),i=`${fm}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":dm};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 u=await a.text().catch(()=>"");throw new Error(`GitHub ${e} ${t} failed (${a.status}): ${u||a.statusText}`)}if(a.status===204)return;let c=await a.text();if(c)return JSON.parse(c)}}});var jt,h,g,F,P=l(()=>{"use strict";jt=class extends Error{details;constructor(e,t){super(e),this.name=this.constructor.name,this.details=t}},h=class extends jt{httpStatus=404},g=class extends jt{httpStatus=400},F=class extends jt{httpStatus=409}});function _m(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(Cr(n.project)&&e.push(`project = ${Tr(n.project)}`),Cr(n.status)&&e.push(`status = ${Tr(n.status)}`),Cr(n.assignee)&&e.push(`assignee = ${Tr(n.assignee)}`),Cr(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${Tr(t)}`)}if(e.length===0)throw new g("Jira query requires jql or at least one of project, status, assignee, sprintId");return e.join(" AND ")}function Cr(n){return n!=null&&n!==""}function Tr(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function Oc(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=In(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 vm,jm,Im,Ar,Or,$c=l(()=>{"use strict";P();ai();vm="kno.jira.apiToken",jm=50,Im=10,Ar=500,Or=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()||vm}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return Oc(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=_m(e),o=[],i,s=new Set;for(let a=0;a<Im&&o.length<Ar;a++){let c={jql:r,maxResults:Math.min(jm,Ar-o.length),fields:["summary","description","status","assignee"]};i&&(c.nextPageToken=i);let u=await this.request("POST","/rest/api/3/search/jql",{body:c}),d=Array.isArray(u.issues)?u.issues:[];for(let b of d){if(o.length>=Ar)break;o.push(Oc(b,t,this.instanceId))}let m=typeof u.nextPageToken=="string"?u.nextPageToken:void 0;if(u.isLast===!0||!m||d.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=Ar;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 c of a)t.push({id:String(c.id??""),subjectId:e,body:In(c.body),...c.author?.displayName?{author:c.author.displayName}:{},createdAt:c.created??"",raw:c});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:Sr(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(u=>u.to?.name).filter(u=>typeof u=="string"&&u.length>0),c=a.length>0?a.join(", "):"(none)";throw new Error(`No Jira transition to status '${t}' from the current state. Available: ${c}`)}await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`,{body:{transition:{id:s.id}}})}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Jira instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=`${o.replace(/\/$/,"")}${t}`,c={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(c["Content-Type"]="application/json");let u=await this.fetchFn(a,{method:e,headers:c,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let m=await u.text().catch(()=>"");throw new Error(`Jira ${e} ${t} failed (${u.status}): ${m||u.statusText}`)}if(u.status===204)return;let d=await u.text();if(d)return JSON.parse(d)}}});import{randomUUID as Em}from"node:crypto";function Pm(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var $r,qc=l(()=>{"use strict";$r=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=>Pm(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:Em(),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 Le(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function qr(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function km(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var gj,L,Jt=l(()=>{"use strict";T();yc();bc();ci();Ec();mi();Ac();Tc();$c();qc();gj=Symbol("PROVIDER_REGISTRY");L=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(Te(e)){let o=Le(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new gr(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new wr(t,{secretKey:e.secretKey,model:o}));return}if(!vt(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=km(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 Or(t,{instanceId:e.id,baseUrl:Le(e.config,"baseUrl"),email:Le(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new Rr(t,{instanceId:e.id,username:Le(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new _r(t,{instanceId:e.id,email:Le(e.config,"email"),workspace:Le(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new vr(t,{instanceId:e.id,baseUrl:Le(e.config,"baseUrl"),email:Le(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new $r([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new Er([],e.id));return}this.documentation.set(e.id,new jr([],{instanceId:e.id,type:Le(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw qr(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw qr(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw qr(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw qr(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>vt(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function Bc(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{role:"reviewer",state:"OPEN"};case"repo-open-prs":{let t=typeof e.repoSlug=="string"?e.repoSlug.trim():"";if(!t)throw new g("Bitbucket template 'repo-open-prs' requires params.repoSlug");return{repoSlug:t,state:"OPEN"}}default:throw new h(`Unknown Bitbucket query template: ${n}`)}}var Dc,Fc=l(()=>{"use strict";P();Dc=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[{name:"repoSlug",label:"Repository",type:"string",required:!0}]}]});function Jc(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":{let t=typeof e.repo=="string"?e.repo.trim():"";if(!t)throw new g("GitHub template 'repo-open-issues' requires params.repo");return{repo:t,state:"open"}}default:throw new h(`Unknown GitHub query template: ${n}`)}}var Nc,Lc=l(()=>{"use strict";P();Nc=[{id:"my-open-issues",label:"My open issues",params:[]},{id:"created-by-me",label:"Issues I created",params:[]},{id:"repo-open-issues",label:"Open issues in a repository",params:[{name:"repo",label:"Repository (owner/name)",type:"string",required:!0}]}]});function Gc(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 = ${Wc(Mc(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${Wc(Mc(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new h(`Unknown Jira query template: ${n}`)}}function Mc(n,e){let t=typeof e.project=="string"?e.project.trim():"";if(!t)throw new g(`Jira template '${n}' requires params.project`);return t}function Wc(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var Uc,Hc,Kc=l(()=>{"use strict";P();Uc={name:"project",label:"Project key",type:"string",required:!0},Hc=[{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:[Uc]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[Uc]}]});import{Inject as Qc,Injectable as Cm}from"@nestjs/common";var Rm,Am,Vc,zc,at,wi=l(()=>{"use strict";T();P();we();Jt();Fc();Lc();Kc();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},Am=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Vc=function(n,e){return function(t,r){e(t,r,n)}},zc={bitbucket:{list:()=>Dc,resolve:Bc},github:{list:()=>Nc,resolve:Jc},jira:{list:()=>Hc,resolve:Gc}},at=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?zc[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?zc[o]:void 0;if(!i)throw new h(`No query templates for provider instance '${e}'`);let s=i.list().find(a=>a.id===t);if(!s)throw new h(`Unknown query template '${t}' for provider instance '${e}'`);for(let a of s.params){if(!a.required)continue;let c=r[a.name];if(c==null||typeof c=="string"&&c.trim()==="")throw new g(`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||!vt(r)))return r.type}};at=Rm([Cm(),Vc(0,Qc(_)),Vc(1,Qc(L)),Am("design:paramtypes",[_,L])],at)});import{Inject as Yc,Injectable as $m}from"@nestjs/common";var Tm,Om,Xc,qm,ct,yi=l(()=>{"use strict";T();we();ci();mi();Jt();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},Om=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Xc=function(n,e){return function(t,r){e(t,r,n)}},qm={bitbucket:()=>fi,confluence:()=>xr},ct=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||!vt(r)?[]:qm[r.type]?.()??[]}};ct=Tm([$m(),Xc(0,Yc(_)),Xc(1,Yc(L)),Om("design:paramtypes",[_,L])],ct)});async function Zc(n){let e=n.fetchFn??fetch;return n.type==="claude"?Nm(n.apiKey,e):Jm(n.apiKey,e)}async function Nm(n,e){let t=await e(Dm,{method:"GET",headers:{"x-api-key":n,"anthropic-version":Fm}});if(!t.ok)throw eu("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 c=typeof s.display_name=="string"&&s.display_name.trim()?s.display_name:a;return[{id:a,displayName:c}]})}async function Jm(n,e){let t=await e(Bm,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw eu("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 c=typeof s.displayName=="string"&&s.displayName.trim()?s.displayName:a;return[{id:a,displayName:c}]})}function eu(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 Dm,Bm,Fm,tu=l(()=>{"use strict";Dm="https://api.anthropic.com/v1/models",Bm="https://api.cursor.com/v1/models",Fm="2023-06-01"});import{Inject as Si,Injectable as Mm}from"@nestjs/common";var Lm,Um,bi,Dr,ut,xi=l(()=>{"use strict";T();we();Be();P();tu();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},Um=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},bi=function(n,e){return function(t,r){e(t,r,n)}},Dr="PREVIEW_MODELS_FETCH",ut=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 g("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new h(`Provider instance not found: ${r}`);if(!Te(o)||o.type!==e.type)throw new g(`Provider instance '${r}' is not a ${e.type} agent`);let i=await this.secrets.get(o.secretKey);if(!i)throw new g(`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 Zc({type:e,apiKey:t,fetchFn:this.fetchFn})}catch(r){throw r instanceof Error&&r.name==="PreviewModelsAuthError"?new g(r.message):new g(r instanceof Error?r.message:"Failed to fetch available models")}}};ut=Lm([Mm(),bi(0,Si(_)),bi(1,Si(me)),bi(2,Si(Dr)),Um("design:paramtypes",[_,Function,Function])],ut)});import{Module as Hm}from"@nestjs/common";var Wm,lt,Br=l(()=>{"use strict";Ro();Os();$o();Be();xn();we();si();Jt();wi();yi();xi();Wm=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=class{};lt=Wm([Hm({imports:[qt,Oe],providers:[{provide:L,useFactory:async(n,e)=>{let t=await n.get();return L.fromSettings(t.providerInstances??[],e)},inject:[_,me]},{provide:rn,useClass:$n},st,at,ct,{provide:Dr,useValue:(n,e)=>fetch(n,e)},ut],exports:[L,rn,st,at,ct,ut,Dr]})],lt)});import{Injectable as Km}from"@nestjs/common";var Gm,ye,Fr=l(()=>{"use strict";Gm=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},ye=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)}};ye=Gm([Km()],ye)});import{Global as Qm,Module as zm}from"@nestjs/common";var Vm,pt,Nr=l(()=>{"use strict";Fr();Vm=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},pt=class{};pt=Vm([Qm(),zm({providers:[ye],exports:[ye]})],pt)});import{Injectable as Ym}from"@nestjs/common";import{resolve as Zm}from"node:path";var Xm,dt,vi=l(()=>{"use strict";Xm=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},dt=class{tails=new Map;lockKey(e){let t=Zm(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}};dt=Xm([Ym()],dt)});import{Injectable as nh}from"@nestjs/common";import{execFile as rh}from"node:child_process";import{mkdirSync as ji,rmSync as oh}from"node:fs";import{dirname as ih,join as Lr,resolve as Jr}from"node:path";import{promisify as sh}from"node:util";function nu(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function ru(n){return Lr(n,"worktrees")}function ch(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 eh,th,ah,Ue,Ii=l(()=>{"use strict";vi();eh=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},th=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ah=sh(rh),Ue=class{worktreesRoot;fetchLocks;constructor(e,t=new dt){this.worktreesRoot=e,this.fetchLocks=t,ji(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??Lr(this.worktreesRoot,e);return ji(Lr(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){ji(Lr(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 ch(t)}async resetWorktreeToRemote(e,t){let r=Jr(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=Jr(e);try{let r=await this.mainRepoPath(t);await this.git(r,["worktree","remove","--force",t])}catch{oh(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=Jr(e),{stdout:r}=await this.git(t,["rev-parse","--git-common-dir"]),o=Jr(t,r.trim());return o.endsWith(".git")?ih(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 ah("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=nu(o.stderr),s=nu(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Ue=eh([nh(),th("design:paramtypes",[String,dt])],Ue)});import{Module as lh}from"@nestjs/common";import{mkdirSync as ph}from"node:fs";var uh,ou,Ur,iu=l(()=>{"use strict";qn();Ii();vi();uh=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},ou=sn();ph(ou,{recursive:!0});Ur=class{};Ur=uh([lh({providers:[dt,{provide:Ue,useFactory:n=>new Ue(ru(ou),n),inject:[dt]}],exports:[Ue]})],Ur)});function Ut(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=_i(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function _i(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 Lt(n,e){return typeof n=="string"?Ut(n,e):Array.isArray(n)?n.map(t=>Lt(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,Lt(r,e)])):n}var Ei=l(()=>{"use strict"});function au(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 c=a instanceof Error?a.message:String(a);throw new Error(`Extract source is not valid JSON (required when path is set): ${c}`)}let s=dh(i,e);if(r=s??i,s==null)return{kind:"no_match",sourceValue:r};o=s}if(t){let i=su(o),s;try{s=new RegExp(t)}catch(u){let d=u instanceof Error?u.message:String(u);throw new Error(`Invalid extract pattern: ${d}`)}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:su(o),sourceValue:r}}function dh(n,e){if(!(n==null||typeof n!="object"))return _i(n,e)}function su(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):n==null?"":JSON.stringify(n)}var cu=l(()=>{"use strict";Ei()});function uu(n,e){switch(n){case"questionnaire":return Pi(e);case"confirmation":return fh(e);case"conversation":return mh(e);default:return n}}function Pi(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 fh(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)?[]:Pi(n)}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","text"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"suggestions"in e?[]:"questions"in e?Pi(n):[]}var lu=l(()=>{"use strict"});function ft(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=ft(r.stepExecutions,e);if(o)return o}}}function It(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=It(s.stepExecutions,e,i.id,s.index);if(a)return a}}}function M(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:M(o.stepExecutions,e,t)}))}:r)}function ki(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]},c=i.findIndex(u=>u.index===r);i[c]=a}else{let a={index:r,stepExecutions:[e],startedAt:e.startedAt??new Date().toISOString()};i.push(a),i.sort((c,u)=>c.index-u.index)}return{...o,iterations:i}}return o.iterations?{...o,iterations:o.iterations.map(i=>({...i,stepExecutions:ki(i.stepExecutions,e,t,r)}))}:o})}function Mt(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Mt(t.steps,e);if(r)return r}}}function pu(n,e,t){return M(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,c)=>a>c?a:c):void 0;return{...i,...s?{completedAt:s}:{}}});return{...r,iterations:o}})}function Ri(n){let e=[];for(let t of n){t.childJobIds&&e.push(...t.childJobIds);for(let r of t.iterations??[])e.push(...Ri(r.stepExecutions))}return e}var du=l(()=>{"use strict"});import{z as de}from"zod";function fu(n,e){let t=bh[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 hh,gh,wh,yh,bh,mu=l(()=>{"use strict";hh=de.object({questions:de.array(de.object({id:de.string(),prompt:de.string()}))}),gh=de.object({approved:de.boolean()}),wh=de.object({suggestions:de.array(de.object({body:de.string()}))}),yh=de.string(),bh={questionnaire:hh,confirmation:gh,comment_suggestions:wh,free_text:yh}});function be(n){return n==="completed"||n==="failed"||n==="cancelled"}function Ai(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=>be(o.status)),groupCount:t.size}}function hu(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 Ci=l(()=>{"use strict"});async function Mr(n,e,t){let r=await e.get(n);if(!r)throw new h(`SubjectView not found: ${n}`);if(!r.providerInstanceId)throw new g(`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 g(`Unsupported subjectType on view: ${r.subjectType}`)}var Ti=l(()=>{"use strict";P()});import{Injectable as xh}from"@nestjs/common";var Sh,_t,Oi=l(()=>{"use strict";Sh=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=class{requested=new Set;requestCancellation(e){this.requested.add(e)}isCancellationRequested(e){return this.requested.has(e)}clear(e){this.requested.delete(e)}};_t=Sh([xh()],_t)});import{Inject as _h,Injectable as Eh}from"@nestjs/common";var vh,jh,Ih,Se,Wr=l(()=>{"use strict";T();we();vh=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=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ih=function(n,e){return function(t,r){e(t,r,n)}},Se=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 c=this.queues.get(e)??[];c.push({entry:o,resolve:s,reject:a}),this.queues.set(e,c)}))}),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||!Te(r)?Sn:ac(r)}};Se=vh([Eh(),Ih(0,_h(_)),jh("design:paramtypes",[Object])],Se)});import{Logger as Ph}from"@nestjs/common";import{readFile as kh}from"node:fs/promises";async function gu(n,e,t=new Ph("resolveContextFiles"),r=o=>kh(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 c=a instanceof Error?a.message:String(a);throw new Error(`Cannot read context file '${s.name}' at ${s.path}: ${c}`)}}return o}var wu=l(()=>{"use strict"});import{basename as Rh,dirname as Ah,join as Ch,resolve as En,sep as yu}from"node:path";function Th(n){return n.replace(/-/g,"").slice(0,4)}function bu(n,e){return`${n}-${Th(e)}`}function $i(n){return n.replace(/[\\/:*?"<>|]/g,"-")}function Hr(n){let e=En(n);return Ch(Ah(e),`${Rh(e)}-worktrees`)}function Gr(n,e){let t=En(n),r=En(e);if(mt(t,r))return!0;let o=t.endsWith(yu)?t:t+yu,i=process.platform==="win32"?r.toLowerCase():r,s=process.platform==="win32"?o.toLowerCase():o;return i.startsWith(s)}function mt(n,e){let t=En(n),r=En(e);return process.platform==="win32"?t.toLowerCase()===r.toLowerCase():t===r}var qi=l(()=>{"use strict"});import{join as Su}from"node:path";async function xu(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),c=o.find(m=>m.id===a),u=o.find(m=>mt(m.localPath,a)),d=c??u;if(!d)throw new g(`Unknown local repository: ${a}`);r[i.name]=d.localPath}return r}async function vu(n){let{job:e,params:t,git:r,jobs:o,localRepositories:i}=n,s=Kr(t,"repoPath"),a=t.mode==="existing-branch"?"existing-branch":"new-branch",c=(await i.list()).find(S=>mt(S.localPath,s)),u=c?.worktreeBasePath?.trim()?c.worktreeBasePath.trim():Hr(s);if(Gr(s,u)&&!mt(s,u))throw new Error(`Worktree base '${u}' must not be inside the repository at '${s}'`);if(a==="existing-branch")return Oh({job:e,repoPath:s,branch:Kr(t,"branch"),worktreeBase:u,explicitPath:typeof t.worktreePath=="string"?t.worktreePath:void 0,git:r,jobs:o});let d=Kr(t,"branchName"),m=bu(d,e.id),b=typeof t.worktreePath=="string"&&t.worktreePath.trim()!==""?t.worktreePath:Su(u,$i(m));return r.createWorktree(e.id,{repoPath:s,baseBranch:Kr(t,"baseBranch"),branchName:m,worktreePath:b})}async function Oh(n){let{job:e,repoPath:t,branch:r,worktreeBase:o,git:i,jobs:s}=n,a=await i.listWorktrees(t),c=a.filter(b=>b.branch===r&&!mt(b.path,t)),u=a.find(b=>b.branch===r&&mt(b.path,t));if(c.length===0){if(u)throw new Error(`branch ${r} is checked out in the repository working copy; refusing to reuse the main clone`);let b=n.explicitPath&&n.explicitPath.trim()!==""?n.explicitPath:Su(o,$i(r));return i.addWorktreeForExistingBranch({repoPath:t,branch:r,worktreePath:b})}let d=c[0].path,m=await $h(s,d);if(m&&!be(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(d,r),{worktreePath:d,branch:r}}async function $h(n,e){let r=(await n.list({liveWorktree:!0})).filter(o=>o.worktreePath!=null&&mt(o.worktreePath,e));return r.find(o=>!be(o.status))??r.sort((o,i)=>i.updatedAt.localeCompare(o.updatedAt))[0]}function Kr(n,e){let t=n[e];if(typeof t!="string"||t.trim()==="")throw new Error(`git step missing required param '${e}'`);return t}var ju=l(()=>{"use strict";P();qi();Ci()});import{Inject as ie,Injectable as Bh,Logger as Fh}from"@nestjs/common";import{randomUUID as Di}from"node:crypto";import{exec as Nh}from"node:child_process";import{promisify as Jh}from"node:util";async function Bi(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 Iu(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 Mh(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(c=>c.id===e))return a}};return r(n.steps)}function Et(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 Wh(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 Vr(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function Pt(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Hh(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 _u(n,e){for(let t of n)if(t.required&&(e[t.name]===void 0||e[t.name]===null))throw new g(`Missing required input: ${t.name}`)}var qh,Dh,oe,Fi,Lh,Uh,xe,Qr=l(()=>{"use strict";St();gn();Un();Ln();Fr();Ii();we();Mn();Wn();Jt();Ro();br();P();Ei();cu();lu();du();mu();Ci();Ti();Oi();Wr();wu();ju();qh=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},Dh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},oe=function(n,e){return function(t,r){e(t,r,n)}},Lh=Jh(Nh),Uh=new Set(["agent","shell","git","provider_action"]),xe=Fi=class{workflows;jobs;batches;views;events;providers;notifications;contextFiles;localRepositories;git;settings;cancellation;agentGate;logger=new Fh(Fi.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,c,u,d,m,b,S){this.workflows=e,this.jobs=t,this.batches=r,this.views=o,this.events=i,this.providers=s,this.notifications=a,this.contextFiles=c,this.localRepositories=u,this.git=d,this.settings=m,this.cancellation=b,this.agentGate=S,this.events.subscribe(k=>{let O=k;(O.type==="job_completed"||O.type==="job_failed"||O.type==="job_cancelled")&&this.onChildTerminal(O.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 g(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);_u(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:Di(),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 c=r[a],u=await this.createJob({workflowId:t.id,subjectContext:{mode:"single",subject:c},selection:e.selection,batchId:i.id,fanOutIndex:a,inputValues:e.inputValues});s.push(u)}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 h(`Workflow not found: ${e.workflowId}`);if(!e.subjectContext&&t.subjectHandling!=="per-subject")throw new g(`Workflow Runner only supports subjectHandling 'per-subject' at start() without an explicit subjectContext (got '${t.subjectHandling}')`);let r=await xu(t.inputSchema,e.inputValues,this.localRepositories);_u(t.inputSchema,r);let o=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),i=new Date().toISOString();return this.jobs.create({id:Di(),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 g("jobIds is required");let t=[];for(let s of e){let a=await this.jobs.get(s);if(!a)throw new h(`Job not found: ${s}`);t.push(a)}let r=t.find(s=>!be(s.status));if(r)throw new F(`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 h(`Job not found: ${e}`);if(be(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 h(`Job not found: ${e}`);if(r.status!=="waiting_for_human")throw new F(`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=ft(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=new Date().toISOString(),c=M(r.stepHistory,i,k=>({...k,status:"completed",completedAt:a,output:t})),u=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{response:t};r=await this.persistJob({...r,status:"planning",context:{...r.context,[s.stepDefinitionId]:t},stepHistory:c,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a}),this.emit({type:"human_answered",jobId:r.id,answers:u,timestamp:a});let d=It(r.stepHistory,i);if(!d)throw new Error(`Could not locate frame for execution ${i}`);let m=this.sequenceForFrameOnJob(r,o,d),b=d.index+1,S=await this.executeStepSequence(r,o,m,d.parentLoopExecutionId,d.iterationIndex,b);return S.outcome!=="completed"?S.job:d.parentLoopExecutionId!=null&&d.iterationIndex!=null?this.continueLoopAfterBody(S.job,o,d.parentLoopExecutionId,d.iterationIndex):this.completeJob(S.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new h(`Job not found: ${e}`);if(t.status!=="failed")throw new F(`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 h(`Parent job not found: ${t.parentJobId}`);let c=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,inputValues:{},parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId,fanOutIndex:t.fanOutIndex,retryOf:t.id,workflowSnapshot:t.workflowSnapshot}),u=M(a.stepHistory,t.parentStepExecutionId,d=>({...d,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...d.childJobIds??[],c.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:u,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emitRetryLaunch(c.id,t.id),this.runJob(c.id),c}if(o){let a=await this.batches.get(t.batchId);if(!a)throw new h(`JobBatch not found: ${t.batchId}`);a.status!=="running"&&await this.batches.update(a.id,{status:"running",completedAt:null,notificationSent:!1});let c=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(c.id,t.id),this.runJob(c.id),c}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){let t=await this.jobs.get(e);if(!t)throw new h(`Job not found: ${e}`);if(t.status!=="failed")throw new F(`Job ${e} is not failed (status: ${t.status})`);let r=t.currentStepExecutionId;if(!r)throw new F(`Job ${e} has no currentStepExecutionId; cannot retry the failed step`);let o=ft(t.stepHistory,r);if(!o)throw new F(`Job ${e} currentStepExecutionId ${r} was not found in stepHistory`);if(o.type==="sub_workflow")throw new F("Step-level retry is not available for sub_workflow steps. Retry the specific failed child job instead.");if(!Uh.has(o.type))throw new F(`Step-level retry is not available for '${o.type}' steps`);let i=await this.workflowForJob(t),s=It(t.stepHistory,r);if(!s)throw new F(`Could not locate execution frame for ${r} on job ${e}`);let a=this.sequenceForFrameOnJob(t,i,s),c=a[s.index];if(!c||c.id!==o.stepDefinitionId)throw new F(`Failed step '${o.stepDefinitionId}' does not match sequence position ${s.index}`);let u=new Date().toISOString(),d={...t.context};delete d[o.stepDefinitionId];let m=await this.persistJob({...t,status:"planning",context:d,completedAt:void 0,currentStepId:o.stepDefinitionId,currentStepExecutionId:o.id,stepHistory:M(t.stepHistory,o.id,S=>({...S,status:"running",error:void 0,completedAt:void 0,output:void 0,startedAt:u})),updatedAt:u}),b=await this.executeStepSequence(m,i,a,s.parentLoopExecutionId,s.iterationIndex,s.index,o.id);return b.outcome!=="completed"?b.job:s.parentLoopExecutionId!=null&&s.iterationIndex!=null?this.continueLoopAfterBody(b.job,i,s.parentLoopExecutionId,s.iterationIndex):this.completeJob(b.job,i)}async cancelJob(e){let t=await this.jobs.get(e);if(!t)throw new h(`Job not found: ${e}`);if(be(t.status))throw new F(`Job ${e} is already terminal (status: ${t.status})`);for(let i of Ri(t.stepHistory)){let s=await this.jobs.get(i);s&&!be(s.status)&&await this.cancelJob(i)}let r=await this.jobs.get(e);if(be(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 h(`JobBatch not found: ${e}`);if(t.status!=="running")throw new F(`JobBatch ${e} is already terminal (status: ${t.status})`);let r=await this.jobs.list({batchId:e});for(let s of r)be(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){let c=e;for(let u=s;u<r.length;u++){let d=await this.stopIfCancelled(c);if(d)return{outcome:"cancelled",job:d};let m=r[u],b=new Date().toISOString(),S=u===s?a:void 0,k,O=c.stepHistory;if(S){let C=ft(c.stepHistory,S);if(!C)throw new Error(`Reuse execution ${S} not found on job ${c.id}`);k=C}else k={id:Di(),stepDefinitionId:m.id,type:m.type,status:"running",startedAt:b},O=ki(c.stepHistory,k,o,i);if(c=await this.persistJob({...c,status:c.status==="pending"?"planning":c.status,currentStepId:m.id,currentStepExecutionId:k.id,stepHistory:O,updatedAt:b}),c.status==="cancelled")return{outcome:"cancelled",job:c};this.emit({type:"step_started",jobId:c.id,stepDefinitionId:m.id,timestamp:b});try{let C=await this.dispatchStep(c,t,m,k.id,o,i);c=C.job;let Xe=await this.stopIfCancelled(c);if(Xe)return{outcome:"cancelled",job:Xe};if(C.outcome!=="completed")return C}catch(C){let Xe=await this.failJob(c,t,k.id,m.id,C);return Xe.status==="cancelled"?{outcome:"cancelled",job:Xe}:{outcome:"failed",job:Xe}}}return o!=null&&i!=null&&(c=await this.persistJob({...c,stepHistory:pu(c.stepHistory,o,i),updatedAt:new Date().toISOString()})),{outcome:"completed",job:c}}async dispatchStep(e,t,r,o,i,s){switch(r.type){case"agent":return{outcome:"completed",job:await this.executeAgentStep(e,r,o)};case"interaction":return{outcome:"paused",job:await this.pauseForInteraction(e,t,r,o)};case"git":return{outcome:"completed",job:await this.executeGitStep(e,r,o)};case"provider_action":return{outcome:"completed",job:await this.executeProviderActionStep(e,r,o)};case"shell":return{outcome:"completed",job:await this.executeShellStep(e,r,o)};case"loop":return this.runLoopStep(e,t,r,o,i,s);case"sub_workflow":return this.runSubWorkflowStep(e,r,o);case"extract":return this.executeExtractStep(e,t,r,o);default:{let a=r;throw new g(`Step type '${a.type}' not yet supported by the Workflow Runner`)}}}async runLoopStep(e,t,r,o,i,s,a=0,c=r.maxIterations){let u=e,d=a;for(;;){if(d>=c)switch(r.onMaxIterations.action){case"fail":return u=await this.failExecution(u,t,o,r.id,`Loop '${r.id}' exceeded maxIterations (${c})`),{outcome:"failed",job:u};case"continue":return u=await this.finishExecution(u,o,r.id,{iterations:d,exitedOnMaxIterations:!0}),{outcome:"completed",job:u};case"ask_human":{let b={maxIterationsCheckpoint:!0,nextIteration:d,effectiveMaxIterations:c},S=new Date().toISOString(),k=M(u.stepHistory,o,O=>({...O,status:"pending",output:b}));return u=await this.persistJob({...u,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:k,updatedAt:S}),this.emit({type:"waiting_for_human",jobId:u.id,stepDefinitionId:r.id,interaction:"confirmation",data:b,questions:[`Loop '${r.id}' reached maxIterations (${c}). Extend, continue, or cancel?`],timestamp:S}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${u.id} hit max iterations on loop '${r.id}'`,jobId:u.id}),{outcome:"paused",job:u}}default:{let b=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(b)}`)}}let m=await this.executeStepSequence(u,t,r.steps,o,d,0);if(u=m.job,m.outcome!=="completed")return m;if(Iu(r.until,u.context))return u=await this.finishExecution(u,o,r.id,{iterations:d+1}),{outcome:"completed",job:u};d+=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=Mt(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let c=It(e.stepHistory,r.id),u=new Date().toISOString();if(i.action==="cancel")return await this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:u},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:M(e.stepHistory,r.id,O=>({...O,status:"completed",completedAt:u,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:u});return this.emit({type:"human_answered",jobId:k.id,answers:i,timestamp:u}),this.emit({type:"step_completed",jobId:k.id,stepDefinitionId:a.id,timestamp:u}),c?.parentLoopExecutionId!=null&&c.iterationIndex!=null?this.continueLoopAfterBody(k,t,c.parentLoopExecutionId,c.iterationIndex):this.continueTopLevelAfter(k,t,a.id)}let d=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+d,b=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:M(e.stepHistory,r.id,k=>({...k,status:"running",output:void 0})),updatedAt:u});this.emit({type:"human_answered",jobId:b.id,answers:i,timestamp:u});let S=await this.runLoopStep(b,t,a,r.id,c?.parentLoopExecutionId,c?.iterationIndex,s.nextIteration,m);return S.outcome!=="completed"?S.job:c?.parentLoopExecutionId!=null&&c.iterationIndex!=null?this.continueLoopAfterBody(S.job,t,c.parentLoopExecutionId,c.iterationIndex):this.continueTopLevelAfter(S.job,t,a.id)}async resumeExtract(e,t,r,o){let i=Wh(o),s=Mt(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 c=i.action==="continue"?"":i.value,u=await this.finishExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a},r.id,s.id,c);this.emit({type:"human_answered",jobId:u.id,answers:i,timestamp:a});let d=It(e.stepHistory,r.id);if(!d)throw new Error(`Could not locate frame for execution ${r.id}`);let m=this.sequenceForFrameOnJob(u,t,d),b=d.index+1,S=await this.executeStepSequence(u,t,m,d.parentLoopExecutionId,d.iterationIndex,b);return S.outcome!=="completed"?S.job:d.parentLoopExecutionId!=null&&d.iterationIndex!=null?this.continueLoopAfterBody(S.job,t,d.parentLoopExecutionId,d.iterationIndex):this.completeJob(S.job,t)}async continueLoopAfterBody(e,t,r,o){let i=ft(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Mt(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=It(e.stepHistory,r),c=i.output?.effectiveMaxIterations??s.maxIterations,u=e;if(Iu(s.until,u.context))u=await this.finishExecution(u,r,s.id,{iterations:o+1});else{let d=o+1,m=await this.runLoopStep(u,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,d,c);if(m.outcome!=="completed")return m.job;u=m.job}return a?.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(u,t,a.parentLoopExecutionId,a.iterationIndex):this.continueTopLevelAfter(u,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=ft(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Mt(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="collection")throw new g(`sub_workflow steps require subjectContext.mode === 'collection' (job ${e.id})`);let o=e.subjectContext.subjects,i=[];for(let d=0;d<o.length;d++){let m=o[d],b=await this.createJob({workflowId:t.workflowId,subjectContext:{mode:"single",subject:m},inputValues:{},parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:d});i.push(b)}let s=i.map(d=>d.id),a=new Date().toISOString(),c=M(e.stepHistory,r,d=>({...d,status:"waiting_for_children",childJobIds:s})),u=await this.persistJob({...e,status:"waiting_for_children",currentStepId:t.id,currentStepExecutionId:r,stepHistory:c,updatedAt:a});for(let d of i)this.emit({type:"job_started",jobId:d.id,timestamp:a}),this.runJob(d.id);return{outcome:"paused",job:u}}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(C=>C.parentStepExecutionId===t.parentStepExecutionId),i=Ai(o,C=>C.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 c=await this.workflowForJob(a),u=t.parentStepExecutionId,d=ft(a.stepHistory,u);if(!d||d.type!=="sub_workflow")return;let m=s.some(C=>C.status==="failed");if(s.some(C=>C.status==="cancelled"))return;if(m){await this.failExecution(a,c,u,d.stepDefinitionId,"One or more child jobs failed");return}let S=s.slice().sort((C,Xe)=>(C.fanOutIndex??0)-(Xe.fanOutIndex??0)).map(C=>({fanOutIndex:C.fanOutIndex,jobId:C.id,output:C.context})),k=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[d.stepDefinitionId]:S},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:M(a.stepHistory,u,C=>({...C,status:"completed",completedAt:k,output:S})),completedAt:void 0,updatedAt:k}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:d.stepDefinitionId,timestamp:k});let O=await this.continueTopLevelAfter(a,c,d.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=Ai(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,c=hu(a),u=new Date().toISOString(),d=await this.batches.update(o.id,{status:c,completedAt:u});if(!d)return;if(this.emit({type:"batch_completed",batchId:d.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:u}),!d.notificationSent){let m=await this.workflowForJob(t),b=d.notificationOverride??m.notificationPolicy,S=c==="completed"?"on_complete":"on_fail";b.triggers.includes(S)&&await this.notifications.send({title:`Batch ${c}: ${m.name}`,body:`JobBatch ${d.id} finished with status '${c}' (${a.length} members)`,batchId:d.id}),await this.batches.update(d.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return Mr(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 g(`Unsupported subjectType: ${e.subjectType}`);return t}async executeAgentStep(e,t,r){let o=await gu(t.contextFileIds??[],this.contextFiles,this.logger),i=Et(e),s=Ut(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 c=await this.setExecutionStatus(e,r,"queued"),u=!1;try{await this.agentGate.acquire(a,c.id,r),u=!0;let d=await this.stopIfCancelled(c);if(d)return d;if(c=await this.jobs.get(c.id)??c,c=await this.setExecutionStatus(c,r,"running"),c.status==="cancelled")return c;let m=await this.providers.getAgentProvider(a).run({objective:s,outputFormat:t.outputFormat,knowledge:o,context:{...i,stepId:t.id},...c.worktreePath?{cwd:c.worktreePath}:{}}),b=fu(t.outputFormat,m.parsed);return this.finishExecution(c,r,t.id,b)}finally{u&&this.agentGate.release(a)}}async setExecutionStatus(e,t,r){let o=new Date().toISOString(),i=M(e.stepHistory,t,s=>({...s,status:r}));return this.persistJob({...e,stepHistory:i,updatedAt:o})}async executeGitStep(e,t,r){let o=Lt(t.params,Et(e));switch(t.operation){case"create_worktree":{let i=await vu({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=Vr(e),s=Pt(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=Vr(e),s=Pt(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Vr(e),s=await this.git.commit(i,{message:Pt(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Vr(e);return await this.git.push(i,{...typeof o.remote=="string"?{remote:o.remote}:{},...typeof o.branch=="string"?{branch:o.branch}:{}}),this.finishExecution(e,r,t.id,{remote:typeof o.remote=="string"?o.remote:"origin",branch:typeof o.branch=="string"?o.branch:e.branch})}default:{let i=t.operation;throw new Error(`Unknown git operation: ${i}`)}}}async executeProviderActionStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="single")throw new g(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let o=this.resolveProviderActionSubject(e,t);if(t.extendedAction)return this.executeExtendedProviderAction(e,t,r,o);let i=Lt(t.params??{},Et(e))??{},s=await this.dispatchPortableProviderAction(o,t.action,i);return this.finishExecution(e,r,t.id,s)}resolveProviderActionSubject(e,t){if(!t.target){let o=e.subjectContext;if(!o||o.mode!=="single")throw new g(`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=Ut(t.target.subjectId,Et(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 c=this.providers.getDocumentationProvider(i);switch(t){case"get_subject":return c.get(s);case"get_content":return c.getContent(s);case"get_comments":return c.getComments(s);case"post_comment":return await c.postComment(s,Pt(r,"body")),{posted:!0};case"update_status":throw new Error(`Provider action '${t}' is not valid for subject type 'documentation'`);default:{let u=t;throw new Error(`Unknown provider action: ${u}`)}}}let a=o==="ticket"?this.providers.getTicketProvider(i):o==="pull_request"?this.providers.getRepoProvider(i):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${o}`);switch(t){case"get_subject":return a.get(s);case"get_comments":return a.getComments(s);case"post_comment":return await a.postComment(s,Pt(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Pt(r,"status")),{status:Pt(r,"status")};case"get_content":throw new Error(`Provider action 'get_content' is not valid for subject type '${o}'`);default:{let c=t;throw new Error(`Unknown provider action: ${c}`)}}}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(!Sc(s))throw new Error(`Provider instance '${i.providerId}' does not support extended actions. Available: none`);let a=await s.listExtendedActions(),c=a.find(m=>m.actionId===i.actionId);if(!c)throw new Error(`Provider '${i.providerId}' has no extended action '${i.actionId}'. Available: ${Nt(a)}`);let u=Lt(i.params??{},Et(e))??{};yr(c,u);let d=await s.executeExtendedAction(i.actionId,{...u,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,d)}async executeShellStep(e,t,r){let o=Ut(t.command,Et(e)),i=e.worktreePath??process.cwd();try{let s=await Lh(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,c=a.stderr??"",u=a.stdout??"",d=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${d}, cwd=${i}): ${c||u||a.message||o}`)}}async executeExtractStep(e,t,r,o){let i=Ut(r.source,Et(e)),s=au({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,c={extractNoMatch:!0,sourceValue:i,...a?{pattern:a}:{}},u={sourceValue:i,...a?{pattern:a}:{}},d=M(e.stepHistory,o,b=>({...b,status:"pending",output:c})),m=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:d,updatedAt:s});return this.emit({type:"waiting_for_human",jobId:m.id,stepDefinitionId:r.id,interaction:"confirmation",data:u,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=Mh(t,r.id),a=s!=null?e.context[s]:void 0,c=M(e.stepHistory,o,b=>({...b,status:"pending"})),u=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:c,updatedAt:i}),d=uu(r.interaction,a);return this.emit({type:"waiting_for_human",jobId:u.id,stepDefinitionId:r.id,interaction:r.interaction,data:a,questions:d,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}async finishExecution(e,t,r,o,i={}){let s=new Date().toISOString(),a=M(e.stepHistory,t,u=>({...u,status:"completed",completedAt:s,output:o})),c=await this.persistJob({...e,...i,context:{...e.context,[r]:o},stepHistory:a,updatedAt:s});return this.emit({type:"step_completed",jobId:c.id,stepDefinitionId:r,timestamp:s}),c}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=new Date().toISOString(),c=M(e.stepHistory,r,d=>({...d,status:"failed",completedAt:a,error:s})),u=await this.persistJob({...e,status:"failed",currentStepId:o,currentStepExecutionId:r,stepHistory:c,completedAt:a,updatedAt:a});return this.emit({type:"step_failed",jobId:u.id,stepDefinitionId:o,error:s,timestamp:a}),u.status==="cancelled"?(await this.onBatchMemberTerminal(u.id),u):(this.emit({type:"job_failed",jobId:u.id,error:s,timestamp:a}),await this.onBatchMemberTerminal(u.id),!u.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${u.id} failed on step '${o}': ${s}`,jobId:u.id}),u)}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=Hh(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 h(`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 Bi(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return Bi(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return Bi(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};xe=Fi=qh([Bh(),oe(0,ie(q)),oe(1,ie(z)),oe(2,ie(ce)),oe(3,ie(ae)),oe(4,ie(ye)),oe(5,ie(L)),oe(6,ie(rn)),oe(7,ie(ue)),oe(8,ie(le)),oe(9,ie(Ue)),oe(10,ie(_)),oe(11,ie(_t)),oe(12,ie(Se)),Dh("design:paramtypes",[q,z,ce,ae,ye,L,Object,ue,le,Ue,Object,_t,Se])],xe)});import{Module as Kh}from"@nestjs/common";var Gh,Wt,Ni=l(()=>{"use strict";xn();Br();Nr();iu();Qr();Oi();Wr();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},Wt=class{};Wt=Gh([Kh({imports:[Oe,lt,pt,Ur],providers:[_t,Se,xe],exports:[xe,Se]})],Wt)});import{Catch as Qh}from"@nestjs/common";var Vh,zr,Eu=l(()=>{"use strict";P();Vh=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},zr=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message,...e.details??{}})}};zr=Vh([Qh(jt)],zr)});var v,se=l(()=>{"use strict";P();v=class{schema;constructor(e){this.schema=e}transform(e){let t=this.schema.safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.join(".")||"(root)"}: ${o.message}`).join("; ");throw new g(`Validation failed: ${r}`)}return t.data}}});function Pu(n,e,t){if(!n)throw new h(`Workflow not found: ${e}`);if(n.appliesTo==="none")throw new g(`Cannot bind a View to workflow '${e}' because appliesTo is 'none'`);if(!Fa(n.appliesTo,t))throw new g(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function ku(n,e){if(!n)throw new h(`Workflow not found: ${e}`);if(n.appliesTo!=="none")throw new g(`WorkflowShortcut requires appliesTo 'none', got '${String(n.appliesTo)}'`);if(n.subjectHandling!=="per-subject")throw new g(`WorkflowShortcut requires subjectHandling 'per-subject', got '${n.subjectHandling}'`);return n}function Ru(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new g("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var Xr=l(()=>{"use strict";T();P()});import{randomUUID as zh}from"node:crypto";function Xh(){return zh()}function Au(n){let e=n.id??Xh(),t=Ia(n.steps),r=Cu(n.steps,t);return{...n,id:e,steps:r}}function Cu(n,e){return n.map(t=>{let r=t.id;return r||(r=xa(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:Cu(t.steps,e)}:{...t,id:r}})}var Tu=l(()=>{"use strict";T()});function Ou(n){return n.issues.map(e=>`${e.path.join(".")||"(root)"}: ${e.message}`).join("; ")}function Ji(n){let e=it.safeParse(n);if(!e.success)throw new g(`Validation failed: ${Ou(e.error)}`);return e.data}function $u(n){let e=Au(n),t=yn.safeParse(e);if(!t.success)throw new g(`Validation failed: ${Ou(t.error)}`);return Ru(t.data),t.data}async function ht(n,e){return n.create($u(Ji(e)))}async function Yr(n,e,t){let r=$u({...t,id:e}),{id:o,...i}=r,s=await n.update(e,i);if(!s)throw new h(`Workflow not found: ${e}`);return s}var Zr=l(()=>{"use strict";T();P();Xr();Tu()});import{z as kt}from"zod";async function Du(n,e){let t=Ji(e.workflowDefinition),r=t.id;if(!r)return{workflow:await ht(n,t),created:!0};let o=await n.get(r);if(!o)return{workflow:await ht(n,t),created:!0};if(e.resolution==="update")return{workflow:await Yr(n,r,t),created:!1};if(e.resolution==="create_new"){let{id:i,...s}=t;return{workflow:await ht(n,s),created:!0}}throw new F(`A workflow named '${o.name}' already exists`,{conflictingWorkflowId:o.id,conflictingWorkflowName:o.name})}var eo,qu,Li=l(()=>{"use strict";P();Zr();eo=kt.object({workflowDefinition:kt.unknown(),resolution:kt.enum(["update","create_new"]).optional()}),qu=kt.object({error:kt.string(),conflictingWorkflowId:kt.string(),conflictingWorkflowName:kt.string()})});import{z as Yh}from"zod";function eg(n){if(n.type==="loop")return"not offered as `{{stepId}}` tokens; reference inner steps. Exit conditions use `until.stepId`.";let e=Ja(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 tg(n){return n.type==="agent"?`agent (\`${n.outputFormat}\`)`:n.type==="git"?`git (\`${n.operation}\`)`:n.type==="provider_action"?n.extendedAction?"provider_action (`extendedAction`)":`provider_action (\`${n.action}\`)`:n.type}function ng(){return Object.keys(bn).map(t=>{let r=bn[t].map(o=>`\`{{subject.${o}}}\``).join(", ");return`- **${t}**: ${r}`}).join(`
|
|
24
|
-
`)}function
|
|
25
|
-
`)}function
|
|
26
|
-
`)}function
|
|
20
|
+
`)}function Jn(n,e){return e==="free_text"?n:au(n)}function au(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 Cm,Tm,Om,$m,Dr=l(()=>{"use strict";Ce();Cm={user:"User preferences",organization:"Organization guidelines",project:"Project context"},Tm=["user","organization","project"],Om={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."},$m={anthropic:"Anthropic",cursor:"Cursor"}});async function Qt(n){let e=n.fetchFn??fetch;return n.type==="claude"?Fm(n.apiKey,e):Nm(n.apiKey,e)}async function Fm(n,e){let t=await e(qm,{method:"GET",headers:{"x-api-key":n,"anthropic-version":Bm}});if(!t.ok)throw cu("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 Nm(n,e){let t=await e(Dm,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw cu("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 cu(n,e){let t=new Error(`${n} rejected the API key (HTTP ${e}). Check the key and try again.`);return t.name="PreviewModelsAuthError",t}var qm,Dm,Bm,Br=l(()=>{"use strict";qm="https://api.anthropic.com/v1/models",Dm="https://api.cursor.com/v1/models",Bm="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 Rt=l(()=>{"use strict"});async function*Lm(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 Jm,Xt,Oi=l(()=>{"use strict";Dr();Ce();Br();Rt();Dr();Jm=Ht("anthropic"),Xt=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Nn(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??Lm,s,a,u;for await(let c of i({prompt:r,options:o}))c.session_id&&(s=c.session_id),c.type==="result"&&(c.subtype==="success"&&typeof c.result=="string"?a=c.result:u=c.errors?.join("; ")||c.subtype||"Claude agent returned an error result");if(u)throw new Error(`Claude agent failed: ${u}`);if(a==null)throw new Error("Claude agent returned no result text");if(!s)throw new Error("Claude agent returned no session id");return{raw:a,parsed:Jn(a,e.outputFormat),sessionId:s}}async testConnection(){try{let e=await this.requireApiKey();return await Qt({type:"claude",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||Jm,t=await this.secrets.get(e);if(!t)throw qr("anthropic",e);return t}}});function Wm(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function Um(){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 Mm,Yt,$i=l(()=>{"use strict";Dr();Ce();Br();Rt();Mm=Ht("cursor"),Yt=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Nn(e),o=this.options.sdk??await Um(),i=Wm(t,e.cwd,this.options.model),s=e.sessionId?await o.resume(e.sessionId,i):await o.create(i);try{let u=await(await s.send(r)).wait();if(u.status!=="finished")throw new Error(u.error?.message||`Cursor agent ended with status '${u.status}'`);let c=u.result??"";return{raw:c,parsed:Jn(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async testConnection(){try{let e=await this.requireApiKey();return await Qt({type:"cursor",apiKey:e,fetchFn:this.options.fetchFn}),{success:!0}}catch(e){return ye(e)}}async requireApiKey(){let e=this.options.secretKey?.trim()||Mm,t=await this.secrets.get(e);if(!t)throw qr("cursor",e);return t}}});function uu(n){return typeof n=="object"&&n!=null&&typeof n.listExtendedActions=="function"&&typeof n.executeExtendedAction=="function"}function Fr(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 Zt(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var Nr=l(()=>{"use strict"});function Ln(n){return n==null?"":typeof n=="string"?n:lu(n).replace(/\n+$/,"")}function Jr(n){return{version:1,type:"doc",content:n.split(`
|
|
21
|
+
`).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function lu(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(lu).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
|
|
23
|
+
`:t}var qi=l(()=>{"use strict"});function Gm(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function du(n){return{representation:"atlas_doc_format",value:JSON.stringify(Jr(n))}}function mu(n){return Ln(Qm(n))}function Qm(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 fu(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:zm(e,n),raw:n}}function zm(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 Xm(n,e){return{id:String(n.id??""),subjectId:e,body:mu(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var Hm,Km,Vm,pu,Lr,en,Mr=l(()=>{"use strict";Nr();qi();Rt();Hm="kno.confluence.apiToken",Km=50,Vm=10,pu=500,Lr=[{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}]}],en=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()||Hm}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return fu(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 mu(t.body)}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){await this.requireConfig();let t=[],r=`/wiki/api/v2/pages/${encodeURIComponent(e)}/footer-comments?body-format=atlas_doc_format&limit=${Km}`,o=new Set;for(let i=0;i<Vm&&t.length<pu&&!(!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>=pu)break;t.push(Xm(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:du(t)}})}listExtendedActions(){return Lr}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${Zt(this.listExtendedActions())}`)}async createPage(e){let t=Lr[0];Fr(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:du(i)}});return fu(u,s,this.instanceId)}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async 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=Gm(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 d=await c.text();if(d)return JSON.parse(d)}}});import{randomUUID as Ym}from"node:crypto";var Zm,Wr,hu=l(()=>{"use strict";Zm=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),Wr=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:Ym(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(Zm.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Di(){return th.replace(/\/$/,"")}function tn(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 nh(n,e){return`${n}#${e}`}function rh(n){let e=n.repoSlug;if(typeof e!="string"||e.trim().length===0)throw new Error("Bitbucket query requires filter.repoSlug or filter.role \u2014 repo-scoped listing needs repoSlug; workspace-wide listing needs role (author|reviewer)");return e.trim()}function oh(n){if(typeof n.repoSlug=="string"&&n.repoSlug.trim().length>0||!gu(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 wu(n){if(!gu(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 ih(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=wu(n.state);if(e)return`state="${e}"`}function sh(n){let e=n.destination?.repository?.name;if(typeof e=="string"&&e.trim().length>0)return e.trim();let t=n.destination?.repository?.full_name;if(typeof t=="string"&&t.includes("/"))return t.slice(t.lastIndexOf("/")+1);throw new Error("Bitbucket workspace pull request is missing destination.repository slug")}function ah(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 gu(n){return n!=null&&n!==""}function Ni(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function Ur(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:nh(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},sourceBranch:String(n.source?.branch?.name??""),targetBranch:String(n.destination?.branch?.name??""),...n.author?.display_name?{author:n.author.display_name}:{},...n.links?.html?.href?{url:n.links.html.href}:{},raw:n}}function ch(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 eh,th,Bi,yu,Fi,Ji,nn,Hr=l(()=>{"use strict";Nr();Rt();eh="kno.bitbucket.apiToken",th="https://api.bitbucket.org/2.0";Bi=50,yu=10,Fi=500,Ji=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],nn=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()||eh}async get(e){let{repoSlug:t,prNumber:r}=tn(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return Ur(i,t,this.instanceId)}async query(e){let t=oh(e);if(t)return this.queryWorkspacePullRequests(t,e);let r=rh(e),{workspace:o}=await this.requireConfig(),i=ih(e),s=new URLSearchParams({pagelen:String(Bi)});i&&s.set("q",i);let a=`${Di()}/repositories/${encodeURIComponent(o)}/${encodeURIComponent(r)}/pullrequests?${s.toString()}`;return this.collectPullRequests(a,r)}async queryWorkspacePullRequests(e,t){let{workspace:r}=await this.requireConfig(),o=await this.selectedUser(),i=new URLSearchParams({pagelen:String(Bi)}),s=wu(t.state);s&&i.set("state",s),e==="reviewer"&&i.set("role","REVIEWER");let a=`${Di()}/workspaces/${encodeURIComponent(r)}/pullrequests/${encodeURIComponent(o)}?${i.toString()}`;return this.collectPullRequests(a)}selectedUserCache;async selectedUser(){let{email:e}=await this.requireConfig();if(this.selectedUserCache?.email===e)return this.selectedUserCache.id;let t=await this.request("GET","/user"),r=Ni(t.uuid,t.account_id,t.username);if(!r)throw new Error("Bitbucket GET /user did not return uuid, account_id, or username \u2014 cannot list workspace pull requests");return this.selectedUserCache={email:e,id:r},r}async collectPullRequests(e,t){let r=[],o=new Set,i=e;for(let s=0;s<yu&&r.length<Fi&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),u=Array.isArray(a.values)?a.values:[];for(let d of u){if(r.length>=Fi)break;r.push(Ur(d,t??sh(d),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}=tn(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${Bi}`;for(let u=0;u<yu&&i.length<Fi&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),d=Array.isArray(c.values)?c.values:[];for(let g of d)i.push(ch(g,e));let m=typeof c.next=="string"&&c.next.length>0?c.next:void 0;if(!m||d.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=tn(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}=tn(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(d){u.push({comment:c,error:d instanceof Error?d.message:String(d)})}return{succeeded:a,failed:u}}async updateStatus(e,t){let{repoSlug:r,prNumber:o}=tn(e),{workspace:i}=await this.requireConfig(),s=ah(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return Ji}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${Zt(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}=tn(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=Ni(u.uuid),d=Ni(u.account_id);if(!c&&!d)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(_=>c!=null&&_.uuid===c||d!=null&&_.account_id===d))return Ur(a,o,this.instanceId);let x=[...m.map(_=>_.uuid?{uuid:_.uuid}:{account_id:_.account_id}),c?{uuid:c}:{account_id:d}],R=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:x}});return Ur(R,o,this.instanceId)}prPath(e,t,r){return`/repositories/${encodeURIComponent(e)}/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}`}async testConnection(){try{let{email:e}=await this.requireAuth(),t=await this.request("GET","/user"),r=typeof t.email=="string"?t.email.trim():"";if(r||(r=await this.primaryBitbucketEmail()),r){let o=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:`${Di()}${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 d=await u.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${u.status}): ${d||u.statusText}`)}if(u.status===204)return;let c=await u.text();if(c)return JSON.parse(c)}}});import{randomUUID as uh}from"node:crypto";function lh(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Kr,bu=l(()=>{"use strict";Kr=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=>lh(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:uh(),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 Li(n){return n.pull_request!=null}function Qr(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}=xu(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 hh(n,e,t){return`${n}/${e}#${t}`}function xu(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 yh(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function wh(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function gh(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: ${mh.join(", ")}`)}function bh(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function Mi(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:hh(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 Sh(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function zr(n){return n!=null&&n!==""}var ph,dh,fh,Vr,Su,Gr,mh,rn,Wi=l(()=>{"use strict";Rt();ph="2026-03-10",dh="https://api.github.com",fh="kno.github.apiToken",Vr=100,Su=10,Gr=500,mh=["open","closed/done/completed","not_planned/wontfix"],rn=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()||fh}async get(e){let{owner:t,repo:r,issueNumber:o}=Qr(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(Li(i))throw new Error(`Ticket not found: ${e}`);return Mi(i,this.instanceId,`${t}/${r}`)}async query(e){let t=typeof e.repo=="string"?e.repo.trim():"";if(t)return this.queryRepoIssues(t,e);let r=yh(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repo ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=Qr(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>Sh(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=Qr(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}=Qr(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:gh(t)})}async queryRepoIssues(e,t){let{owner:r,name:o}=xu(e),i=[],s=new URLSearchParams;s.set("per_page",String(Vr)),zr(t.state)&&s.set("state",String(t.state)),zr(t.labels)&&s.set("labels",String(t.labels)),zr(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=Su&&i.length<Gr;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 d of c)if(!Li(d)){if(i.length>=Gr)break;i.push(Mi(d,this.instanceId,`${r}/${o}`))}if(c.length<Vr)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[wh(e,r),"is:issue"];zr(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=Su&&s.length<Gr;a++){let u=new URLSearchParams({q:i,per_page:String(Vr),page:String(a)}),c=await this.request("GET",`/search/issues?${u.toString()}`),d=Array.isArray(c.items)?c.items:[];if(d.length===0)break;for(let m of d)if(!Li(m)){if(s.length>=Gr)break;s.push(Mi(m,this.instanceId,bh(m)))}if(d.length<Vr)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=`${dh}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":ph};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 At,y,h,B,Mn,E=l(()=>{"use strict";At=class extends Error{details;constructor(e,t){super(e),this.name=this.constructor.name,this.details=t}},y=class extends At{httpStatus=404},h=class extends At{httpStatus=400},B=class extends At{httpStatus=409},Mn=class extends Error{details;constructor(e,t){super(e),this.name="StepFailureError",this.details=t}}});function Ih(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(Yr(n.project)&&e.push(`project = ${Zr(n.project)}`),Yr(n.status)&&e.push(`status = ${Zr(n.status)}`),Yr(n.assignee)&&e.push(`assignee = ${Zr(n.assignee)}`),Yr(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${Zr(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 Yr(n){return n!=null&&n!==""}function Zr(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function vu(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=Ln(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 xh,vh,jh,Xr,on,Ui=l(()=>{"use strict";E();qi();Rt();xh="kno.jira.apiToken",vh=50,jh=10,Xr=500,on=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()||xh}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return vu(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=Ih(e),o=[],i,s=new Set;for(let a=0;a<jh&&o.length<Xr;a++){let u={jql:r,maxResults:Math.min(vh,Xr-o.length),fields:["summary","description","status","assignee"]};i&&(u.nextPageToken=i);let c=await this.request("POST","/rest/api/3/search/jql",{body:u}),d=Array.isArray(c.issues)?c.issues:[];for(let g of d){if(o.length>=Xr)break;o.push(vu(g,t,this.instanceId))}let m=typeof c.nextPageToken=="string"?c.nextPageToken:void 0;if(c.isLast===!0||!m||d.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=Xr;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:Ln(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:Jr(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 d=await c.text();if(d)return JSON.parse(d)}}});import{randomUUID as _h}from"node:crypto";function Ph(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var eo,ju=l(()=>{"use strict";eo=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=>Ph(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:_h(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.tickets.get(e);if(!r)throw new Error(`Ticket not found: ${e}`);r.status=t}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Ve(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function to(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function Eh(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var CI,U,sn=l(()=>{"use strict";C();Oi();$i();Mr();hu();Hr();bu();Wi();Ui();ju();CI=Symbol("PROVIDER_REGISTRY");U=class n{tickets=new Map;repos=new Map;documentation=new Map;agents=new Map;instances=[];constructor(){}static fromSettings(e,t){let r=new n;return r.load(e,t),r}static fromMaps(e){let t=new n;for(let[r,o]of Object.entries(e.tickets??{}))t.tickets.set(r,o);for(let[r,o]of Object.entries(e.repos??{}))t.repos.set(r,o);for(let[r,o]of Object.entries(e.documentation??{}))t.documentation.set(r,o);for(let[r,o]of Object.entries(e.agents??{}))t.agents.set(r,o);return t.instances.push(...e.instances??[]),t}load(e,t){let r=new Set;for(let o of e){if(r.has(o.id))throw new Error(`Duplicate provider instance id '${o.id}'`);r.add(o.id),this.instances.push(o),this.instantiate(o,t)}}instantiate(e,t){if(Fe(e)){let o=Ve(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new Xt(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new Yt(t,{secretKey:e.secretKey,model:o}));return}if(!kt(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=Eh(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 on(t,{instanceId:e.id,baseUrl:Ve(e.config,"baseUrl"),email:Ve(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new rn(t,{instanceId:e.id,username:Ve(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new nn(t,{instanceId:e.id,email:Ve(e.config,"email"),workspace:Ve(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new en(t,{instanceId:e.id,baseUrl:Ve(e.config,"baseUrl"),email:Ve(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new eo([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new Kr([],e.id));return}this.documentation.set(e.id,new Wr([],{instanceId:e.id,type:Ve(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw to(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw to(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw to(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw to(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>kt(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function _u(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{role:"reviewer",state:"OPEN"};case"repo-open-prs":{let t=typeof e.repoSlug=="string"?e.repoSlug.trim():"";if(!t)throw new h("Bitbucket template 'repo-open-prs' requires params.repoSlug");return{repoSlug:t,state:"OPEN"}}default:throw new y(`Unknown Bitbucket query template: ${n}`)}}var Iu,Pu=l(()=>{"use strict";E();Iu=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[{name:"repoSlug",label:"Repository",type:"string",required:!0}]}]});function ku(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":{let t=typeof e.repo=="string"?e.repo.trim():"";if(!t)throw new h("GitHub template 'repo-open-issues' requires params.repo");return{repo:t,state:"open"}}default:throw new y(`Unknown GitHub query template: ${n}`)}}var Eu,Ru=l(()=>{"use strict";E();Eu=[{id:"my-open-issues",label:"My open issues",params:[]},{id:"created-by-me",label:"Issues I created",params:[]},{id:"repo-open-issues",label:"Open issues in a repository",params:[{name:"repo",label:"Repository (owner/name)",type:"string",required:!0}]}]});function $u(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 = ${Tu(Cu(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${Tu(Cu(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new y(`Unknown Jira query template: ${n}`)}}function Cu(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 Tu(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var Au,Ou,qu=l(()=>{"use strict";E();Au={name:"project",label:"Project key",type:"string",required:!0},Ou=[{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:[Au]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[Au]}]});import{Inject as Bu,Injectable as Ah}from"@nestjs/common";var kh,Rh,Du,Fu,lt,Hi=l(()=>{"use strict";C();E();he();sn();Pu();Ru();qu();kh=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},Rh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Du=function(n,e){return function(t,r){e(t,r,n)}},Fu={bitbucket:{list:()=>Iu,resolve:_u},github:{list:()=>Eu,resolve:ku},jira:{list:()=>Ou,resolve:$u}},lt=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?Fu[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?Fu[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)continue;let u=r[a.name];if(u==null||typeof u=="string"&&u.trim()==="")throw new h(`Template '${t}' requires params.${a.name}`)}return i.resolve(t,r)}async providerType(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);if(!(!r||!kt(r)))return r.type}};lt=kh([Ah(),Du(0,Bu(I)),Du(1,Bu(U)),Rh("design:paramtypes",[I,U])],lt)});import{Inject as Ju,Injectable as Oh}from"@nestjs/common";var Ch,Th,Nu,$h,pt,Ki=l(()=>{"use strict";C();he();Mr();Hr();sn();Ch=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},Th=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Nu=function(n,e){return function(t,r){e(t,r,n)}},$h={bitbucket:()=>Ji,confluence:()=>Lr},pt=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||!kt(r)?[]:$h[r.type]?.()??[]}};pt=Ch([Oh(),Nu(0,Ju(I)),Nu(1,Ju(U)),Th("design:paramtypes",[I,U])],pt)});import{Inject as Gi,Injectable as Bh}from"@nestjs/common";var qh,Dh,Vi,an,dt,no=l(()=>{"use strict";C();he();Ce();E();Br();qh=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},Dh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Vi=function(n,e){return function(t,r){e(t,r,n)}},an="PREVIEW_MODELS_FETCH",dt=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async preview(e){let t=e.apiKey?.trim();if(t)return this.lookup(e.type,t);let r=e.instanceId?.trim();if(!r)throw new h("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new y(`Provider instance not found: ${r}`);if(!Fe(o)||o.type!==e.type)throw new h(`Provider instance '${r}' is not a ${e.type} agent`);let i=await this.secrets.get(o.secretKey);if(!i)throw new h(`No API key stored for instance '${r}'. Enter a key to fetch models.`);return this.lookup(e.type,i)}async lookup(e,t){try{return await Qt({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")}}};dt=qh([Bh(),Vi(0,Gi(I)),Vi(1,Gi(oe)),Vi(2,Gi(an)),Dh("design:paramtypes",[I,Function,Function])],dt)});import{Inject as zi,Injectable as Jh}from"@nestjs/common";function Ct(n,e){let t=n?.[e];return typeof t=="string"&&t.trim()?t.trim():void 0}var Fh,Nh,Qi,Xi,Yi,Se,ro=l(()=>{"use strict";C();he();Ce();E();no();Ui();Wi();Hr();Mr();Oi();$i();Fh=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},Nh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Qi=function(n,e){return function(t,r){e(t,r,n)}},Xi="kno.probe.apiToken",Yi=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(!Vc(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 Yi(r);return this.createProvider(e,t,o).testConnection()}createProvider(e,t,r){let o={instanceId:"probe",secretKey:Xi};switch(e){case"jira":return new on(r,{...o,baseUrl:Ct(t,"baseUrl"),email:Ct(t,"email")},this.fetchFn);case"bitbucket":return new nn(r,{...o,email:Ct(t,"email"),workspace:Ct(t,"workspace")},this.fetchFn);case"github":return new rn(r,{...o,username:Ct(t,"username")},this.fetchFn);case"confluence":return new en(r,{...o,baseUrl:Ct(t,"baseUrl"),email:Ct(t,"email")},this.fetchFn);case"claude":return new Xt(r,{secretKey:Xi,fetchFn:this.fetchFn});case"cursor":return new Yt(r,{secretKey:Xi,fetchFn:this.fetchFn})}}};Se=Fh([Jh(),Qi(0,zi(I)),Qi(1,zi(oe)),Qi(2,zi(an)),Nh("design:paramtypes",[I,Function,Function])],Se)});import{Module as Mh}from"@nestjs/common";var Lh,ft,oo=l(()=>{"use strict";Yo();ca();ri();Ce();Fn();he();Ti();sn();Hi();Ki();no();ro();Lh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ft=class{};ft=Lh([Mh({imports:[Kt,Ne],providers:[{provide:U,useFactory:async(n,e)=>{let t=await n.get();return U.fromSettings(t.providerInstances??[],e)},inject:[I,oe]},{provide:Sn,useClass:er},ut,lt,pt,{provide:an,useValue:(n,e)=>fetch(n,e)},dt,Se],exports:[U,Sn,ut,lt,pt,dt,Se,an]})],ft)});import{Injectable as Uh}from"@nestjs/common";var Wh,xe,io=l(()=>{"use strict";Wh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},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=Wh([Uh()],xe)});import{Global as Kh,Module as Vh}from"@nestjs/common";var Hh,mt,so=l(()=>{"use strict";io();Hh=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},mt=class{};mt=Hh([Kh(),Vh({providers:[xe],exports:[xe]})],mt)});import{Injectable as Qh}from"@nestjs/common";import{resolve as zh}from"node:path";var Gh,ht,Zi=l(()=>{"use strict";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},ht=class{tails=new Map;lockKey(e){let t=zh(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}};ht=Gh([Qh()],ht)});import{Injectable as Zh}from"@nestjs/common";import{execFile as ey}from"node:child_process";import{mkdirSync as es,rmSync as ty}from"node:fs";import{dirname as ny,join as co,resolve as ao}from"node:path";import{promisify as ry}from"node:util";function Lu(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function Mu(n){return co(n,"worktrees")}function iy(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 Xh,Yh,oy,Ge,ts=l(()=>{"use strict";Zi();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},Yh=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},oy=ry(ey),Ge=class{worktreesRoot;fetchLocks;constructor(e,t=new ht){this.worktreesRoot=e,this.fetchLocks=t,es(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??co(this.worktreesRoot,e);return es(co(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){es(co(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 iy(t)}async resetWorktreeToRemote(e,t){let r=ao(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=ao(e);try{let r=await this.mainRepoPath(t);await this.git(r,["worktree","remove","--force",t])}catch{ty(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=ao(e),{stdout:r}=await this.git(t,["rev-parse","--git-common-dir"]),o=ao(t,r.trim());return o.endsWith(".git")?ny(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 oy("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=Lu(o.stderr),s=Lu(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Ge=Xh([Zh(),Yh("design:paramtypes",[String,ht])],Ge)});import{Module as ay}from"@nestjs/common";import{mkdirSync as cy}from"node:fs";var sy,Wu,uo,Uu=l(()=>{"use strict";tr();ts();Zi();sy=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Wu=vn();cy(Wu,{recursive:!0});uo=class{};uo=sy([ay({providers:[ht,{provide:Ge,useFactory:n=>new Ge(Mu(Wu),n),inject:[ht]}],exports:[Ge]})],uo)});function un(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=Wn(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function Hu(n){let e=n.trim();return(e.match(/^\{\{\s*([^}]+?)\s*\}\}$/)?.[1]??e).trim()}function Wn(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 cn(n,e){return typeof n=="string"?un(n,e):Array.isArray(n)?n.map(t=>cn(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,cn(r,e)])):n}var ns=l(()=>{"use strict"});function Vu(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=uy(i,e);if(r=s??i,s==null)return{kind:"no_match",sourceValue:r};o=s}if(t){let i=Ku(o),s;try{s=new RegExp(t)}catch(c){let d=c instanceof Error?c.message:String(c);throw new Error(`Invalid extract pattern: ${d}`)}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:Ku(o),sourceValue:r}}function uy(n,e){if(!(n==null||typeof n!="object"))return Wn(n,e)}function Ku(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):n==null?"":JSON.stringify(n)}var Gu=l(()=>{"use strict";ns()});function yt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=yt(r.stepExecutions,e);if(o)return o}}}function Tt(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=Tt(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 lo(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:lo(i.stepExecutions,e,t,r)}))}:o})}function Ot(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Ot(t.steps,e);if(r)return r}}}function Qu(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 rs(n){let e=[];for(let t of n){t.childJobIds&&e.push(...t.childJobIds);for(let r of t.iterations??[])e.push(...rs(r.stepExecutions))}return e}var zu=l(()=>{"use strict"});import{z as Y}from"zod";function Xu(n,e){let t=my[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 ly,py,dy,fy,my,Yu=l(()=>{"use strict";ly=Y.object({questions:Y.array(Y.object({id:Y.string(),prompt:Y.string()}))}),py=Y.object({approved:Y.boolean()}),dy=Y.object({suggestions:Y.array(Y.object({id:Y.string().min(1),file:Y.string().min(1),line:Y.number().int(),body:Y.string()}))}),fy=Y.string(),my={questionnaire:ly,confirmation:py,comment_suggestions:dy,free_text:fy}});function ve(n){return n==="completed"||n==="failed"||n==="cancelled"}function os(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 Zu(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 is=l(()=>{"use strict"});async function po(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 ss=l(()=>{"use strict";E()});import{Injectable as yy}from"@nestjs/common";var hy,$t,as=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},$t=class{requested=new Set;requestCancellation(e){this.requested.add(e)}isCancellationRequested(e){return this.requested.has(e)}clear(e){this.requested.delete(e)}};$t=hy([yy()],$t)});import{Inject as Sy,Injectable as xy}from"@nestjs/common";var wy,gy,by,je,fo=l(()=>{"use strict";C();he();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},gy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},by=function(n,e){return function(t,r){e(t,r,n)}},je=class{settings;running=new Map;queues=new Map;admitTails=new Map;constructor(e){this.settings=e}async acquire(e,t,r){let o={jobId:t,stepExecutionId:r,agentInstanceId:e,enqueuedAt:new Date().toISOString()},i=null;await this.serialized(e,async()=>{await this.drainQueue(e),!await this.tryAdmit(e)&&(i=new Promise((s,a)=>{let u=this.queues.get(e)??[];u.push({entry:o,resolve:s,reject:a}),this.queues.set(e,u)}))}),i&&await i}release(e){let t=this.running.get(e)??0;t<=1?this.running.delete(e):this.running.set(e,t-1),this.serialized(e,()=>this.drainQueue(e))}listQueued(){let e=[];for(let t of this.queues.values())for(let r of t)e.push(r.entry);return e.sort((t,r)=>t.enqueuedAt.localeCompare(r.enqueuedAt))}dropQueued(e){for(let[t,r]of this.queues){let o=[];for(let i of r)i.entry.jobId===e?i.reject(new Error(`Job ${e} cancelled while queued for an agent slot`)):o.push(i);o.length===0?this.queues.delete(t):this.queues.set(t,o)}}runningCount(e){return this.running.get(e)??0}async serialized(e,t){let o=(this.admitTails.get(e)??Promise.resolve()).then(t,t);this.admitTails.set(e,o.then(()=>{},()=>{})),await o}async drainQueue(e){let t=await this.limit(e);for(;;){let r=this.queues.get(e);if(!r||r.length===0||!this.hasCapacity(e,t))return;let o=r.shift();r.length===0&&this.queues.delete(e),this.addRunning(e),o.resolve()}}async tryAdmit(e){let t=await this.limit(e);return this.hasCapacity(e,t)?(this.addRunning(e),!0):!1}hasCapacity(e,t){return(this.running.get(e)??0)<t}addRunning(e){this.running.set(e,(this.running.get(e)??0)+1)}async limit(e){let r=((await this.settings.get()).providerInstances??[]).find(o=>o.id===e);return!r||!Fe(r)?Bn:Qc(r)}};je=wy([xy(),by(0,Sy(I)),gy("design:paramtypes",[Object])],je)});import{Logger as vy}from"@nestjs/common";import{readFile as jy}from"node:fs/promises";async function el(n,e,t=new vy("resolveContextFiles"),r=o=>jy(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 tl=l(()=>{"use strict"});import{basename as Iy,dirname as _y,join as Py,resolve as Un,sep as nl}from"node:path";function Ey(n){return n.replace(/-/g,"").slice(0,4)}function rl(n,e){return`${n}-${Ey(e)}`}function cs(n){return n.replace(/[\\/:*?"<>|]/g,"-")}function mo(n){let e=Un(n);return Py(_y(e),`${Iy(e)}-worktrees`)}function ho(n,e){let t=Un(n),r=Un(e);if(wt(t,r))return!0;let o=t.endsWith(nl)?t:t+nl,i=process.platform==="win32"?r.toLowerCase():r,s=process.platform==="win32"?o.toLowerCase():o;return i.startsWith(s)}function wt(n,e){let t=Un(n),r=Un(e);return process.platform==="win32"?t.toLowerCase()===r.toLowerCase():t===r}var us=l(()=>{"use strict"});import{join as ol}from"node:path";async function il(n,e,t){let r={...e},o=await t.list();for(let i of n){if(i.type!=="localRepository")continue;let s=r[i.name];if(s==null||s==="")continue;let a=String(s),u=o.find(m=>m.id===a),c=o.find(m=>wt(m.localPath,a)),d=u??c;if(!d)throw new h(`Unknown local repository: ${a}`);r[i.name]=d.localPath}return r}async function sl(n){let{job:e,params:t,git:r,jobs:o,localRepositories:i}=n,s=yo(t,"repoPath"),a=t.mode==="existing-branch"?"existing-branch":"new-branch",u=(await i.list()).find(x=>wt(x.localPath,s)),c=u?.worktreeBasePath?.trim()?u.worktreeBasePath.trim():mo(s);if(ho(s,c)&&!wt(s,c))throw new Error(`Worktree base '${c}' must not be inside the repository at '${s}'`);if(a==="existing-branch")return ky({job:e,repoPath:s,branch:yo(t,"branch"),worktreeBase:c,explicitPath:typeof t.worktreePath=="string"?t.worktreePath:void 0,git:r,jobs:o});let d=yo(t,"branchName"),m=rl(d,e.id),g=typeof t.worktreePath=="string"&&t.worktreePath.trim()!==""?t.worktreePath:ol(c,cs(m));return r.createWorktree(e.id,{repoPath:s,baseBranch:yo(t,"baseBranch"),branchName:m,worktreePath:g})}async function ky(n){let{job:e,repoPath:t,branch:r,worktreeBase:o,git:i,jobs:s}=n,a=await i.listWorktrees(t),u=a.filter(g=>g.branch===r&&!wt(g.path,t)),c=a.find(g=>g.branch===r&&wt(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:ol(o,cs(r));return i.addWorktreeForExistingBranch({repoPath:t,branch:r,worktreePath:g})}let d=u[0].path,m=await Ry(s,d);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(d,r),{worktreePath:d,branch:r}}async function Ry(n,e){let r=(await n.list({liveWorktree:!0})).filter(o=>o.worktreePath!=null&&wt(o.worktreePath,e));return r.find(o=>!ve(o.status))??r.sort((o,i)=>i.updatedAt.localeCompare(o.updatedAt))[0]}function yo(n,e){let t=n[e];if(typeof t!="string"||t.trim()==="")throw new Error(`git step missing required param '${e}'`);return t}var al=l(()=>{"use strict";E();us();is()});import{Inject as ae,Injectable as Ty,Logger as Oy}from"@nestjs/common";import{randomUUID as wo}from"node:crypto";import{exec as $y}from"node:child_process";import{promisify as qy}from"node:util";async function ls(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 Fy(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 gt(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 Ny(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 go(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function qt(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Jy(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 Ly(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?"array":typeof n}function My(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 cl(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 Ay,Cy,se,ps,Dy,By,Ie,bo=l(()=>{"use strict";C();_t();On();ar();sr();io();ts();he();cr();ur();sn();Yo();Nr();E();ns();Gu();zu();Yu();is();ss();as();fo();tl();al();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)},se=function(n,e){return function(t,r){e(t,r,n)}},Dy=qy($y),By=new Set(["agent","shell","git","provider_action"]),Ie=ps=class{workflows;jobs;batches;views;events;providers;notifications;contextFiles;localRepositories;git;settings;cancellation;agentGate;logger=new Oy(ps.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,d,m,g,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=d,this.settings=m,this.cancellation=g,this.agentGate=x,this.events.subscribe(R=>{let _=R;(_.type==="job_completed"||_.type==="job_failed"||_.type==="job_cancelled")&&this.onChildTerminal(_.jobId)})}async start(e){let t=await this.createJob(e);return this.emit({type:"job_started",jobId:t.id,timestamp:new Date().toISOString()}),this.runJob(t.id)}async launch(e){let t=await this.requireWorkflow(e.workflowId);if(t.subjectHandling!=="per-subject"&&t.subjectHandling!=="collection")throw new h(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);cl(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 il(t.inputSchema,e.inputValues,this.localRepositories);cl(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=>!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=yt(r.stepHistory,i);if(!s)throw new Error(`Paused execution ${i} not found on job ${e}`);if(s.type==="loop")return this.resumeAskHuman(r,o,s,t);if(s.type==="extract")return this.resumeExtract(r,o,s,t);if(s.type!=="interaction")throw new Error(`Paused execution ${i} has type '${s.type}'; expected interaction, extract, or loop`);let a=Ot(o.steps,s.stepDefinitionId),u=t;if(a?.type==="interaction"&&a.interaction==="comment_review"){let O=vc(t);if(!O)throw new h(`comment_review step '${a.id}' resume requires { finalComments: { file, line, body }[] }`);u=O}let c=new Date().toISOString(),d=H(r.stepHistory,i,O=>({...O,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:d,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c}),this.emit({type:"human_answered",jobId:r.id,answers:m,timestamp:c});let g=Tt(r.stepHistory,i);if(!g)throw new Error(`Could not locate frame for execution ${i}`);let x=this.sequenceForFrameOnJob(r,o,g),R=g.index+1,_=await this.executeStepSequence(r,o,x,g.parentLoopExecutionId,g.iterationIndex,R);return _.outcome!=="completed"?_.job:g.parentLoopExecutionId!=null&&g.iterationIndex!=null?this.continueLoopAfterBody(_.job,o,g.parentLoopExecutionId,g.iterationIndex):this.completeJob(_.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);if(t.status!=="failed")throw new B(`Job ${e} is not failed (status: ${t.status})`);let r=t.parentJobId!=null&&t.parentStepExecutionId!=null&&t.fanOutIndex!=null,o=t.batchId!=null&&t.fanOutIndex!=null;if(r){let a=await this.jobs.get(t.parentJobId);if(!a)throw new y(`Parent job not found: ${t.parentJobId}`);let u=await this.workflowForJob(t),c=t.subjectContext?{}:this.inputValuesFromContext(t.context,u),d=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??[],d.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:m,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emitRetryLaunch(d.id,t.id),this.runJob(d.id),d}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=yt(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(!By.has(i.type))throw new B(`Step-level retry is not available for '${i.type}' steps`);let s=await this.workflowForJob(r),a=Tt(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(Cc(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 d=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,R=>({...R,status:"running",error:void 0,failureDetails:void 0,completedAt:void 0,output:void 0,startedAt:d})),updatedAt:d}),x=await this.executeStepSequence(g,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 rs(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 d=s;d<r.length;d++){let m=await this.stopIfCancelled(c);if(m)return{outcome:"cancelled",job:m};let g=r[d],x=new Date().toISOString(),R=d===s?a:void 0;if(g.condition&&wr(g.condition,c.context)){if(c=await this.recordSkippedStep(c,g,R,o,i),c.status==="cancelled")return{outcome:"cancelled",job:c};continue}let _,O=c.stepHistory;if(R){let Ae=yt(c.stepHistory,R);if(!Ae)throw new Error(`Reuse execution ${R} not found on job ${c.id}`);_=Ae}else _={id:wo(),stepDefinitionId:g.id,type:g.type,status:"running",startedAt:x},O=lo(c.stepHistory,_,o,i);if(c=await this.persistJob({...c,status:c.status==="pending"?"planning":c.status,currentStepId:g.id,currentStepExecutionId:_.id,stepHistory:O,updatedAt:x}),c.status==="cancelled")return{outcome:"cancelled",job:c};this.emit({type:"step_started",jobId:c.id,stepDefinitionId:g.id,timestamp:x});try{let Ae=await this.dispatchStep(c,t,g,_.id,o,i,R?u:void 0);c=Ae.job;let Ut=await this.stopIfCancelled(c);if(Ut)return{outcome:"cancelled",job:Ut};if(Ae.outcome!=="completed")return Ae}catch(Ae){let Ut=await this.failJob(c,t,_.id,g.id,Ae);return Ut.status==="cancelled"?{outcome:"cancelled",job:Ut}:{outcome:"failed",job:Ut}}}return o!=null&&i!=null&&(c=await this.persistJob({...c,stepHistory:Qu(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,d=a;for(;;){if(d>=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:d,exitedOnMaxIterations:!0}),{outcome:"completed",job:c};case"ask_human":{let g={maxIterationsCheckpoint:!0,nextIteration:d,effectiveMaxIterations:u},x=new Date().toISOString(),R=H(c.stepHistory,o,_=>({..._,status:"pending",output:g}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:R,updatedAt:x}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:g,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 g=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(g)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,d,0);if(c=m.job,m.outcome!=="completed")return m;if(wr(r.until,c.context))return c=await this.finishExecution(c,o,r.id,{iterations:d+1}),{outcome:"completed",job:c};d+=1}}async resumeAskHuman(e,t,r,o){let i=o,s=r.output;if(!s?.maxIterationsCheckpoint)throw new Error(`Loop execution ${r.id} is not at an ask_human checkpoint`);let a=Ot(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=Tt(e.stepHistory,r.id),c=new Date().toISOString();if(i.action==="cancel")return await this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c},t,r.id,a.id,"Loop cancelled by human at maxIterations checkpoint");if(i.action==="continue"){let R=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(e.stepHistory,r.id,_=>({..._,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:R.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:R.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(R,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(R,t,a.id)}let d=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+d,g=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(e.stepHistory,r.id,R=>({...R,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:g.id,answers:i,timestamp:c});let x=await this.runLoopStep(g,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=Ny(o),s=Ot(t.steps,r.stepDefinitionId);if(!s||s.type!=="extract")throw new Error(`Extract step definition '${r.stepDefinitionId}' not found`);let a=new Date().toISOString();if(i.action==="cancel")return this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a},t,r.id,s.id,`Extract '${s.id}' cancelled by human`);let u=i.action==="continue"?"":i.value,c=await this.finishExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a},r.id,s.id,u);this.emit({type:"human_answered",jobId:c.id,answers:i,timestamp:a});let d=Tt(e.stepHistory,r.id);if(!d)throw new Error(`Could not locate frame for execution ${r.id}`);let m=this.sequenceForFrameOnJob(c,t,d),g=d.index+1,x=await this.executeStepSequence(c,t,m,d.parentLoopExecutionId,d.iterationIndex,g);return x.outcome!=="completed"?x.job:d.parentLoopExecutionId!=null&&d.iterationIndex!=null?this.continueLoopAfterBody(x.job,t,d.parentLoopExecutionId,d.iterationIndex):this.completeJob(x.job,t)}async continueLoopAfterBody(e,t,r,o){let i=yt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Ot(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=Tt(e.stepHistory,r),u=i.output?.effectiveMaxIterations??s.maxIterations,c=e;if(wr(s.until,c.context))c=await this.finishExecution(c,r,s.id,{iterations:o+1});else{let d=o+1,m=await this.runLoopStep(c,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,d,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=yt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Ot(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){let o=t.forEach==="selection"?await this.spawnSelectionChildren(e,t,r):await this.spawnSourceChildren(e,t,r);if(o.length===0)return{outcome:"completed",job:await this.finishExecution(e,r,t.id,[])};let i=o.map(c=>c.id),s=new Date().toISOString(),a=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=Jy(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(!ec(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=Hu(t.forEach.source);if(!i)throw new h(`sub_workflow step '${t.id}' forEach.source must be a non-empty path`);let s=Wn(gt(e),i);if(!Array.isArray(s))throw new h(`sub_workflow forEach source '${i}' must resolve to an array (got ${Ly(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],d=await this.createJob({workflowId:t.workflowId,inputValues:c,parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:u});a.push(d)}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(O=>O.parentStepExecutionId===t.parentStepExecutionId),i=os(o,O=>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,d=yt(a.stepHistory,c);if(!d||d.type!=="sub_workflow")return;let m=s.some(O=>O.status==="failed");if(s.some(O=>O.status==="cancelled"))return;if(m){await this.failExecution(a,u,c,d.stepDefinitionId,"One or more child jobs failed");return}let x=s.slice().sort((O,Ae)=>(O.fanOutIndex??0)-(Ae.fanOutIndex??0)).map(O=>({fanOutIndex:O.fanOutIndex,jobId:O.id,output:O.context})),R=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[d.stepDefinitionId]:x},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:H(a.stepHistory,c,O=>({...O,status:"completed",completedAt:R,output:x})),completedAt:void 0,updatedAt:R}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:d.stepDefinitionId,timestamp:R});let _=await this.continueTopLevelAfter(a,u,d.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=os(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=Zu(a),c=new Date().toISOString(),d=await this.batches.update(o.id,{status:u,completedAt:c});if(!d)return;if(this.emit({type:"batch_completed",batchId:d.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:c}),!d.notificationSent){let m=await this.workflowForJob(t),g=d.notificationOverride??m.notificationPolicy,x=u==="completed"?"on_complete":"on_fail";g.triggers.includes(x)&&await this.notifications.send({title:`Batch ${u}: ${m.name}`,body:`JobBatch ${d.id} finished with status '${u}' (${a.length} members)`,batchId:d.id}),await this.batches.update(d.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return po(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 el(t.contextFileIds??[],this.contextFiles,this.logger),i=gt(e),s=un(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 d=await this.stopIfCancelled(u);if(d)return d;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=Xu(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=cn(t.params,gt(e));switch(t.operation){case"create_worktree":{let i=await sl({job:e,params:o,git:this.git,jobs:this.jobs,localRepositories:this.localRepositories});return this.finishExecution(e,r,t.id,i,{worktreePath:i.worktreePath,branch:i.branch})}case"create_branch":{let i=go(e),s=qt(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=go(e),s=qt(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=go(e),s=await this.git.commit(i,{message:qt(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=go(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??cn(t.params??{},gt(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=un(t.target.subjectId,gt(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,qt(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 d=Ac(r.comments);if(!d)throw new h("post_comment params.comments must be { file, line, body }[]");let m=await c.call(u,s,d);if(m.failed.length>0)throw new Mn(`Failed to post ${m.failed.length} of ${d.length} positioned comments`,{succeeded:m.succeeded,failed:m.failed});return{posted:!0,succeeded:m.succeeded}}return await a.postComment(s,qt(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,qt(r,"status")),{status:qt(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(!uu(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: ${Zt(a)}`);let c=cn(i.params??{},gt(e))??{};Fr(u,c);let d=await s.executeExtendedAction(i.actionId,{...c,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,d)}async executeShellStep(e,t,r){let o=un(t.command,gt(e)),i=e.worktreePath??process.cwd();try{let s=await Dy(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??"",d=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${d}, cwd=${i}): ${u||c||a.message||o}`)}}async executeExtractStep(e,t,r,o){let i=un(r.source,gt(e)),s=Vu({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}:{}},d=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:d,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=Zc(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:xc(r,t.steps,e.context)};let o=Fy(t,r.id);return o!=null?e.context[o]:void 0}async recordSkippedStep(e,t,r,o,i){let s=new Date().toISOString(),a=fc(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=lo(e.stepHistory,m,o,i)}let d=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:d.id,stepDefinitionId:t.id,timestamp:s}),d}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 Mn?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}})),d=await this.persistJob({...e,status:"failed",currentStepId:o,currentStepExecutionId:r,stepHistory:c,completedAt:u,updatedAt:u});return this.emit({type:"step_failed",jobId:d.id,stepDefinitionId:o,error:s,timestamp:u}),d.status==="cancelled"?(await this.onBatchMemberTerminal(d.id),d):(this.emit({type:"job_failed",jobId:d.id,error:s,timestamp:u}),await this.onBatchMemberTerminal(d.id),!d.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${d.id} failed on step '${o}': ${s}`,jobId:d.id}),d)}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=My(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 ls(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return ls(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return ls(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};Ie=ps=Ay([Ty(),se(0,ae(D)),se(1,ae(X)),se(2,ae(pe)),se(3,ae(le)),se(4,ae(xe)),se(5,ae(U)),se(6,ae(Sn)),se(7,ae(de)),se(8,ae(fe)),se(9,ae(Ge)),se(10,ae(I)),se(11,ae($t)),se(12,ae(je)),Cy("design:paramtypes",[D,X,pe,le,xe,U,Object,de,fe,Ge,Object,$t,je])],Ie)});import{Module as Uy}from"@nestjs/common";var Wy,ln,ds=l(()=>{"use strict";Fn();oo();so();Uu();bo();as();fo();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},ln=class{};ln=Wy([Uy({imports:[Ne,ft,mt,uo],providers:[$t,je,Ie],exports:[Ie,je]})],ln)});import{Catch as Ky}from"@nestjs/common";var Hy,So,ul=l(()=>{"use strict";E();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},So=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message,...e.details??{}})}};So=Hy([Ky(At)],So)});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 ll(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(!hc(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function pl(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 dl(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var xo=l(()=>{"use strict";C();E()});import{randomUUID as Vy}from"node:crypto";function Gy(){return Vy()}function fl(n){let e=n.id??Gy(),t=Za(n.steps),r=ml(n.steps,t);return{...n,id:e,steps:r}}function ml(n,e){return n.map(t=>{let r=t.id;return r||(r=za(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:ml(t.steps,e)}:{...t,id:r}})}var hl=l(()=>{"use strict";C()});function yl(n){return n.issues.map(e=>`${e.path.join(".")||"(root)"}: ${e.message}`).join("; ")}function fs(n){let e=ct.safeParse(n);if(!e.success)throw new h(`Validation failed: ${yl(e.error)}`);return e.data}function wl(n){let e=fl(n),t=qn.safeParse(e);if(!t.success)throw new h(`Validation failed: ${yl(t.error)}`);return dl(t.data),t.data}async function bt(n,e){return n.create(wl(fs(e)))}async function vo(n,e,t){let r=wl({...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 jo=l(()=>{"use strict";C();E();xo();hl()});import{z as Dt}from"zod";async function bl(n,e){let t=fs(e.workflowDefinition),r=t.id;if(!r)return{workflow:await bt(n,t),created:!0};let o=await n.get(r);if(!o)return{workflow:await bt(n,t),created:!0};if(e.resolution==="update")return{workflow:await vo(n,r,t),created:!1};if(e.resolution==="create_new"){let{id:i,...s}=t;return{workflow:await bt(n,s),created:!0}}throw new B(`A workflow named '${o.name}' already exists`,{conflictingWorkflowId:o.id,conflictingWorkflowName:o.name})}var Io,gl,ms=l(()=>{"use strict";E();jo();Io=Dt.object({workflowDefinition:Dt.unknown(),resolution:Dt.enum(["update","create_new"]).optional()}),gl=Dt.object({error:Dt.string(),conflictingWorkflowId:Dt.string(),conflictingWorkflowName:Dt.string()})});import{z as Qy}from"zod";function Xy(n){if(n.type==="loop")return"not offered as `{{stepId}}` tokens; reference inner steps. Exit conditions use `until.stepId`.";let e=wc(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 Yy(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 Zy(){return Object.keys(Dn).map(t=>{let r=Dn[t].map(o=>`\`{{subject.${o}}}\``).join(", ");return`- **${t}**: ${r}`}).join(`
|
|
24
|
+
`)}function ew(){return Object.keys(Sl).map(n=>`- **${n}**: ${Sl[n]}`).join(`
|
|
25
|
+
`)}function tw(){return zy.map(n=>`- **${Yy(n)}**: ${Xy(n)}`).join(`
|
|
26
|
+
`)}function xl(n=yr){let e=Qy.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
|
-
${
|
|
54
|
+
${Zy()}
|
|
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
|
-
${
|
|
62
|
+
${ew()}
|
|
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
|
-
${
|
|
76
|
+
${tw()}
|
|
77
77
|
|
|
78
78
|
For \`get_subject\` without \`target\`, fields depend on the workflow's \`appliesTo\` subject type(s).
|
|
79
79
|
|
|
@@ -83,12 +83,33 @@ For \`get_subject\` without \`target\`, fields depend on the workflow's \`applie
|
|
|
83
83
|
|
|
84
84
|
\`sub_workflow.workflowId\` likewise refers to a workflow that must already exist on the destination install. A dangling id after import shows the same inline mismatch warning used for missing provider instances; this file does not bundle dependencies.
|
|
85
85
|
|
|
86
|
+
### \`sub_workflow.forEach\`
|
|
87
|
+
|
|
88
|
+
- \`"selection"\` \u2014 one child Job per subject in the parent\u2019s collection. The parent Job must have \`subjectContext.mode === "collection"\`. Each child is \`mode: "single"\` with empty \`inputValues\`.
|
|
89
|
+
- \`{ "source": "stepId.field" }\` \u2014 resolve that path from the parent job context with \`getPath\` (not \`{{}}\` string interpolation, which would stringify the array). The value must be an **array**; a non-array is an error, an empty array is valid and completes the parent step immediately. Each item is used directly as that child\u2019s \`inputValues\` (shape it to the child workflow\u2019s \`inputSchema\`). The child workflow must be \`appliesTo: "none"\` \u2014 there is no subject+inputs hybrid. The parent\u2019s own \`subjectContext\` can be anything.
|
|
90
|
+
|
|
91
|
+
Zero children in either mode complete the parent \`sub_workflow\` step immediately. Do not leave the parent in \`waiting_for_children\` with nobody to wait for.
|
|
92
|
+
|
|
93
|
+
## Per-step \`condition\`
|
|
94
|
+
|
|
95
|
+
Every step type accepts an optional \`condition\` \u2014 the same two predicates as \`loop.until\` (\`field_empty\` / \`field_equals\`). When the condition **holds**, the step is skipped entirely: no provider or agent call, no human pause, no loop iteration, no sub-workflow fan-out. The \`JobStepExecution\` is recorded with \`status: "skipped"\` plus the condition and the values it evaluated against.
|
|
96
|
+
|
|
97
|
+
Referencing a skipped step's output (\`{{skipped-step-id.field}}\`) resolves to \`undefined\`, the same as any step that never ran.
|
|
98
|
+
|
|
99
|
+
Example \u2014 skip posting comments when a \`comment_review\` kept nothing:
|
|
100
|
+
|
|
101
|
+
\`\`\`json
|
|
102
|
+
"condition": { "type": "field_empty", "stepId": "review", "field": "finalComments" }
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
A confirmation gate on the following work step uses \`field_equals\` with \`value: false\` so the work is skipped when the human rejected.
|
|
106
|
+
|
|
86
107
|
## Do not rename step ids without updating references
|
|
87
108
|
|
|
88
|
-
Step \`id\`s are referenced internally via \`{{step-id}}\` templates
|
|
109
|
+
Step \`id\`s are referenced internally via \`{{step-id}}\` templates, \`loop.until.stepId\`, and \`condition.stepId\`. Renaming a step id requires updating every reference to it elsewhere in the same file, or those references will silently fail to resolve at runtime.
|
|
89
110
|
|
|
90
111
|
This risk is scoped to **future** runs of the edited workflow only. Each Job stores a \`workflowSnapshot\` \u2014 a frozen copy of the definition as it existed when that Job started \u2014 so already-run Job history is completely unaffected by later edits.
|
|
91
|
-
`}var
|
|
112
|
+
`}var Sl,zy,vl=l(()=>{"use strict";C();Sl={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."},zy=[{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 hs,Controller as nw,Delete as rw,Get as _o,Header as ow,HttpCode as iw,Inject as sw,Param as Po,Patch as aw,Post as jl,Query as cw,Res as Il}from"@nestjs/common";var Qe,T,_e,we,_l=l(()=>{"use strict";C();_t();E();ce();jo();ms();vl();Qe=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},T=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_e=function(n,e){return function(t,r){e(t,r,n)}},we=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 xl()}async importDefinition(e,t){let r=await bl(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=`${ji(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 bt(this.workflows,e)}async update(e,t){return vo(this.workflows,e,t)}async remove(e){if(!await this.workflows.get(e))throw new y(`Workflow not found: ${e}`);if(!await this.workflows.delete(e))throw new y(`Workflow not found: ${e}`)}};Qe([_o(),_e(0,cw("subjectHandling")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],we.prototype,"list",null);Qe([_o("instructions"),ow("Content-Type","text/markdown; charset=utf-8"),T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",String)],we.prototype,"instructions",null);Qe([jl("import"),_e(0,hs(new v(Io))),_e(1,Il({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[Object,Object]),T("design:returntype",Promise)],we.prototype,"importDefinition",null);Qe([_o(":id/export"),_e(0,Po("id")),_e(1,Il({passthrough:!0})),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],we.prototype,"exportDefinition",null);Qe([_o(":id"),_e(0,Po("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],we.prototype,"get",null);Qe([jl(),_e(0,hs()),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],we.prototype,"create",null);Qe([aw(":id"),_e(0,Po("id")),_e(1,hs(new v(ct))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],we.prototype,"update",null);Qe([rw(":id"),iw(204),_e(0,Po("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],we.prototype,"remove",null);we=Qe([nw("workflows"),_e(0,sw(D)),T("design:paramtypes",[D])],we)});function uw(n){return El(n.workflowDefinition.steps,"steps")}function Pl(n){let e=uw(n);if(e.length>0)throw new Error(`Workflow library entry '${n.id}' is not portable: ${e.join(", ")}`)}function El(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(...El(r.steps,`${i}.steps`))}),t}var kl=l(()=>{"use strict"});function Rl(){return structuredClone(ys)}function Al(n){let e=ys.find(t=>t.id===n);return e?structuredClone(e):void 0}var lw,pw,ys,Cl=l(()=>{"use strict";kl();lw={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"]}}},pw={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}}
|
|
92
113
|
PR title: {{subject.title}}
|
|
93
114
|
PR description: {{subject.description}}
|
|
94
115
|
|
|
@@ -98,5 +119,5 @@ Checklist: {{build-requirements-checklist}}`,outputFormat:"free_text"},{type:"sh
|
|
|
98
119
|
{{run-relevant-tests}}`,outputFormat:"free_text"},{type:"agent",name:"Generate combined review report",objective:`Combine into one markdown report: Summary, Acceptance Criteria, Findings by Role, Tests Run, Suggested PR Comments, Verdict (APPROVE/COMMENT/REQUEST_CHANGES).
|
|
99
120
|
Acceptance: {{acceptance-criteria-review}}
|
|
100
121
|
Code quality: {{code-quality-review}}
|
|
101
|
-
Testing: {{testing-review}}`,outputFormat:"free_text"}],notificationPolicy:{triggers:["on_fail","on_complete"]}}},Mi=[fg,mg];for(let n of Mi)Mu(n)});import{Controller as hg,Get as gg,Inject as wg,Param as yg,Post as bg}from"@nestjs/common";var Wi,Rt,Qu,Ht,zu=l(()=>{"use strict";St();P();Vu();Zr();Wi=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=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Qu=function(n,e){return function(t,r){e(t,r,n)}},Ht=class{workflows;constructor(e){this.workflows=e}list(){return Gu()}async add(e){let t=Ku(e);if(!t)throw new h(`Workflow library entry not found: ${e}`);let r=structuredClone(t.workflowDefinition);return delete r.id,ht(this.workflows,r)}};Wi([gg(),Rt("design:type",Function),Rt("design:paramtypes",[]),Rt("design:returntype",Array)],Ht.prototype,"list",null);Wi([bg(":id/add"),Qu(0,yg("id")),Rt("design:type",Function),Rt("design:paramtypes",[String]),Rt("design:returntype",Promise)],Ht.prototype,"add",null);Ht=Wi([hg("workflow-library"),Qu(0,wg(q)),Rt("design:paramtypes",[q])],Ht)});import{Body as Gi,Controller as Sg,Delete as xg,Get as Ki,HttpCode as vg,Inject as Hi,Param as ro,Patch as Xu,Post as jg,Query as Ig}from"@nestjs/common";var gt,$,je,Ie,Yu=l(()=>{"use strict";T();Ln();St();P();se();Xr();Jt();Ti();gt=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)},je=function(n,e){return function(t,r){e(t,r,n)}},Ie=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=re.safeParse(e);if(!t.success)throw new g(`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 g(`Unknown view id in reorder: ${i}`);t.push(s)}if(new Set(t.map(i=>i.subjectType)).size!==1)throw new g("All viewIds in a reorder request must share the same subjectType");return await this.views.reorder(e.viewIds)}async listSubjects(e){return Mr(e,this.views,this.providers)}async get(e){let t=await this.views.get(e);if(!t)throw new h(`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 h(`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 h(`SubjectView not found: ${e}`);return o}async remove(e){if(!await this.views.delete(e))throw new h(`SubjectView not found: ${e}`)}async assertBinding(e,t){let r=await this.workflows.get(e);Pu(r,e,t)}};gt([Ki(),je(0,Ig("subjectType")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ie.prototype,"list",null);gt([Xu("reorder"),je(0,Gi(new v(Qn))),$("design:type",Function),$("design:paramtypes",[Object]),$("design:returntype",Promise)],Ie.prototype,"reorder",null);gt([Ki(":id/subjects"),je(0,ro("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ie.prototype,"listSubjects",null);gt([Ki(":id"),je(0,ro("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ie.prototype,"get",null);gt([jg(),je(0,Gi(new v(Kn))),$("design:type",Function),$("design:paramtypes",[Object]),$("design:returntype",Promise)],Ie.prototype,"create",null);gt([Xu(":id"),je(0,ro("id")),je(1,Gi(new v(Vn))),$("design:type",Function),$("design:paramtypes",[String,Object]),$("design:returntype",Promise)],Ie.prototype,"update",null);gt([xg(":id"),vg(204),je(0,ro("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ie.prototype,"remove",null);Ie=gt([Sg("views"),je(0,Hi(ae)),je(1,Hi(q)),je(2,Hi(L)),$("design:paramtypes",[ae,q,L])],Ie)});import{Body as Vi,Controller as _g,Delete as Eg,Get as el,HttpCode as Pg,Inject as Zu,Param as Qi,Patch as tl,Post as kg}from"@nestjs/common";var At,N,wt,$e,nl=l(()=>{"use strict";T();Xo();St();P();se();Xr();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},N=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},wt=function(n,e){return function(t,r){e(t,r,n)}},$e=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 g(`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 h(`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 h(`WorkflowShortcut not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId);let o=await this.shortcuts.update(e,t);if(!o)throw new h(`WorkflowShortcut not found: ${e}`);return o}async remove(e){if(!await this.shortcuts.delete(e))throw new h(`WorkflowShortcut not found: ${e}`)}async assertBinding(e){let t=await this.workflows.get(e);ku(t,e)}};At([el(),N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",Promise)],$e.prototype,"list",null);At([tl("reorder"),wt(0,Vi(new v(ar))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],$e.prototype,"reorder",null);At([el(":id"),wt(0,Qi("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],$e.prototype,"get",null);At([kg(),wt(0,Vi(new v(ir))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],$e.prototype,"create",null);At([tl(":id"),wt(0,Qi("id")),wt(1,Vi(new v(sr))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],$e.prototype,"update",null);At([Eg(":id"),Pg(204),wt(0,Qi("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],$e.prototype,"remove",null);$e=At([_g("workflow-shortcuts"),wt(0,Zu(Ne)),wt(1,Zu(q)),N("design:paramtypes",[Ne,q])],$e)});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 io(n,e,t){return n.slice(t,t+e)}var zi=l(()=>{"use strict"});import{z as X}from"zod";var so,ao,co,uo,Xi=l(()=>{"use strict";so=X.object({workflowId:X.string().min(1),subjectId:X.string().min(1).optional(),inputValues:X.record(X.string(),X.unknown())}),ao=X.object({response:X.unknown()}),co=X.object({workflowId:X.string().min(1),subjectIds:X.array(X.string().min(1))}),uo=X.object({jobIds:X.array(X.string().min(1)).min(1)})});import{Body as lo,Controller as Rg,Get as es,HttpCode as rl,Inject as Yi,Param as Pn,Post as Ct,Query as We}from"@nestjs/common";import"zod";function Zi(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new g(`Invalid ${e} filter: ${n}`)}}var _e,I,D,Ag,te,ol=l(()=>{"use strict";Qr();gn();P();se();zi();Xi();Wr();_e=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},I=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},D=function(n,e){return function(t,r){e(t,r,n)}},Ag=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];te=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,c,u){if(t!=null&&t!==""&&!Ag.includes(t))throw new g(`Invalid status filter: ${t}`);let d=Zi(i,"topLevelOnly"),m=Zi(s,"terminal"),b=Zi(a,"liveWorktree"),{limit:S,offset:k}=oo(c,u),O=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...d===!0?{topLevelOnly:!0}:{},...m!==void 0?{terminal:m}:{},...b===!0?{liveWorktree:!0}:{}});return io(O,S,k)}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 h(`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){return this.runner.retryFailedStep(e)}async cancel(e){return this.runner.cancelJob(e)}};_e([es(),D(0,We("workflowId")),D(1,We("status")),D(2,We("batchId")),D(3,We("parentJobId")),D(4,We("topLevelOnly")),D(5,We("terminal")),D(6,We("liveWorktree")),D(7,We("limit")),D(8,We("offset")),I("design:type",Function),I("design:paramtypes",[String,String,String,String,String,String,String,String,String]),I("design:returntype",Promise)],te.prototype,"list",null);_e([es("queued"),I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",Array)],te.prototype,"listQueued",null);_e([Ct("latest-by-subject"),rl(200),D(0,lo(new v(co))),I("design:type",Function),I("design:paramtypes",[Object]),I("design:returntype",Promise)],te.prototype,"latestBySubject",null);_e([Ct("delete-worktrees"),rl(200),D(0,lo(new v(uo))),I("design:type",Function),I("design:paramtypes",[Object]),I("design:returntype",Promise)],te.prototype,"deleteWorktrees",null);_e([es(":id"),D(0,Pn("id")),I("design:type",Function),I("design:paramtypes",[String]),I("design:returntype",Promise)],te.prototype,"get",null);_e([Ct(),D(0,lo(new v(so))),I("design:type",Function),I("design:paramtypes",[Object]),I("design:returntype",Promise)],te.prototype,"create",null);_e([Ct(":id/resume"),D(0,Pn("id")),D(1,lo(new v(ao))),I("design:type",Function),I("design:paramtypes",[String,Object]),I("design:returntype",Promise)],te.prototype,"resume",null);_e([Ct(":id/retry"),D(0,Pn("id")),I("design:type",Function),I("design:paramtypes",[String]),I("design:returntype",Promise)],te.prototype,"retry",null);_e([Ct(":id/retry-step"),D(0,Pn("id")),I("design:type",Function),I("design:paramtypes",[String]),I("design:returntype",Promise)],te.prototype,"retryStep",null);_e([Ct(":id/cancel"),D(0,Pn("id")),I("design:type",Function),I("design:paramtypes",[String]),I("design:returntype",Promise)],te.prototype,"cancel",null);te=_e([Rg("jobs"),D(0,Yi(z)),D(1,Yi(xe)),D(2,Yi(Se)),I("design:paramtypes",[z,xe,Se])],te)});import{z as ne}from"zod";var po,fo,ts=l(()=>{"use strict";T();po=ne.discriminatedUnion("mode",[ne.object({mode:ne.literal("view"),viewId:ne.string().min(1)}),ne.object({mode:ne.literal("manual"),subjectType:re,subjectIds:ne.array(ne.string().min(1))})]),fo=ne.object({workflowId:ne.string().min(1),selection:po,triggeredBy:ne.enum(["schedule","view_bulk","multiselect"]),notificationOverride:wn.optional(),inputValues:ne.record(ne.string(),ne.unknown())})});import{Body as Cg,Controller as Tg,Get as os,Inject as ns,Param as is,Post as il,Query as rs}from"@nestjs/common";import"zod";var Gt,W,qe,He,sl=l(()=>{"use strict";Qr();Un();gn();P();se();zi();ts();Gt=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},W=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},qe=function(n,e){return function(t,r){e(t,r,n)}},He=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 io(s,o,i)}async get(e){let t=await this.batches.get(e);if(!t)throw new h(`JobBatch not found: ${e}`);return t}async listJobs(e){if(!await this.batches.get(e))throw new h(`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)}};Gt([os(),qe(0,rs("workflowId")),qe(1,rs("limit")),qe(2,rs("offset")),W("design:type",Function),W("design:paramtypes",[String,String,String]),W("design:returntype",Promise)],He.prototype,"list",null);Gt([os(":id"),qe(0,is("id")),W("design:type",Function),W("design:paramtypes",[String]),W("design:returntype",Promise)],He.prototype,"get",null);Gt([os(":id/jobs"),qe(0,is("id")),W("design:type",Function),W("design:paramtypes",[String]),W("design:returntype",Promise)],He.prototype,"listJobs",null);Gt([il(),qe(0,Cg(new v(fo))),W("design:type",Function),W("design:paramtypes",[Object]),W("design:returntype",Promise)],He.prototype,"launch",null);Gt([il(":id/cancel"),qe(0,is("id")),W("design:type",Function),W("design:paramtypes",[String]),W("design:returntype",Promise)],He.prototype,"cancel",null);He=Gt([Tg("batches"),qe(0,ns(ce)),qe(1,ns(z)),qe(2,ns(xe)),W("design:paramtypes",[ce,z,xe])],He)});import{Body as al,Controller as Og,Delete as $g,Get as cl,HttpCode as qg,Inject as Dg,Param as ss,Patch as Bg,Post as Fg,Query as Ng}from"@nestjs/common";var Kt,H,Tt,Ge,ul=l(()=>{"use strict";T();Qo();P();se();Kt=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},H=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Tt=function(n,e){return function(t,r){e(t,r,n)}},Ge=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 g(`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 h(`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 h(`Schedule not found: ${e}`);return r}async remove(e){if(!await this.schedules.delete(e))throw new h(`Schedule not found: ${e}`)}};Kt([cl(),Tt(0,Ng("enabled")),H("design:type",Function),H("design:paramtypes",[String]),H("design:returntype",Promise)],Ge.prototype,"list",null);Kt([cl(":id"),Tt(0,ss("id")),H("design:type",Function),H("design:paramtypes",[String]),H("design:returntype",Promise)],Ge.prototype,"get",null);Kt([Fg(),Tt(0,al(new v(Ft))),H("design:type",Function),H("design:paramtypes",[Object]),H("design:returntype",Promise)],Ge.prototype,"create",null);Kt([Bg(":id"),Tt(0,ss("id")),Tt(1,al(new v(Ft.partial().omit({id:!0})))),H("design:type",Function),H("design:paramtypes",[String,Object]),H("design:returntype",Promise)],Ge.prototype,"update",null);Kt([$g(":id"),qg(204),Tt(0,ss("id")),H("design:type",Function),H("design:paramtypes",[String]),H("design:returntype",Promise)],Ge.prototype,"remove",null);Ge=Kt([Og("schedules"),Tt(0,Dg(Fe)),H("design:paramtypes",[Fe])],Ge)});import{Controller as Jg,Inject as Lg,Query as ll,Sse as Ug}from"@nestjs/common";import{Observable as dl}from"rxjs";var pl,mo,as,kn,fl=l(()=>{"use strict";Fr();pl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},mo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},as=function(n,e){return function(t,r){e(t,r,n)}},kn=class{events;constructor(e){this.events=e}stream(e,t){return new dl(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()}})}};pl([Ug(),as(0,ll("jobId")),as(1,ll("batchId")),mo("design:type",Function),mo("design:paramtypes",[String,String]),mo("design:returntype",dl)],kn.prototype,"stream",null);kn=pl([Jg("events"),as(0,Lg(ye)),mo("design:paramtypes",[ye])],kn)});import{extendZodWithOpenApi as Mg}from"@asteasolutions/zod-to-openapi";import{z as Wg}from"zod";var ml=l(()=>{"use strict";Mg(Wg)});import{z as hl}from"zod";var ho,cs=l(()=>{"use strict";ho=hl.object({value:hl.string().min(1)})});import{z as Ee}from"zod";var ek,Hg,gl,wl=l(()=>{"use strict";ek=Ee.object({path:Ee.string().optional(),mode:Ee.enum(["directories","files"]).optional(),extensions:Ee.string().optional()}),Hg=Ee.object({name:Ee.string().min(1),path:Ee.string().min(1),isDirectory:Ee.boolean()}),gl=Ee.object({path:Ee.string().min(1),entries:Ee.array(Hg)})});import{z as p}from"zod";function dw(n){let e=p.toJSONSchema(n),{$schema:t,...r}=e;return r}function bl(n){let e=(t,r)=>n.registerComponent("schemas",t,dw(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",yn),WorkflowDefinitionInput:e("WorkflowDefinitionInput",it),UpdateWorkflowBody:e("UpdateWorkflowBody",ow),SubjectView:e("SubjectView",Gn),CreateSubjectViewBody:e("CreateSubjectViewBody",Kn),ReorderViewsBody:e("ReorderViewsBody",Qn),UpdateViewBody:e("UpdateViewBody",sw),WorkflowShortcut:e("WorkflowShortcut",or),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",ir),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",sr),ReorderShortcutsBody:e("ReorderShortcutsBody",ar),Schedule:e("Schedule",Ft),UpdateScheduleBody:e("UpdateScheduleBody",aw),EngineSettings:e("EngineSettings",ur),UpdateSettingsBody:e("UpdateSettingsBody",uw),SettingsPatchResponse:e("SettingsPatchResponse",pw),ProviderInstanceConfig:e("ProviderInstanceConfig",cr),CreateProviderInstanceBody:e("CreateProviderInstanceBody",pr),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",dr),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",lw),SetSecretBody:e("SetSecretBody",ho),CreateJobBody:e("CreateJobBody",so),ResumeJobBody:e("ResumeJobBody",ao),LatestBySubjectBody:e("LatestBySubjectBody",co),LatestBySubjectResponse:e("LatestBySubjectResponse",cw),LaunchBody:e("LaunchBody",fo),Job:e("Job",us),QueuedAgentStep:e("QueuedAgentStep",Yg),JobBatch:e("JobBatch",yl),LaunchResponse:e("LaunchResponse",Zg),HealthResponse:e("HealthResponse",ew),ProviderStatus:e("ProviderStatus",tw),QueryTemplate:e("QueryTemplate",ga),ProviderActionDescriptor:e("ProviderActionDescriptor",wa),PreviewModelsBody:e("PreviewModelsBody",fr),PreviewModel:e("PreviewModel",ic),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",Hn),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",ya),ErrorResponse:e("ErrorResponse",nw),EngineEvent:e("EngineEvent",rw),Subject:e("Subject",go),WorkflowLibraryEntry:e("WorkflowLibraryEntry",iw),ContextFile:e("ContextFile",Yn),CreateContextFileBody:e("CreateContextFileBody",Zn),UpdateContextFileBody:e("UpdateContextFileBody",er),LocalRepository:e("LocalRepository",tr),CreateLocalRepositoryBody:e("CreateLocalRepositoryBody",nr),UpdateLocalRepositoryBody:e("UpdateLocalRepositoryBody",rr),DeleteWorktreesBody:e("DeleteWorktreesBody",uo),FilesystemBrowseResult:e("FilesystemBrowseResult",gl),ImportWorkflowBody:e("ImportWorkflowBody",eo),ImportConflictResponse:e("ImportConflictResponse",qu)}}var Gg,Kg,Vg,Qg,go,zg,Xg,Yg,us,yl,Zg,ew,tw,nw,rw,ow,iw,sw,aw,cw,uw,lw,pw,E,ls,ps=l(()=>{"use strict";ml();T();Xi();ts();cs();wl();Li();Gg=p.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),Kg=p.object({subjectType:p.literal("ticket"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),status:p.string(),assignee:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Vg=p.object({subjectType:p.literal("pull_request"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),sourceBranch:p.string(),targetBranch:p.string(),author:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Qg=p.object({subjectType:p.literal("documentation"),id:p.string(),source:p.string().min(1),title:p.string(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),go=p.discriminatedUnion("subjectType",[Kg,Vg,Qg]),zg=p.discriminatedUnion("mode",[p.object({mode:p.literal("single"),subject:go}),p.object({mode:p.literal("collection"),subjects:p.array(go)})]),Xg=p.object({id:p.string(),stepDefinitionId:p.string(),type:p.string(),status:p.enum(["pending","queued","running","waiting_for_children","completed","failed","skipped"]),startedAt:p.string().optional(),completedAt:p.string().optional(),output:p.unknown().optional(),error:p.string().optional(),childJobIds:p.array(p.string()).optional(),iterations:p.array(p.object({index:p.number().int(),stepExecutions:p.array(p.record(p.string(),p.unknown())),startedAt:p.string(),completedAt:p.string().optional()})).optional()}),Yg=p.object({jobId:p.string(),stepExecutionId:p.string(),agentInstanceId:p.string(),enqueuedAt:p.string()}),us=p.object({id:p.string(),workflowId:p.string(),status:Gg,subjectContext:zg.optional(),selection:po.optional(),batchId:p.string().optional(),parentJobId:p.string().optional(),parentStepExecutionId:p.string().optional(),fanOutIndex:p.number().int().optional(),retryOf:p.string().optional(),workflowSnapshot:yn.optional(),context:p.record(p.string(),p.unknown()),worktreePath:p.string().optional(),branch:p.string().optional(),worktreeDeletedAt:p.string().optional(),currentStepId:p.string().optional(),currentStepExecutionId:p.string().optional(),stepHistory:p.array(Xg),createdAt:p.string(),updatedAt:p.string(),completedAt:p.string().optional()}),yl=p.object({id:p.string(),workflowId:p.string(),selection:po,resolvedSubjects:p.array(go),jobIds:p.array(p.string()),status:p.enum(["running","completed","completed_with_issues","failed","cancelled"]),triggeredBy:p.enum(["schedule","view_bulk","multiselect"]),scheduleId:p.string().optional(),notificationOverride:wn.optional(),notificationSent:p.boolean(),createdAt:p.string(),completedAt:p.string().optional()}),Zg=p.discriminatedUnion("kind",[p.object({kind:p.literal("job"),job:us}),p.object({kind:p.literal("batch"),batch:yl})]),ew=p.object({ok:p.boolean(),service:p.string(),timestamp:p.string()}),tw=p.object({providerId:p.string(),secretKey:p.string(),configured:p.boolean()}),nw=p.object({error:p.string()}),rw=p.object({type:p.string(),timestamp:p.string()}).passthrough(),ow=it,iw=p.object({id:p.string().min(1),source:p.enum(["example","community","official"]),name:p.string().min(1),description:p.string(),workflowDefinition:it}),sw=Vn,aw=Ft.partial().omit({id:!0}),cw=p.record(p.string(),us.nullable()),uw=lr,lw=p.object({settings:ur,restartRequired:p.literal(!0)}),pw=p.object({settings:ur,restartRequired:p.boolean()}),E=p.object({id:p.string().min(1)}),ls=p.object({limit:p.string().optional().openapi({description:"Max items to return (default 50)"}),offset:p.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as j}from"zod";function w(n,e){return{description:e,content:{"application/json":{schema:n}}}}function B(n){return{type:"array",items:n}}function y(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 Sl(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:j.object({subjectHandling:j.enum(["per-subject","collection"]).optional()})},responses:{200:w(B(e.WorkflowDefinition),"Workflow definitions"),...y(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"),...y(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:E},responses:{200:w(e.WorkflowDefinition,"Workflow definition"),...y(e,404)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:E},responses:{200:w(e.WorkflowDefinition,"Workflow definition"),...y(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"),...y(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:w(e.WorkflowDefinition,"Updated workflow definition"),...y(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:E},responses:{204:{description:"Workflow deleted"},...y(e,404)}}),n.registerPath({method:"get",path:"/workflow-library",tags:["Workflow Library"],summary:"List bundled workflow library entries",responses:{200:w(B(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:E},responses:{201:w(e.WorkflowDefinition,"Created workflow definition"),...y(e,400,404)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:j.object({subjectType:re.optional()})},responses:{200:w(B(e.SubjectView),"Subject views"),...y(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:E},responses:{200:w(e.SubjectView,"Subject view"),...y(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:E},responses:{200:w(B(e.Subject),"Matching subjects"),...y(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(B(e.SubjectView),"Reordered views for the subject type"),...y(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"),...y(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:w(e.SubjectView,"Updated subject view"),...y(e,400,404)}}),n.registerPath({method:"delete",path:"/views/{id}",tags:["Views"],summary:"Delete a subject view",request:{params:E},responses:{204:{description:"Subject view deleted"},...y(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:ls.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:w(B(e.Job),"Jobs"),...y(e,400)}}),n.registerPath({method:"get",path:"/jobs/queued",tags:["Jobs"],summary:"List agent steps waiting for a concurrency slot",responses:{200:w(B(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:w(B(e.Job),"Jobs after worktree deletion"),...y(e,400,404,409)}}),n.registerPath({method:"get",path:"/jobs/{id}",tags:["Jobs"],summary:"Get a job",request:{params:E},responses:{200:w(e.Job,"Job"),...y(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"),...y(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"),...y(e,400)}}),n.registerPath({method:"post",path:"/jobs/{id}/resume",tags:["Jobs"],summary:"Resume a job waiting for human input",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:w(e.Job,"Resumed job"),...y(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:E},responses:{200:w(e.Job,"Retry job"),...y(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:E},responses:{200:w(e.Job,"Job after retrying the failed step"),...y(e,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/cancel",tags:["Jobs"],summary:"Cancel a non-terminal job",request:{params:E},responses:{200:w(e.Job,"Cancelled job"),...y(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:ls.extend({workflowId:j.string().optional()})},responses:{200:w(B(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:E},responses:{200:w(e.JobBatch,"Job batch"),...y(e,404)}}),n.registerPath({method:"get",path:"/batches/{id}/jobs",tags:["Batches"],summary:"List jobs in a batch",request:{params:E},responses:{200:w(B(e.Job),"Jobs in the batch"),...y(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"),...y(e,400,404)}}),n.registerPath({method:"post",path:"/batches/{id}/cancel",tags:["Batches"],summary:"Cancel a running job batch",request:{params:E},responses:{200:w(e.JobBatch,"Cancelled batch"),...y(e,404,409)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:w(B(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:E},responses:{200:w(e.WorkflowShortcut,"Workflow shortcut"),...y(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"),...y(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(B(e.WorkflowShortcut),"Reordered workflow shortcuts"),...y(e,400)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Update a workflow shortcut",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:w(e.WorkflowShortcut,"Updated workflow shortcut"),...y(e,400,404)}}),n.registerPath({method:"delete",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Delete a workflow shortcut",request:{params:E},responses:{204:{description:"Workflow shortcut deleted"},...y(e,404)}}),n.registerPath({method:"get",path:"/context-files",tags:["Context Files"],summary:"List context files",responses:{200:w(B(e.ContextFile),"Context files")}}),n.registerPath({method:"get",path:"/context-files/{id}",tags:["Context Files"],summary:"Get a context file",request:{params:E},responses:{200:w(e.ContextFile,"Context file"),...y(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"),...y(e,400)}}),n.registerPath({method:"patch",path:"/context-files/{id}",tags:["Context Files"],summary:"Update a context file",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateContextFileBody}}}},responses:{200:w(e.ContextFile,"Updated context file"),...y(e,400,404)}}),n.registerPath({method:"delete",path:"/context-files/{id}",tags:["Context Files"],summary:"Delete a context file",request:{params:E},responses:{204:{description:"Context file deleted"},...y(e,404)}}),n.registerPath({method:"get",path:"/local-repositories",tags:["Local Repositories"],summary:"List local repositories",responses:{200:w(B(e.LocalRepository),"Local repositories")}}),n.registerPath({method:"get",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Get a local repository",request:{params:E},responses:{200:w(e.LocalRepository,"Local repository"),...y(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"),...y(e,400)}}),n.registerPath({method:"patch",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Update a local repository",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateLocalRepositoryBody}}}},responses:{200:w(e.LocalRepository,"Updated local repository"),...y(e,400,404)}}),n.registerPath({method:"delete",path:"/local-repositories/{id}",tags:["Local Repositories"],summary:"Delete a local repository",request:{params:E},responses:{204:{description:"Local repository deleted"},...y(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:w(e.FilesystemBrowseResult,"Directory listing"),...y(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:w(B(e.Schedule),"Schedules"),...y(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:E},responses:{200:w(e.Schedule,"Schedule"),...y(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"),...y(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:E,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:w(e.Schedule,"Updated schedule"),...y(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:E},responses:{204:{description:"Schedule deleted"},...y(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(B(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(B(e.PreviewModel),"Models available to the key"),...y(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:w(B(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:w(B(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:w(e.ResolveQueryTemplateResponse,"Resolved query"),...y(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"),...y(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:w(B(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"),...y(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:w(e.ProviderInstanceConfig,"Provider instance"),...y(e,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:w(e.ProviderInstanceMutationResponse,"Updated instance settings"),...y(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:w(e.ProviderInstanceMutationResponse,"Updated settings after delete"),...y(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"},...y(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 xl=l(()=>{"use strict";T();ps()});import{OpenAPIRegistry as fw,OpenApiGeneratorV31 as mw}from"@asteasolutions/zod-to-openapi";function vl(){if(wo)return wo;let n=new fw,e=bl(n);return Sl(n,e),wo=new mw(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"}]}),wo}var wo,jl=l(()=>{"use strict";ps();xl()});import{Controller as hw,Get as gw,Header as ww}from"@nestjs/common";var Il,ds,Rn,_l=l(()=>{"use strict";jl();Il=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},ds=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Rn=class{getOpenApiDocument(){return vl()}};Il([gw("openapi.json"),ww("Content-Type","application/json"),ds("design:type",Function),ds("design:paramtypes",[]),ds("design:returntype",void 0)],Rn.prototype,"getOpenApiDocument",null);Rn=Il([hw()],Rn)});import{Controller as yw,Get as fs,Inject as yo,Param as bo,Post as El,Body as Pl,HttpCode as kl}from"@nestjs/common";var Vt,G,De,Ke,Rl=l(()=>{"use strict";si();wi();yi();xi();T();se();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},G=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},De=function(n,e){return function(t,r){e(t,r,n)}},Ke=class{providerStatus;queryTemplates;extendedActions;previewModels;constructor(e,t,r,o){this.providerStatus=e,this.queryTemplates=t,this.extendedActions=r,this.previewModels=o}async status(){return this.providerStatus.list()}previewAvailableModels(e){return this.previewModels.preview(e)}listQueryTemplates(e){return this.queryTemplates.list(e)}listExtendedActions(e){return this.extendedActions.list(e)}async resolveQueryTemplate(e,t,r){return{query:await this.queryTemplates.resolve(e,t,r.params)}}};Vt([fs("status"),G("design:type",Function),G("design:paramtypes",[]),G("design:returntype",Promise)],Ke.prototype,"status",null);Vt([El("preview-models"),kl(200),De(0,Pl(new v(fr))),G("design:type",Function),G("design:paramtypes",[Object]),G("design:returntype",Promise)],Ke.prototype,"previewAvailableModels",null);Vt([fs(":providerId/query-templates"),De(0,bo("providerId")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Ke.prototype,"listQueryTemplates",null);Vt([fs(":providerId/actions"),De(0,bo("providerId")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Ke.prototype,"listExtendedActions",null);Vt([El(":providerId/query-templates/:templateId/resolve"),kl(200),De(0,bo("providerId")),De(1,bo("templateId")),De(2,Pl(new v(Hn))),G("design:type",Function),G("design:paramtypes",[String,String,Object]),G("design:returntype",Promise)],Ke.prototype,"resolveQueryTemplate",null);Ke=Vt([yw("providers"),De(0,yo(st)),De(1,yo(at)),De(2,yo(ct)),De(3,yo(ut)),G("design:paramtypes",[st,at,ct,ut])],Ke)});import{Body as bw,Controller as Sw,Get as xw,Inject as vw,Patch as jw}from"@nestjs/common";var ms,Ot,Al,Qt,Cl=l(()=>{"use strict";T();we();se();ms=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},Ot=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Al=function(n,e){return function(t,r){e(t,r,n)}},Qt=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:dc(e)}}};ms([xw(),Ot("design:type",Function),Ot("design:paramtypes",[]),Ot("design:returntype",Promise)],Qt.prototype,"get",null);ms([jw(),Al(0,bw(new v(lr))),Ot("design:type",Function),Ot("design:paramtypes",[Object]),Ot("design:returntype",Promise)],Qt.prototype,"update",null);Qt=ms([Sw("settings"),Al(0,vw(_)),Ot("design:paramtypes",[_])],Qt)});function hs(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return Te(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 Tl(n){let{defaultAgent:e,...t}=n;return t}var Ol=l(()=>{"use strict";T()});import{Body as $l,Controller as Iw,Delete as _w,Get as ql,HttpCode as Ew,Inject as Pw,Param as gs,Patch as kw,Post as Rw}from"@nestjs/common";var Xt,K,zt,Ve,Dl=l(()=>{"use strict";T();we();P();se();Ol();Xt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},K=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)}},Ve=class{settings;constructor(e){this.settings=e}async list(){return(await this.settings.get()).providerInstances??[]}async get(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new h(`Provider instance not found: ${e}`);return t}async create(e){let t=Tl(e),r=await this.settings.get(),o=[...r.providerInstances??[]];if(o.some(s=>s.id===t.id))throw new F(`Provider instance already exists: ${t.id}`);return o.push(t),{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:hs({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(u=>u.id===e);if(i<0)throw new h(`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:hs({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 h(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};Xt([ql(),K("design:type",Function),K("design:paramtypes",[]),K("design:returntype",Promise)],Ve.prototype,"list",null);Xt([ql(":id"),zt(0,gs("id")),K("design:type",Function),K("design:paramtypes",[String]),K("design:returntype",Promise)],Ve.prototype,"get",null);Xt([Rw(),zt(0,$l(new v(pr))),K("design:type",Function),K("design:paramtypes",[Object]),K("design:returntype",Promise)],Ve.prototype,"create",null);Xt([kw(":id"),zt(0,gs("id")),zt(1,$l(new v(dr))),K("design:type",Function),K("design:paramtypes",[String,Object]),K("design:returntype",Promise)],Ve.prototype,"update",null);Xt([_w(":id"),Ew(200),zt(0,gs("id")),K("design:type",Function),K("design:paramtypes",[String]),K("design:returntype",Promise)],Ve.prototype,"remove",null);Ve=Xt([Iw("provider-instances"),zt(0,Pw(_)),K("design:paramtypes",[_])],Ve)});import{Body as Aw,Controller as Cw,HttpCode as Tw,Inject as Ow,Param as $w,Post as qw}from"@nestjs/common";var Bl,So,ws,An,Fl=l(()=>{"use strict";Be();P();se();cs();Bl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},So=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ws=function(n,e){return function(t,r){e(t,r,n)}},An=class{secrets;constructor(e){this.secrets=e}async set(e,t){let r=e.trim();if(!r)throw new g("Secret key must not be empty");await this.secrets.set(r,t.value)}};Bl([qw(":key"),Tw(204),ws(0,$w("key")),ws(1,Aw(new v(ho))),So("design:type",Function),So("design:paramtypes",[String,Object]),So("design:returntype",Promise)],An.prototype,"set",null);An=Bl([Cw("secrets"),ws(0,Ow(me)),So("design:paramtypes",[Function])],An)});import{readFile as Dw}from"node:fs/promises";async function ys(n){try{await Dw(n,"utf8")}catch(e){let t=e instanceof Error?e.message:String(e);throw new g(`Cannot read context file at '${n}': ${t}`)}}var Nl=l(()=>{"use strict";P()});import{Body as Jl,Controller as Bw,Delete as Fw,Get as Ll,HttpCode as Nw,Inject as Jw,Param as bs,Patch as Lw,Post as Uw}from"@nestjs/common";import{randomUUID as Mw}from"node:crypto";var Zt,V,Yt,Qe,Ul=l(()=>{"use strict";T();Mn();P();se();Nl();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},V=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Yt=function(n,e){return function(t,r){e(t,r,n)}},Qe=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 h(`Context file not found: ${e}`);return t}async create(e){return await ys(e.path),this.files.create({id:e.id??Mw(),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 h(`Context file not found: ${e}`);let o=t.path??r.path;await ys(o);let i=await this.files.update(e,t);if(!i)throw new h(`Context file not found: ${e}`);return i}async remove(e){if(!await this.files.delete(e))throw new h(`Context file not found: ${e}`)}};Zt([Ll(),V("design:type",Function),V("design:paramtypes",[]),V("design:returntype",Promise)],Qe.prototype,"list",null);Zt([Ll(":id"),Yt(0,bs("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Qe.prototype,"get",null);Zt([Uw(),Yt(0,Jl(new v(Zn))),V("design:type",Function),V("design:paramtypes",[Object]),V("design:returntype",Promise)],Qe.prototype,"create",null);Zt([Lw(":id"),Yt(0,bs("id")),Yt(1,Jl(new v(er))),V("design:type",Function),V("design:paramtypes",[String,Object]),V("design:returntype",Promise)],Qe.prototype,"update",null);Zt([Fw(":id"),Nw(204),Yt(0,bs("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Qe.prototype,"remove",null);Qe=Zt([Bw("context-files"),Yt(0,Jw(ue)),V("design:paramtypes",[ue])],Qe)});import{execFile as Ww}from"node:child_process";import{stat as Hw}from"node:fs/promises";import{resolve as Ss}from"node:path";import{promisify as Gw}from"node:util";async function xs(n){let e=Ss(n);try{if((await Kw("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 g(`'${n}' is not a git repository: ${r}`)}}async function vs(n,e){let t=Ss(n),r=Ss(e?.trim()?e.trim():Hr(t));if(Gr(t,r))throw new g(`Worktree base '${r}' must not be inside the repository at '${t}'`);try{if(!(await Hw(r)).isDirectory())throw new g(`Worktree base '${r}' exists and is not a directory`)}catch(o){if(o instanceof g)throw o}}var Kw,Ml=l(()=>{"use strict";P();qi();Kw=Gw(Ww)});import{Body as Wl,Controller as Vw,Delete as Qw,Get as Hl,HttpCode as zw,Inject as Xw,Param as js,Patch as Yw,Post as Zw}from"@nestjs/common";import{randomUUID as ey}from"node:crypto";var tn,Q,en,ze,Gl=l(()=>{"use strict";T();Wn();P();se();Ml();tn=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)},en=function(n,e){return function(t,r){e(t,r,n)}},ze=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 h(`Local repository not found: ${e}`);return t}async create(e){return await xs(e.localPath),await vs(e.localPath,e.worktreeBasePath),this.repos.create({id:e.id??ey(),name:e.name,localPath:e.localPath,...e.worktreeBasePath?{worktreeBasePath:e.worktreeBasePath}:{}})}async update(e,t){let r=await this.repos.get(e);if(!r)throw new h(`Local repository not found: ${e}`);let o=t.localPath??r.localPath,i=t.worktreeBasePath!==void 0?t.worktreeBasePath:r.worktreeBasePath;await xs(o),await vs(o,i);let s=await this.repos.update(e,t);if(!s)throw new h(`Local repository not found: ${e}`);return s}async remove(e){if(!await this.repos.delete(e))throw new h(`Local repository not found: ${e}`)}};tn([Hl(),Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",Promise)],ze.prototype,"list",null);tn([Hl(":id"),en(0,js("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],ze.prototype,"get",null);tn([Zw(),en(0,Wl(new v(nr))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],ze.prototype,"create",null);tn([Yw(":id"),en(0,js("id")),en(1,Wl(new v(rr))),Q("design:type",Function),Q("design:paramtypes",[String,Object]),Q("design:returntype",Promise)],ze.prototype,"update",null);tn([Qw(":id"),zw(204),en(0,js("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],ze.prototype,"remove",null);ze=tn([Vw("local-repositories"),en(0,Xw(le)),Q("design:paramtypes",[le])],ze)});import{readdir as ty,stat as ny}from"node:fs/promises";import{homedir as ry}from"node:os";import{join as oy,resolve as iy}from"node:path";async function Kl(n,e={}){let t=n?.trim()?n.trim():ry(),r=iy(t),o;try{o=await ny(r)}catch(s){throw new g(`Cannot browse '${r}': ${s instanceof Error?s.message:String(s)}`)}if(!o.isDirectory())throw new g(`Cannot browse '${r}': not a directory`);let i;try{i=(await ty(r,{encoding:"utf8",withFileTypes:!0})).filter(a=>a.name!=="."&&a.name!=="..").map(a=>({name:a.name,path:oy(r,a.name),isDirectory:a.isDirectory()})).filter(a=>sy(a,e)).sort((a,c)=>a.isDirectory!==c.isDirectory?a.isDirectory?-1:1:a.name.localeCompare(c.name))}catch(s){throw new g(`Cannot browse '${r}': ${s instanceof Error?s.message:String(s)}`)}return{path:r,entries:i}}function Vl(n){if(n==null||n.trim()==="")return;let e=n.split(",").map(t=>zl(t)).filter(t=>t!=null);return e.length>0?e:void 0}function Ql(n){if(!(n==null||n.trim()==="")){if(n==="directories"||n==="files")return n;throw new g(`Invalid browse mode '${n}'`)}}function sy(n,e){if(e.mode==="directories")return n.isDirectory;if(n.isDirectory)return!0;let t=e.extensions?.map(o=>zl(o)).filter(Boolean);if(!t?.length)return!0;let r=n.name.toLowerCase();return t.some(o=>r.endsWith(o))}function zl(n){let e=n.trim().toLowerCase();if(e.length!==0)return e.startsWith(".")?e:`.${e}`}var Xl=l(()=>{"use strict";P()});import{Controller as ay,Get as cy,Query as Es}from"@nestjs/common";var Yl,Is,_s,Cn,Zl=l(()=>{"use strict";Xl();Yl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Is=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_s=function(n,e){return function(t,r){e(t,r,n)}},Cn=class{async browse(e,t,r){return Kl(e,{mode:Ql(t),extensions:Vl(r)})}};Yl([cy("browse"),_s(0,Es("path")),_s(1,Es("mode")),_s(2,Es("extensions")),Is("design:type",Function),Is("design:paramtypes",[String,String,String]),Is("design:returntype",Promise)],Cn.prototype,"browse",null);Cn=Yl([ay("filesystem")],Cn)});import{Module as ly}from"@nestjs/common";import{APP_FILTER as py}from"@nestjs/core";var uy,xo,ep=l(()=>{"use strict";xn();Ni();Nr();Eu();Uu();zu();Yu();nl();ol();sl();ul();fl();_l();Rl();Cl();Dl();Fl();Ul();Gl();Zl();Br();$o();uy=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},xo=class{};xo=uy([ly({imports:[Oe,Wt,pt,lt,qt],controllers:[fe,Ht,Ie,$e,te,He,Ge,kn,Rn,Ke,Qt,Ve,An,Qe,ze,Cn],providers:[{provide:py,useClass:zr}]})],xo)});import{Module as fy}from"@nestjs/common";var dy,vo,tp=l(()=>{"use strict";As();Cs();Ts();Br();Nr();xn();Ni();ep();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},vo=class{};vo=dy([fy({imports:[Tn,On,lt,pt,Oe,Wt,xo],controllers:[nn]})],vo)});import{apiReference as my}from"@scalar/nestjs-api-reference";function np(n){n.use("/api/docs",my({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var rp=l(()=>{"use strict"});import{createServer as hy}from"node:net";function op(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function Ps(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await gy(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function gy(n){return new Promise(e=>{let t=hy();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var ip=l(()=>{"use strict"});import{Catch as by,HttpStatus as jo,NotFoundException as Sy}from"@nestjs/common";import{existsSync as sp,statSync as xy}from"node:fs";import{extname as ap,join as ks,normalize as vy,relative as jy,sep as Iy}from"node:path";function cp(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=_y(e.path??"/");if(o){let i=ks(n,o);if(Ey(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(up(e)){lp(t,n,i=>{i&&!t.headersSent&&t.status(jo.NOT_FOUND).end()});return}t.status(jo.NOT_FOUND).end()}}function up(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=ap(e);return!(t&&t!==".html")}function lp(n,e,t){n.sendFile("index.html",{root:e},t)}function _y(n){if(n==="/"||n==="")return"index.html";let e=vy(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!ap(e)?null:e}function Ey(n,e){if(!sp(e))return!1;try{if(!xy(e).isFile())return!1}catch{return!1}let t=jy(n,e);return t!==""&&!t.startsWith(`..${Iy}`)&&!t.startsWith("..")}function pp(n){return ks(n,"index.html")}var wy,yy,Io,dp=l(()=>{"use strict";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},yy=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Io=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(up(o)&&sp(ks(this.staticRoot,"index.html"))){lp(i,this.staticRoot,c=>{c&&!i.headersSent&&i.status(jo.NOT_FOUND).json({statusCode:jo.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)}};Io=wy([by(Sy),yy("design:paramtypes",[String])],Io)});import{existsSync as Py}from"node:fs";import{dirname as ky,join as _o}from"node:path";import{fileURLToPath as Ry}from"node:url";function fp(){let n=ky(Ry(import.meta.url)),e=[_o(n,"../static"),_o(n,"../../static"),_o(n,"static")];for(let t of e)if(Py(_o(t,"index.html")))return t;return null}var mp=l(()=>{"use strict"});var $y={};import"reflect-metadata";import{existsSync as Ay}from"node:fs";import{Logger as Cy}from"@nestjs/common";import{NestFactory as Ty}from"@nestjs/core";async function Oy(){let n=await Ty.create(vo);n.enableCors(),n.setGlobalPrefix("api"),np(n);let e=fp(),t=e?pp(e):null;e&&t&&Ay(t)?(Eo.log(`Serving UI from ${e}`),n.use(cp(e)),n.useGlobalFilters(new Io(e))):Eo.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 Ps(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?Eo.warn(`Port ${r} is in use; listening on ${o} instead`):Eo.log(`Listening on http://localhost:${o}`);return}catch(s){if(!op(s))throw s;o=await Ps(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var Eo,hp=l(()=>{"use strict";tp();rp();ip();dp();mp();Eo=new Cy("Bootstrap");Oy()});import{readFileSync as qy}from"node:fs";function Dy(){let n=qy(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var Po=process.argv.slice(2);Po.includes("--version")||Po.includes("-v")?console.log(Dy()):Po.includes("--help")||Po.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(`
|
|
102
|
-
`)):await Promise.resolve().then(()=>(
|
|
122
|
+
Testing: {{testing-review}}`,outputFormat:"free_text"}],notificationPolicy:{triggers:["on_fail","on_complete"]}}},ys=[lw,pw];for(let n of ys)Pl(n)});import{Controller as dw,Get as fw,Inject as mw,Param as hw,Post as yw}from"@nestjs/common";var ws,Bt,Tl,pn,Ol=l(()=>{"use strict";_t();E();Cl();jo();ws=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=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)}},pn=class{workflows;constructor(e){this.workflows=e}list(){return Rl()}async add(e){let t=Al(e);if(!t)throw new y(`Workflow library entry not found: ${e}`);let r=structuredClone(t.workflowDefinition);return delete r.id,bt(this.workflows,r)}};ws([fw(),Bt("design:type",Function),Bt("design:paramtypes",[]),Bt("design:returntype",Array)],pn.prototype,"list",null);ws([yw(":id/add"),Tl(0,hw("id")),Bt("design:type",Function),Bt("design:paramtypes",[String]),Bt("design:returntype",Promise)],pn.prototype,"add",null);pn=ws([dw("workflow-library"),Tl(0,mw(D)),Bt("design:paramtypes",[D])],pn)});import{Body as bs,Controller as ww,Delete as gw,Get as Ss,HttpCode as bw,Inject as gs,Param as Eo,Patch as $l,Post as Sw,Query as xw}from"@nestjs/common";var St,$,Pe,Ee,ql=l(()=>{"use strict";C();sr();_t();E();ce();xo();sn();ss();St=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},$=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 po(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);ll(r,e,t)}};St([Ss(),Pe(0,xw("subjectType")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ee.prototype,"list",null);St([$l("reorder"),Pe(0,bs(new v(mr))),$("design:type",Function),$("design:paramtypes",[Object]),$("design:returntype",Promise)],Ee.prototype,"reorder",null);St([Ss(":id/subjects"),Pe(0,Eo("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ee.prototype,"listSubjects",null);St([Ss(":id"),Pe(0,Eo("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ee.prototype,"get",null);St([Sw(),Pe(0,bs(new v(dr))),$("design:type",Function),$("design:paramtypes",[Object]),$("design:returntype",Promise)],Ee.prototype,"create",null);St([$l(":id"),Pe(0,Eo("id")),Pe(1,bs(new v(fr))),$("design:type",Function),$("design:paramtypes",[String,Object]),$("design:returntype",Promise)],Ee.prototype,"update",null);St([gw(":id"),bw(204),Pe(0,Eo("id")),$("design:type",Function),$("design:paramtypes",[String]),$("design:returntype",Promise)],Ee.prototype,"remove",null);Ee=St([ww("views"),Pe(0,gs(le)),Pe(1,gs(D)),Pe(2,gs(U)),$("design:paramtypes",[le,D,U])],Ee)});import{Body as xs,Controller as vw,Delete as jw,Get as Bl,HttpCode as Iw,Inject as Dl,Param as vs,Patch as Fl,Post as _w}from"@nestjs/common";var Ft,N,xt,Je,Nl=l(()=>{"use strict";C();Si();_t();E();ce();xo();Ft=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)},xt=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);pl(t,e)}};Ft([Bl(),N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",Promise)],Je.prototype,"list",null);Ft([Fl("reorder"),xt(0,xs(new v(Er))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Je.prototype,"reorder",null);Ft([Bl(":id"),xt(0,vs("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Je.prototype,"get",null);Ft([_w(),xt(0,xs(new v(_r))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Je.prototype,"create",null);Ft([Fl(":id"),xt(0,vs("id")),xt(1,xs(new v(Pr))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],Je.prototype,"update",null);Ft([jw(":id"),Iw(204),xt(0,vs("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Je.prototype,"remove",null);Je=Ft([vw("workflow-shortcuts"),xt(0,Dl(He)),xt(1,Dl(D)),N("design:paramtypes",[He,D])],Je)});function ko(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 Ro(n,e,t){return n.slice(t,t+e)}var js=l(()=>{"use strict"});import{z as J}from"zod";var Ao,Co,To,Oo,$o,Is=l(()=>{"use strict";Ao=J.object({workflowId:J.string().min(1),subjectId:J.string().min(1).optional(),inputValues:J.record(J.string(),J.unknown())}),Co=J.object({response:J.unknown()}),To=J.object({workflowId:J.string().min(1),subjectIds:J.array(J.string().min(1))}),Oo=J.object({jobIds:J.array(J.string().min(1)).min(1)}),$o=J.object({overrideParams:J.record(J.string(),J.unknown()).optional()})});import{Body as Hn,Controller as Pw,Get as Es,HttpCode as Jl,Inject as _s,Param as Kn,Post as Nt,Query as ze}from"@nestjs/common";import"zod";function Ps(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var ke,P,q,Ew,ne,Ll=l(()=>{"use strict";bo();On();E();ce();js();Is();fo();ke=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},P=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)}},Ew=["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!==""&&!Ew.includes(t))throw new h(`Invalid status filter: ${t}`);let d=Ps(i,"topLevelOnly"),m=Ps(s,"terminal"),g=Ps(a,"liveWorktree"),{limit:x,offset:R}=ko(u,c),_=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...d===!0?{topLevelOnly:!0}:{},...m!==void 0?{terminal:m}:{},...g===!0?{liveWorktree:!0}:{}});return Ro(_,x,R)}listQueued(){return this.agentGate.listQueued()}async latestBySubject(e){return this.jobs.latestBySubject(e.workflowId,e.subjectIds)}async deleteWorktrees(e){return this.runner.deleteWorktrees(e.jobIds)}async get(e){let t=await this.jobs.get(e);if(!t)throw new y(`Job not found: ${e}`);return t}async create(e){return this.runner.start({workflowId:e.workflowId,...e.subjectId?{subjectId:e.subjectId}:{},inputValues:e.inputValues})}async resume(e,t){return this.runner.resume(e,t.response)}async retry(e){return this.runner.retryFailedJob(e)}async retryStep(e,t){return this.runner.retryFailedStep(e,t.overrideParams)}async cancel(e){return this.runner.cancelJob(e)}};ke([Es(),q(0,ze("workflowId")),q(1,ze("status")),q(2,ze("batchId")),q(3,ze("parentJobId")),q(4,ze("topLevelOnly")),q(5,ze("terminal")),q(6,ze("liveWorktree")),q(7,ze("limit")),q(8,ze("offset")),P("design:type",Function),P("design:paramtypes",[String,String,String,String,String,String,String,String,String]),P("design:returntype",Promise)],ne.prototype,"list",null);ke([Es("queued"),P("design:type",Function),P("design:paramtypes",[]),P("design:returntype",Array)],ne.prototype,"listQueued",null);ke([Nt("latest-by-subject"),Jl(200),q(0,Hn(new v(To))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],ne.prototype,"latestBySubject",null);ke([Nt("delete-worktrees"),Jl(200),q(0,Hn(new v(Oo))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],ne.prototype,"deleteWorktrees",null);ke([Es(":id"),q(0,Kn("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],ne.prototype,"get",null);ke([Nt(),q(0,Hn(new v(Ao))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],ne.prototype,"create",null);ke([Nt(":id/resume"),q(0,Kn("id")),q(1,Hn(new v(Co))),P("design:type",Function),P("design:paramtypes",[String,Object]),P("design:returntype",Promise)],ne.prototype,"resume",null);ke([Nt(":id/retry"),q(0,Kn("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],ne.prototype,"retry",null);ke([Nt(":id/retry-step"),q(0,Kn("id")),q(1,Hn(new v($o))),P("design:type",Function),P("design:paramtypes",[String,Object]),P("design:returntype",Promise)],ne.prototype,"retryStep",null);ke([Nt(":id/cancel"),q(0,Kn("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],ne.prototype,"cancel",null);ne=ke([Pw("jobs"),q(0,_s(X)),q(1,_s(Ie)),q(2,_s(je)),P("design:paramtypes",[X,Ie,je])],ne)});import{z as re}from"zod";var qo,Do,ks=l(()=>{"use strict";C();qo=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))})]),Do=re.object({workflowId:re.string().min(1),selection:qo,triggeredBy:re.enum(["schedule","view_bulk","multiselect"]),notificationOverride:$n.optional(),inputValues:re.record(re.string(),re.unknown())})});import{Body as kw,Controller as Rw,Get as Cs,Inject as Rs,Param as Ts,Post as Ml,Query as As}from"@nestjs/common";import"zod";var dn,V,Le,Xe,Wl=l(()=>{"use strict";bo();ar();On();E();ce();js();ks();dn=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)},Le=function(n,e){return function(t,r){e(t,r,n)}},Xe=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}=ko(t,r),s=await this.batches.list(e?{workflowId:e}:{});return Ro(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)}};dn([Cs(),Le(0,As("workflowId")),Le(1,As("limit")),Le(2,As("offset")),V("design:type",Function),V("design:paramtypes",[String,String,String]),V("design:returntype",Promise)],Xe.prototype,"list",null);dn([Cs(":id"),Le(0,Ts("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Xe.prototype,"get",null);dn([Cs(":id/jobs"),Le(0,Ts("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Xe.prototype,"listJobs",null);dn([Ml(),Le(0,kw(new v(Do))),V("design:type",Function),V("design:paramtypes",[Object]),V("design:returntype",Promise)],Xe.prototype,"launch",null);dn([Ml(":id/cancel"),Le(0,Ts("id")),V("design:type",Function),V("design:paramtypes",[String]),V("design:returntype",Promise)],Xe.prototype,"cancel",null);Xe=dn([Rw("batches"),Le(0,Rs(pe)),Le(1,Rs(X)),Le(2,Rs(Ie)),V("design:paramtypes",[pe,X,Ie])],Xe)});import{Body as Ul,Controller as Aw,Delete as Cw,Get as Hl,HttpCode as Tw,Inject as Ow,Param as Os,Patch as $w,Post as qw,Query as Dw}from"@nestjs/common";var fn,G,Jt,Ye,Kl=l(()=>{"use strict";C();gi();E();ce();fn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},G=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Jt=function(n,e){return function(t,r){e(t,r,n)}},Ye=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}`)}};fn([Hl(),Jt(0,Dw("enabled")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Ye.prototype,"list",null);fn([Hl(":id"),Jt(0,Os("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Ye.prototype,"get",null);fn([qw(),Jt(0,Ul(new v(Gt))),G("design:type",Function),G("design:paramtypes",[Object]),G("design:returntype",Promise)],Ye.prototype,"create",null);fn([$w(":id"),Jt(0,Os("id")),Jt(1,Ul(new v(Gt.partial().omit({id:!0})))),G("design:type",Function),G("design:paramtypes",[String,Object]),G("design:returntype",Promise)],Ye.prototype,"update",null);fn([Cw(":id"),Tw(204),Jt(0,Os("id")),G("design:type",Function),G("design:paramtypes",[String]),G("design:returntype",Promise)],Ye.prototype,"remove",null);Ye=fn([Aw("schedules"),Jt(0,Ow(Ue)),G("design:paramtypes",[Ue])],Ye)});import{Controller as Bw,Inject as Fw,Query as Vl,Sse as Nw}from"@nestjs/common";import{Observable as Ql}from"rxjs";var Gl,Bo,$s,Vn,zl=l(()=>{"use strict";io();Gl=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},Bo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},$s=function(n,e){return function(t,r){e(t,r,n)}},Vn=class{events;constructor(e){this.events=e}stream(e,t){return new Ql(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()}})}};Gl([Nw(),$s(0,Vl("jobId")),$s(1,Vl("batchId")),Bo("design:type",Function),Bo("design:paramtypes",[String,String]),Bo("design:returntype",Ql)],Vn.prototype,"stream",null);Vn=Gl([Bw("events"),$s(0,Fw(xe)),Bo("design:paramtypes",[xe])],Vn)});import{extendZodWithOpenApi as Jw}from"@asteasolutions/zod-to-openapi";import{z as Lw}from"zod";var Xl=l(()=>{"use strict";Jw(Lw)});import{z as Yl}from"zod";var Fo,qs=l(()=>{"use strict";Fo=Yl.object({value:Yl.string().min(1)})});import{z as Re}from"zod";var kR,Mw,Zl,ep=l(()=>{"use strict";kR=Re.object({path:Re.string().optional(),mode:Re.enum(["directories","files"]).optional(),extensions:Re.string().optional()}),Mw=Re.object({name:Re.string().min(1),path:Re.string().min(1),isDirectory:Re.boolean()}),Zl=Re.object({path:Re.string().min(1),entries:Re.array(Mw)})});import{z as p}from"zod";function ug(n){let e=p.toJSONSchema(n),{$schema:t,...r}=e;return r}function np(n){let e=(t,r)=>n.registerComponent("schemas",t,ug(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",qn),WorkflowDefinitionInput:e("WorkflowDefinitionInput",ct),UpdateWorkflowBody:e("UpdateWorkflowBody",tg),SubjectView:e("SubjectView",pr),CreateSubjectViewBody:e("CreateSubjectViewBody",dr),ReorderViewsBody:e("ReorderViewsBody",mr),UpdateViewBody:e("UpdateViewBody",rg),WorkflowShortcut:e("WorkflowShortcut",Ir),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",_r),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",Pr),ReorderShortcutsBody:e("ReorderShortcutsBody",Er),Schedule:e("Schedule",Gt),UpdateScheduleBody:e("UpdateScheduleBody",og),EngineSettings:e("EngineSettings",Rr),UpdateSettingsBody:e("UpdateSettingsBody",sg),SettingsPatchResponse:e("SettingsPatchResponse",cg),ProviderInstanceConfig:e("ProviderInstanceConfig",kr),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Cr),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",Tr),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",ag),SetSecretBody:e("SetSecretBody",Fo),CreateJobBody:e("CreateJobBody",Ao),ResumeJobBody:e("ResumeJobBody",Co),RetryStepBody:e("RetryStepBody",$o),LatestBySubjectBody:e("LatestBySubjectBody",To),LatestBySubjectResponse:e("LatestBySubjectResponse",ig),LaunchBody:e("LaunchBody",Do),Job:e("Job",Ds),QueuedAgentStep:e("QueuedAgentStep",Qw),JobBatch:e("JobBatch",tp),LaunchResponse:e("LaunchResponse",zw),HealthResponse:e("HealthResponse",Xw),ProviderStatus:e("ProviderStatus",Yw),QueryTemplate:e("QueryTemplate",Ha),ProviderActionDescriptor:e("ProviderActionDescriptor",Ka),PreviewModelsBody:e("PreviewModelsBody",Or),PreviewModel:e("PreviewModel",Uc),TestConnectionBody:e("TestConnectionBody",$r),TestConnectionResult:e("TestConnectionResult",Kc),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",lr),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",Va),ErrorResponse:e("ErrorResponse",Zw),EngineEvent:e("EngineEvent",eg),Subject:e("Subject",No),WorkflowLibraryEntry:e("WorkflowLibraryEntry",ng),ContextFile:e("ContextFile",gr),CreateContextFileBody:e("CreateContextFileBody",br),UpdateContextFileBody:e("UpdateContextFileBody",Sr),LocalRepository:e("LocalRepository",xr),CreateLocalRepositoryBody:e("CreateLocalRepositoryBody",vr),UpdateLocalRepositoryBody:e("UpdateLocalRepositoryBody",jr),DeleteWorktreesBody:e("DeleteWorktreesBody",Oo),FilesystemBrowseResult:e("FilesystemBrowseResult",Zl),ImportWorkflowBody:e("ImportWorkflowBody",Io),ImportConflictResponse:e("ImportConflictResponse",gl)}}var Ww,Uw,Hw,Kw,No,Vw,Gw,Qw,Ds,tp,zw,Xw,Yw,Zw,eg,tg,ng,rg,og,ig,sg,ag,cg,k,Bs,Fs=l(()=>{"use strict";Xl();C();Is();ks();qs();ep();ms();Ww=p.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),Uw=p.object({subjectType:p.literal("ticket"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),status:p.string(),assignee:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Hw=p.object({subjectType:p.literal("pull_request"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),sourceBranch:p.string(),targetBranch:p.string(),author:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Kw=p.object({subjectType:p.literal("documentation"),id:p.string(),source:p.string().min(1),title:p.string(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),No=p.discriminatedUnion("subjectType",[Uw,Hw,Kw]),Vw=p.discriminatedUnion("mode",[p.object({mode:p.literal("single"),subject:No}),p.object({mode:p.literal("collection"),subjects:p.array(No)})]),Gw=p.object({id:p.string(),stepDefinitionId:p.string(),type:p.string(),status:p.enum(["pending","queued","running","waiting_for_children","completed","failed","skipped"]),startedAt:p.string().optional(),completedAt:p.string().optional(),output:p.unknown().optional(),error:p.string().optional(),failureDetails:p.record(p.string(),p.unknown()).optional(),childJobIds:p.array(p.string()).optional(),iterations:p.array(p.object({index:p.number().int(),stepExecutions:p.array(p.record(p.string(),p.unknown())),startedAt:p.string(),completedAt:p.string().optional()})).optional()}),Qw=p.object({jobId:p.string(),stepExecutionId:p.string(),agentInstanceId:p.string(),enqueuedAt:p.string()}),Ds=p.object({id:p.string(),workflowId:p.string(),status:Ww,subjectContext:Vw.optional(),selection:qo.optional(),batchId:p.string().optional(),parentJobId:p.string().optional(),parentStepExecutionId:p.string().optional(),fanOutIndex:p.number().int().optional(),retryOf:p.string().optional(),workflowSnapshot:qn.optional(),context:p.record(p.string(),p.unknown()),worktreePath:p.string().optional(),branch:p.string().optional(),worktreeDeletedAt:p.string().optional(),currentStepId:p.string().optional(),currentStepExecutionId:p.string().optional(),stepHistory:p.array(Gw),createdAt:p.string(),updatedAt:p.string(),completedAt:p.string().optional()}),tp=p.object({id:p.string(),workflowId:p.string(),selection:qo,resolvedSubjects:p.array(No),jobIds:p.array(p.string()),status:p.enum(["running","completed","completed_with_issues","failed","cancelled"]),triggeredBy:p.enum(["schedule","view_bulk","multiselect"]),scheduleId:p.string().optional(),notificationOverride:$n.optional(),notificationSent:p.boolean(),createdAt:p.string(),completedAt:p.string().optional()}),zw=p.discriminatedUnion("kind",[p.object({kind:p.literal("job"),job:Ds}),p.object({kind:p.literal("batch"),batch:tp})]),Xw=p.object({ok:p.boolean(),service:p.string(),timestamp:p.string()}),Yw=p.object({providerId:p.string(),secretKey:p.string(),configured:p.boolean()}),Zw=p.object({error:p.string()}),eg=p.object({type:p.string(),timestamp:p.string()}).passthrough(),tg=ct,ng=p.object({id:p.string().min(1),source:p.enum(["example","community","official"]),name:p.string().min(1),description:p.string(),workflowDefinition:ct}),rg=fr,og=Gt.partial().omit({id:!0}),ig=p.record(p.string(),Ds.nullable()),sg=Ar,ag=p.object({settings:Rr,restartRequired:p.literal(!0)}),cg=p.object({settings:Rr,restartRequired:p.boolean()}),k=p.object({id:p.string().min(1)}),Bs=p.object({limit:p.string().optional().openapi({description:"Max items to return (default 50)"}),offset:p.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as j}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 rp(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:j.object({subjectHandling:j.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:k},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:k},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:k,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: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: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:k},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:j.object({subjectType:ie.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:k},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:k},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:k,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:k},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:Bs.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: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:"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:k},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:k,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:k},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:k,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:k},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:Bs.extend({workflowId:j.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:k},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:k},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:k},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:k},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:k,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: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:w(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: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:k,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: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:w(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: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:k,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: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:w(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:w(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: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:k,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: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: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:j.object({providerId:j.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:j.object({providerId:j.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:j.object({providerId:j.string().min(1),templateId:j.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:j.object({id:j.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:j.object({id:j.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:j.object({id:j.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:j.object({id:j.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: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 op=l(()=>{"use strict";C();Fs()});import{OpenAPIRegistry as lg,OpenApiGeneratorV31 as pg}from"@asteasolutions/zod-to-openapi";function ip(){if(Jo)return Jo;let n=new lg,e=np(n);return rp(n,e),Jo=new pg(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"}]}),Jo}var Jo,sp=l(()=>{"use strict";Fs();op()});import{Controller as dg,Get as fg,Header as mg}from"@nestjs/common";var ap,Ns,Gn,cp=l(()=>{"use strict";sp();ap=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},Ns=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Gn=class{getOpenApiDocument(){return ip()}};ap([fg("openapi.json"),mg("Content-Type","application/json"),Ns("design:type",Function),Ns("design:paramtypes",[]),Ns("design:returntype",void 0)],Gn.prototype,"getOpenApiDocument",null);Gn=ap([dg()],Gn)});import{Controller as hg,Get as Js,Inject as Qn,Param as Lo,Post as Ls,Body as Ms,HttpCode as Ws}from"@nestjs/common";var Lt,L,ge,Me,up=l(()=>{"use strict";Ti();Hi();Ki();no();ro();C();ce();Lt=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},L=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)}},Me=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)}}};Lt([Js("status"),L("design:type",Function),L("design:paramtypes",[]),L("design:returntype",Promise)],Me.prototype,"status",null);Lt([Ls("preview-models"),Ws(200),ge(0,Ms(new v(Or))),L("design:type",Function),L("design:paramtypes",[Object]),L("design:returntype",Promise)],Me.prototype,"previewAvailableModels",null);Lt([Ls("test-connection"),Ws(200),ge(0,Ms(new v($r))),L("design:type",Function),L("design:paramtypes",[Object]),L("design:returntype",Promise)],Me.prototype,"testConnection",null);Lt([Js(":providerId/query-templates"),ge(0,Lo("providerId")),L("design:type",Function),L("design:paramtypes",[String]),L("design:returntype",Promise)],Me.prototype,"listQueryTemplates",null);Lt([Js(":providerId/actions"),ge(0,Lo("providerId")),L("design:type",Function),L("design:paramtypes",[String]),L("design:returntype",Promise)],Me.prototype,"listExtendedActions",null);Lt([Ls(":providerId/query-templates/:templateId/resolve"),Ws(200),ge(0,Lo("providerId")),ge(1,Lo("templateId")),ge(2,Ms(new v(lr))),L("design:type",Function),L("design:paramtypes",[String,String,Object]),L("design:returntype",Promise)],Me.prototype,"resolveQueryTemplate",null);Me=Lt([hg("providers"),ge(0,Qn(ut)),ge(1,Qn(lt)),ge(2,Qn(pt)),ge(3,Qn(dt)),ge(4,Qn(Se)),L("design:paramtypes",[ut,lt,pt,dt,Se])],Me)});import{Body as yg,Controller as wg,Get as gg,Inject as bg,Patch as Sg}from"@nestjs/common";var Us,Mt,lp,mn,pp=l(()=>{"use strict";C();he();ce();Us=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Mt=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},lp=function(n,e){return function(t,r){e(t,r,n)}},mn=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)}}};Us([gg(),Mt("design:type",Function),Mt("design:paramtypes",[]),Mt("design:returntype",Promise)],mn.prototype,"get",null);Us([Sg(),lp(0,yg(new v(Ar))),Mt("design:type",Function),Mt("design:paramtypes",[Object]),Mt("design:returntype",Promise)],mn.prototype,"update",null);mn=Us([wg("settings"),lp(0,bg(I)),Mt("design:paramtypes",[I])],mn)});function Hs(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return Fe(t)?r===!0?t.id:r===!1?e===t.id?null:e??null:o&&!e?t.id:e??null:e===t.id?null:e??null}function dp(n){let{defaultAgent:e,...t}=n;return t}var fp=l(()=>{"use strict";C()});import{Body as hp,Controller as xg,Delete as vg,Get as yp,HttpCode as wp,Inject as mp,Param as Mo,Patch as jg,Post as gp}from"@nestjs/common";var Wt,M,vt,We,bp=l(()=>{"use strict";C();he();E();ce();fp();ro();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},M=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},vt=function(n,e){return function(t,r){e(t,r,n)}},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=dp(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:Hs({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:Hs({current:r.defaultAgentInstanceId,instance:a,defaultAgent:t.defaultAgent,isCreate:!1})}),restartRequired:!0}}async remove(e){let t=await this.settings.get(),r=(t.providerInstances??[]).filter(s=>s.id!==e);if(r.length===(t.providerInstances??[]).length)throw new y(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};Wt([yp(),M("design:type",Function),M("design:paramtypes",[]),M("design:returntype",Promise)],We.prototype,"list",null);Wt([yp(":id"),vt(0,Mo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"get",null);Wt([gp(":id/test-connection"),wp(200),vt(0,Mo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"testConnection",null);Wt([gp(),vt(0,hp(new v(Cr))),M("design:type",Function),M("design:paramtypes",[Object]),M("design:returntype",Promise)],We.prototype,"create",null);Wt([jg(":id"),vt(0,Mo("id")),vt(1,hp(new v(Tr))),M("design:type",Function),M("design:paramtypes",[String,Object]),M("design:returntype",Promise)],We.prototype,"update",null);Wt([vg(":id"),wp(200),vt(0,Mo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],We.prototype,"remove",null);We=Wt([xg("provider-instances"),vt(0,mp(I)),vt(1,mp(Se)),M("design:paramtypes",[I,Se])],We)});import{Body as Ig,Controller as _g,HttpCode as Pg,Inject as Eg,Param as kg,Post as Rg}from"@nestjs/common";var Sp,Wo,Ks,zn,xp=l(()=>{"use strict";Ce();E();ce();qs();Sp=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},Wo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ks=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)}};Sp([Rg(":key"),Pg(204),Ks(0,kg("key")),Ks(1,Ig(new v(Fo))),Wo("design:type",Function),Wo("design:paramtypes",[String,Object]),Wo("design:returntype",Promise)],zn.prototype,"set",null);zn=Sp([_g("secrets"),Ks(0,Eg(oe)),Wo("design:paramtypes",[Function])],zn)});import{readFile as Ag}from"node:fs/promises";async function Vs(n){try{await Ag(n,"utf8")}catch(e){let t=e instanceof Error?e.message:String(e);throw new h(`Cannot read context file at '${n}': ${t}`)}}var vp=l(()=>{"use strict";E()});import{Body as jp,Controller as Cg,Delete as Tg,Get as Ip,HttpCode as Og,Inject as $g,Param as Gs,Patch as qg,Post as Dg}from"@nestjs/common";import{randomUUID as Bg}from"node:crypto";var yn,Q,hn,Ze,_p=l(()=>{"use strict";C();cr();E();ce();vp();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},Q=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},hn=function(n,e){return function(t,r){e(t,r,n)}},Ze=class{files;constructor(e){this.files=e}async list(){return this.files.list()}async get(e){let t=await this.files.get(e);if(!t)throw new y(`Context file not found: ${e}`);return t}async create(e){return await Vs(e.path),this.files.create({id:e.id??Bg(),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 Vs(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}`)}};yn([Ip(),Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",Promise)],Ze.prototype,"list",null);yn([Ip(":id"),hn(0,Gs("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],Ze.prototype,"get",null);yn([Dg(),hn(0,jp(new v(br))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],Ze.prototype,"create",null);yn([qg(":id"),hn(0,Gs("id")),hn(1,jp(new v(Sr))),Q("design:type",Function),Q("design:paramtypes",[String,Object]),Q("design:returntype",Promise)],Ze.prototype,"update",null);yn([Tg(":id"),Og(204),hn(0,Gs("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],Ze.prototype,"remove",null);Ze=yn([Cg("context-files"),hn(0,$g(de)),Q("design:paramtypes",[de])],Ze)});import{execFile as Fg}from"node:child_process";import{stat as Ng}from"node:fs/promises";import{resolve as Qs}from"node:path";import{promisify as Jg}from"node:util";async function zs(n){let e=Qs(n);try{if((await Lg("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 Xs(n,e){let t=Qs(n),r=Qs(e?.trim()?e.trim():mo(t));if(ho(t,r))throw new h(`Worktree base '${r}' must not be inside the repository at '${t}'`);try{if(!(await Ng(r)).isDirectory())throw new h(`Worktree base '${r}' exists and is not a directory`)}catch(o){if(o instanceof h)throw o}}var Lg,Pp=l(()=>{"use strict";E();us();Lg=Jg(Fg)});import{Body as Ep,Controller as Mg,Delete as Wg,Get as kp,HttpCode as Ug,Inject as Hg,Param as Ys,Patch as Kg,Post as Vg}from"@nestjs/common";import{randomUUID as Gg}from"node:crypto";var gn,z,wn,et,Rp=l(()=>{"use strict";C();ur();E();ce();Pp();gn=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},z=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},wn=function(n,e){return function(t,r){e(t,r,n)}},et=class{repos;constructor(e){this.repos=e}async list(){return this.repos.list()}async get(e){let t=await this.repos.get(e);if(!t)throw new y(`Local repository not found: ${e}`);return t}async create(e){return await zs(e.localPath),await Xs(e.localPath,e.worktreeBasePath),this.repos.create({id:e.id??Gg(),name:e.name,localPath:e.localPath,...e.worktreeBasePath?{worktreeBasePath:e.worktreeBasePath}:{},...e.defaultBranch?{defaultBranch:e.defaultBranch}:{}})}async update(e,t){let r=await this.repos.get(e);if(!r)throw new y(`Local repository not found: ${e}`);let o=t.localPath??r.localPath,i=t.worktreeBasePath!==void 0?t.worktreeBasePath:r.worktreeBasePath;await zs(o),await Xs(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}`)}};gn([kp(),z("design:type",Function),z("design:paramtypes",[]),z("design:returntype",Promise)],et.prototype,"list",null);gn([kp(":id"),wn(0,Ys("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],et.prototype,"get",null);gn([Vg(),wn(0,Ep(new v(vr))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],et.prototype,"create",null);gn([Kg(":id"),wn(0,Ys("id")),wn(1,Ep(new v(jr))),z("design:type",Function),z("design:paramtypes",[String,Object]),z("design:returntype",Promise)],et.prototype,"update",null);gn([Wg(":id"),Ug(204),wn(0,Ys("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],et.prototype,"remove",null);et=gn([Mg("local-repositories"),wn(0,Hg(fe)),z("design:paramtypes",[fe])],et)});import{readdir as Qg,stat as zg}from"node:fs/promises";import{homedir as Xg}from"node:os";import{join as Yg,resolve as Zg}from"node:path";async function Ap(n,e={}){let t=n?.trim()?n.trim():Xg(),r=Zg(t),o;try{o=await zg(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 Qg(r,{encoding:"utf8",withFileTypes:!0})).filter(a=>a.name!=="."&&a.name!=="..").map(a=>({name:a.name,path:Yg(r,a.name),isDirectory:a.isDirectory()})).filter(a=>eb(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 Cp(n){if(n==null||n.trim()==="")return;let e=n.split(",").map(t=>Op(t)).filter(t=>t!=null);return e.length>0?e:void 0}function Tp(n){if(!(n==null||n.trim()==="")){if(n==="directories"||n==="files")return n;throw new h(`Invalid browse mode '${n}'`)}}function eb(n,e){if(e.mode==="directories")return n.isDirectory;if(n.isDirectory)return!0;let t=e.extensions?.map(o=>Op(o)).filter(Boolean);if(!t?.length)return!0;let r=n.name.toLowerCase();return t.some(o=>r.endsWith(o))}function Op(n){let e=n.trim().toLowerCase();if(e.length!==0)return e.startsWith(".")?e:`.${e}`}var $p=l(()=>{"use strict";E()});import{Controller as tb,Get as nb,Query as ta}from"@nestjs/common";var qp,Zs,ea,Xn,Dp=l(()=>{"use strict";$p();qp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zs=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ea=function(n,e){return function(t,r){e(t,r,n)}},Xn=class{async browse(e,t,r){return Ap(e,{mode:Tp(t),extensions:Cp(r)})}};qp([nb("browse"),ea(0,ta("path")),ea(1,ta("mode")),ea(2,ta("extensions")),Zs("design:type",Function),Zs("design:paramtypes",[String,String,String]),Zs("design:returntype",Promise)],Xn.prototype,"browse",null);Xn=qp([tb("filesystem")],Xn)});import{Module as ob}from"@nestjs/common";import{APP_FILTER as ib}from"@nestjs/core";var rb,Uo,Bp=l(()=>{"use strict";Fn();ds();so();ul();_l();Ol();ql();Nl();Ll();Wl();Kl();zl();cp();up();pp();bp();xp();_p();Rp();Dp();oo();ri();rb=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=class{};Uo=rb([ob({imports:[Ne,ln,mt,ft,Kt],controllers:[we,pn,Ee,Je,ne,Xe,Ye,Vn,Gn,Me,mn,We,zn,Ze,et,Xn],providers:[{provide:ib,useClass:So}]})],Uo)});import{Module as ab}from"@nestjs/common";var sb,Ho,Fp=l(()=>{"use strict";ia();sa();aa();oo();so();Fn();ds();Bp();sb=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ho=class{};Ho=sb([ab({imports:[Yn,Zn,ft,mt,Ne,ln,Uo],controllers:[bn]})],Ho)});import{apiReference as cb}from"@scalar/nestjs-api-reference";function Np(n){n.use("/api/docs",cb({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var Jp=l(()=>{"use strict"});import{createServer as ub}from"node:net";function Lp(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function na(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await lb(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function lb(n){return new Promise(e=>{let t=ub();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var Mp=l(()=>{"use strict"});import{Catch as fb,HttpStatus as Ko,NotFoundException as mb}from"@nestjs/common";import{existsSync as Wp,statSync as hb}from"node:fs";import{extname as Up,join as ra,normalize as yb,relative as wb,sep as gb}from"node:path";function Hp(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=bb(e.path??"/");if(o){let i=ra(n,o);if(Sb(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(Kp(e)){Vp(t,n,i=>{i&&!t.headersSent&&t.status(Ko.NOT_FOUND).end()});return}t.status(Ko.NOT_FOUND).end()}}function Kp(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=Up(e);return!(t&&t!==".html")}function Vp(n,e,t){n.sendFile("index.html",{root:e},t)}function bb(n){if(n==="/"||n==="")return"index.html";let e=yb(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!Up(e)?null:e}function Sb(n,e){if(!Wp(e))return!1;try{if(!hb(e).isFile())return!1}catch{return!1}let t=wb(n,e);return t!==""&&!t.startsWith(`..${gb}`)&&!t.startsWith("..")}function Gp(n){return ra(n,"index.html")}var pb,db,Vo,Qp=l(()=>{"use strict";pb=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)},Vo=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(Kp(o)&&Wp(ra(this.staticRoot,"index.html"))){Vp(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(Ko.NOT_FOUND).json({statusCode:Ko.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)}};Vo=pb([fb(mb),db("design:paramtypes",[String])],Vo)});import{existsSync as xb}from"node:fs";import{dirname as vb,join as Go}from"node:path";import{fileURLToPath as jb}from"node:url";function zp(){let n=vb(jb(import.meta.url)),e=[Go(n,"../static"),Go(n,"../../static"),Go(n,"static")];for(let t of e)if(xb(Go(t,"index.html")))return t;return null}var Xp=l(()=>{"use strict"});var kb={};import"reflect-metadata";import{existsSync as Ib}from"node:fs";import{Logger as _b}from"@nestjs/common";import{NestFactory as Pb}from"@nestjs/core";async function Eb(){let n=await Pb.create(Ho);n.enableCors(),n.setGlobalPrefix("api"),Np(n);let e=zp(),t=e?Gp(e):null;e&&t&&Ib(t)?(Qo.log(`Serving UI from ${e}`),n.use(Hp(e)),n.useGlobalFilters(new Vo(e))):Qo.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 na(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?Qo.warn(`Port ${r} is in use; listening on ${o} instead`):Qo.log(`Listening on http://localhost:${o}`);return}catch(s){if(!Lp(s))throw s;o=await na(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var Qo,Yp=l(()=>{"use strict";Fp();Jp();Mp();Qp();Xp();Qo=new _b("Bootstrap");Eb()});import{readFileSync as Rb}from"node:fs";function Ab(){let n=Rb(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var zo=process.argv.slice(2);zo.includes("--version")||zo.includes("-v")?console.log(Ab()):zo.includes("--help")||zo.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(()=>(Yp(),kb));
|