@knoflows/engine 0.1.0-alpha.8 → 0.1.0-alpha.9
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/dist/engine.js +16 -139
- package/dist/migrations/20260917165450_baseline/migration.sql +127 -0
- package/dist/migrations/20260917165450_baseline/snapshot.json +1212 -0
- package/package.json +4 -2
- package/static/{chunk-CB7iIlL9.js → chunk-1SlEtaMr.js} +1 -1
- package/static/chunk-5H-9s7GP.js +7 -0
- package/static/{chunk-He--f9Sf.js → chunk-B-P3MXAn.js} +1 -1
- package/static/{chunk-bi3jOaJV.js → chunk-B76UD1mt.js} +1 -1
- package/static/{chunk-CoKTfrti.js → chunk-BFYi_kYd.js} +1 -1
- package/static/{chunk-DflfYru0.js → chunk-BG0Azip9.js} +1 -1
- package/static/{chunk-MRIst_Tv.js → chunk-BWr0M-hk.js} +1 -1
- package/static/{chunk-DjiFAEo3.js → chunk-BmSmqIC7.js} +1 -1
- package/static/{chunk-CxgNB2C8.js → chunk-Bpxo3nwV.js} +1 -1
- package/static/{chunk-CL0Sh0Qb.js → chunk-Bw9D3p4h.js} +1 -1
- package/static/{chunk-BEvII7Hn.js → chunk-C-T2O6LE.js} +1 -1
- package/static/{chunk-JcYd5MYJ.js → chunk-C1E15gBW.js} +1 -1
- package/static/{chunk-mmWflnUN.js → chunk-C1V4WljN.js} +1 -1
- package/static/{chunk-Dc_LNQ-q.js → chunk-C3wpjxgW.js} +1 -1
- package/static/{chunk-BiLgez1m.js → chunk-C4yhGGeB.js} +1 -1
- package/static/{chunk-DO1B2M6l.js → chunk-C5hSEJdm.js} +1 -1
- package/static/{chunk-fPx6gQSM.js → chunk-CTkRZ4w1.js} +1 -1
- package/static/{chunk-g1iNEPSG.js → chunk-CYX8w88D.js} +1 -1
- package/static/{chunk-BQgEbMSp.js → chunk-Cq4-aSSE.js} +1 -1
- package/static/{chunk-CQ708Y6F.js → chunk-Cwf9CcBI.js} +1 -1
- package/static/{chunk-BYIP8zBR.js → chunk-D32ZkSz4.js} +1 -1
- package/static/{chunk-Dqtz3Iow.js → chunk-DE9IK0Os.js} +1 -1
- package/static/{chunk-Cuaj1Fgz.js → chunk-DNtWpE65.js} +1 -1
- package/static/{chunk-BIFLxIMS.js → chunk-DdVQ8Ilm.js} +1 -1
- package/static/{chunk-DTLDtzu5.js → chunk-W0OF0P_2.js} +1 -1
- package/static/{chunk-Xv2Lx0k9.js → chunk-WzBVBHEz.js} +1 -1
- package/static/{chunk-CNj32s8G.js → chunk-XvSvuf-k.js} +1 -1
- package/static/{chunk-BrJS_1Y1.js → chunk-aWIxMbtR.js} +1 -1
- package/static/{chunk-BnnoOI-1.js → chunk-f1UVptf5.js} +1 -1
- package/static/{chunk-G2CzeazF.js → chunk-vj0RDTCf.js} +1 -1
- package/static/index.html +1 -1
- package/static/{main-R7YQQZVK.js → main-BRWQ5RNE.js} +1 -1
- package/static/chunk-DrlNmyyx.js +0 -7
package/dist/engine.js
CHANGED
|
@@ -1,146 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var p=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as Cc,Get as qc}from"@nestjs/common";var Go,_r,vt,Xo=p(()=>{"use strict";Go=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},_r=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},vt=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};Go([qc(),_r("design:type",Function),_r("design:paramtypes",[]),_r("design:returntype",Object)],vt.prototype,"getHealth",null);vt=Go([Cc("health")],vt)});import{Module as Dc}from"@nestjs/common";var $c,Wt,Qo=p(()=>{"use strict";$c=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(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=$c([Dc({})],Wt)});import{Module as Lc}from"@nestjs/common";var Bc,Vt,zo=p(()=>{"use strict";Bc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Vt=class{};Vt=Bc([Lc({})],Vt)});var Et,Ir=p(()=>{"use strict";Et=Symbol("NOTIFICATION_PROVIDER")});var Gt,Yo=p(()=>{"use strict";Gt=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});var xt,jr=p(()=>{"use strict";xt=Symbol("KNOWLEDGE_PROVIDER")});import{readdir as Uc,readFile as Fc}from"node:fs/promises";import{join as Zo}from"node:path";var Xt,ei=p(()=>{"use strict";Xt=class{baseDir;constructor(e){this.baseDir=e}async resolve(e,t){let r=Zo(this.baseDir,e),o;try{o=await Uc(r)}catch(a){if(a.code==="ENOENT")return[];throw a}let i=o.filter(a=>a.endsWith(".md")).sort(),s=[];for(let a of i){let u=Zo(r,a),c=await Fc(u,"utf8");s.push({tier:e,content:c,sourceRef:u})}return s}}});import{createCipheriv as Jc,createDecipheriv as Mc,randomBytes as ti}from"node:crypto";import{mkdir as ni,readFile as ri,writeFile as oi}from"node:fs/promises";import{join as Er}from"node:path";function ot(n){return`kno.${n}.apiKey`}function Vc(n){return Er(n,"secrets")}function si(n){return new xr(Vc(n.dataDir),n.keyring)}function Gc(n){try{return n(Qt,"__kno_probe__").getPassword(),!0}catch(e){return Tr(e)}}function Tr(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var Qt,ii,Hc,vr,Kc,Wc,xr,re,je=p(()=>{"use strict";Qt="kno-flows";ii="aes-256-gcm",Hc=12,vr=32,Kc="master.key",Wc="store.json",xr=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(Qt,e).getPassword();if(r!=null)return r}catch(r){Tr(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(Qt,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(Qt,e).deletePassword()}catch(r){Tr(r)||this.disableKeyring()}await this.fileDelete(e)}disableKeyring(){this.keyring=null,this.keyringResolved=!0}async resolveKeyring(){if(this.keyringResolved)return this.keyring??null;this.keyringResolved=!0;try{let{Entry:e}=await import("@napi-rs/keyring"),t=(r,o)=>new e(r,o);return Gc(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 ri(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 ni(this.secretsDir,{recursive:!0}),await oi(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=ti(Hc),o=Jc(ii,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=Mc(ii,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 ni(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await ri(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==vr)throw new Error(`Secret store master key at ${e} is not ${vr} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=ti(vr);return await oi(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return Er(this.secretsDir,Wc)}masterKeyPath(){return Er(this.secretsDir,Kc)}};re=Symbol("SECRET_STORE")});import{Module as Qc}from"@nestjs/common";import{mkdirSync as zc}from"node:fs";import{dirname as Yc,join as Zc}from"node:path";import{fileURLToPath as eu}from"node:url";var Xc,ai,it,Rr=p(()=>{"use strict";je();Xc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ai=Zc(Yc(eu(import.meta.url)),"../../data");zc(ai,{recursive:!0});it=class{};it=Xc([Qc({providers:[{provide:re,useFactory:()=>si({dataDir:ai})}],exports:[re]})],it)});import{index as tu,sqliteTable as nu,text as de}from"drizzle-orm/sqlite-core";var pe,zt=p(()=>{"use strict";pe=nu("workflow_definitions",{id:de("id").primaryKey(),name:de("name").notNull(),description:de("description"),appliesTo:de("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:de("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:de("input_schema",{mode:"json"}).$type().notNull(),steps:de("steps",{mode:"json"}).$type().notNull(),notificationPolicy:de("notification_policy",{mode:"json"}).$type().notNull(),createdAt:de("created_at").notNull(),updatedAt:de("updated_at").notNull()},n=>[tu("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as ci,integer as ru,sqliteTable as ou,text as qe}from"drizzle-orm/sqlite-core";var le,Pr=p(()=>{"use strict";le=ou("subject_views",{id:qe("id").primaryKey(),name:qe("name").notNull(),subjectType:qe("subject_type").$type().notNull(),workflowId:qe("workflow_id").notNull(),query:qe("query",{mode:"json"}).$type().notNull(),description:qe("description"),queryTemplate:qe("query_template",{mode:"json"}).$type(),providerInstanceId:qe("provider_instance_id").notNull().default(""),order:ru("order").notNull().default(0)},n=>[ci("subject_views_subject_type_idx").on(n.subjectType),ci("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as ui,integer as iu,sqliteTable as su,text as fe}from"drizzle-orm/sqlite-core";var $e,Yt=p(()=>{"use strict";$e=su("job_batches",{id:fe("id").primaryKey(),workflowId:fe("workflow_id").notNull(),selection:fe("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:fe("resolved_subjects",{mode:"json"}).$type().notNull(),status:fe("status",{enum:["running","completed","completed_with_issues","failed"]}).notNull(),triggeredBy:fe("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:fe("schedule_id"),notificationOverride:fe("notification_override",{mode:"json"}).$type(),notificationSent:iu("notification_sent",{mode:"boolean"}).notNull(),createdAt:fe("created_at").notNull(),completedAt:fe("completed_at")},n=>[ui("job_batches_workflow_id_idx").on(n.workflowId),ui("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as Zt,integer as au,sqliteTable as cu,text as D}from"drizzle-orm/sqlite-core";var B,Tt=p(()=>{"use strict";zt();Yt();B=cu("jobs",{id:D("id").primaryKey(),workflowId:D("workflow_id").notNull().references(()=>pe.id),status:D("status").$type().notNull(),selection:D("selection",{mode:"json"}).$type(),batchId:D("batch_id").references(()=>$e.id),parentJobId:D("parent_job_id"),parentStepExecutionId:D("parent_step_execution_id"),fanOutIndex:au("fan_out_index"),retryOf:D("retry_of"),context:D("context",{mode:"json"}).$type().notNull(),worktreePath:D("worktree_path"),branch:D("branch"),currentStepId:D("current_step_id"),currentStepExecutionId:D("current_step_execution_id"),createdAt:D("created_at").notNull(),updatedAt:D("updated_at").notNull(),completedAt:D("completed_at")},n=>[Zt("jobs_workflow_id_idx").on(n.workflowId),Zt("jobs_status_idx").on(n.status),Zt("jobs_batch_id_idx").on(n.batchId),Zt("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as di,sqliteTable as uu,text as Rt}from"drizzle-orm/sqlite-core";var me,Ar=p(()=>{"use strict";Tt();me=uu("job_subjects",{id:Rt("id").primaryKey(),jobId:Rt("job_id").notNull().references(()=>B.id),subjectType:Rt("subject_type").$type().notNull(),subjectId:Rt("subject_id").notNull(),snapshot:Rt("snapshot",{mode:"json"}).$type().notNull()},n=>[di("job_subjects_job_id_idx").on(n.jobId),di("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as pi,integer as du,sqliteTable as pu,text as oe}from"drizzle-orm/sqlite-core";var Ye,Or=p(()=>{"use strict";Tt();Ye=pu("job_step_executions",{id:oe("id").primaryKey(),jobId:oe("job_id").notNull().references(()=>B.id),stepDefinitionId:oe("step_definition_id").notNull(),type:oe("type").$type().notNull(),status:oe("status").$type().notNull(),startedAt:oe("started_at"),completedAt:oe("completed_at"),output:oe("output",{mode:"json"}).$type(),error:oe("error"),childJobIds:oe("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:oe("parent_step_execution_id").references(()=>Ye.id),iterationIndex:du("iteration_index")},n=>[pi("job_step_executions_job_id_idx").on(n.jobId),pi("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as lu,integer as fu,sqliteTable as mu,text as De}from"drizzle-orm/sqlite-core";var Be,kr=p(()=>{"use strict";Be=mu("schedules",{id:De("id").primaryKey(),viewId:De("view_id").notNull(),triggerType:De("trigger_type",{enum:["cron"]}).notNull(),cadence:De("cadence").notNull(),notificationOverride:De("notification_override",{mode:"json"}).$type(),missedFirePolicy:De("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:fu("enabled",{mode:"boolean"}).notNull(),lastFiredAt:De("last_fired_at"),createdAt:De("created_at").notNull()},n=>[lu("schedules_enabled_idx").on(n.enabled)])});import{integer as hu,sqliteTable as gu,text as Pt}from"drizzle-orm/sqlite-core";var he,Nr=p(()=>{"use strict";he=gu("workflow_shortcuts",{id:Pt("id").primaryKey(),name:Pt("name").notNull(),workflowId:Pt("workflow_id").notNull(),inputValues:Pt("input_values",{mode:"json"}).$type().notNull(),lastJobId:Pt("last_job_id"),order:hu("order").notNull().default(0)})});import{sqliteTable as yu,text as li}from"drizzle-orm/sqlite-core";var At,st,Cr=p(()=>{"use strict";At="default",st=yu("settings",{id:li("id").primaryKey(),data:li("data",{mode:"json"}).$type().notNull()})});import{defineRelations as wu}from"drizzle-orm";var bu,fi,mi=p(()=>{"use strict";zt();Pr();Tt();Ar();Or();Yt();kr();Nr();Cr();bu={workflowDefinitions:pe,subjectViews:le,jobs:B,jobSubjects:me,jobStepExecutions:Ye,jobBatches:$e,schedules:Be,workflowShortcuts:he,settings:st},fi=wu(bu,n=>({workflowDefinitions:{},subjectViews:{},schedules:{},workflowShortcuts:{},settings:{},jobs:{subjects:n.many.jobSubjects({from:n.jobs.id,to:n.jobSubjects.jobId}),stepExecutions:n.many.jobStepExecutions({from:n.jobs.id,to:n.jobStepExecutions.jobId}),batch:n.one.jobBatches({from:n.jobs.batchId,to:n.jobBatches.id})},jobSubjects:{job:n.one.jobs({from:n.jobSubjects.jobId,to:n.jobs.id})},jobStepExecutions:{job:n.one.jobs({from:n.jobStepExecutions.jobId,to:n.jobs.id}),parent:n.one.jobStepExecutions({from:n.jobStepExecutions.parentStepExecutionId,to:n.jobStepExecutions.id,alias:"job_step_executions_parent"}),children:n.many.jobStepExecutions({from:n.jobStepExecutions.id,to:n.jobStepExecutions.parentStepExecutionId,alias:"job_step_executions_children"})},jobBatches:{jobs:n.many.jobs({from:n.jobBatches.id,to:n.jobs.batchId})}}))});import{drizzle as Su}from"drizzle-orm/node-sqlite";import{DatabaseSync as Uh}from"node:sqlite";function hi(n){return n.exec("PRAGMA foreign_keys = ON;"),Su({client:n,relations:fi})}var gi=p(()=>{"use strict";mi()});function ve(n,e,t){return n.prepare(`PRAGMA table_info(${e})`).all().some(o=>o.name===t)}function _u(n){ve(n,"subject_views","order")||n.exec('ALTER TABLE subject_views ADD COLUMN "order" INTEGER NOT NULL DEFAULT 0'),ve(n,"subject_views","query_template")||n.exec("ALTER TABLE subject_views ADD COLUMN query_template TEXT"),ve(n,"subject_views","provider_instance_id")||n.exec("ALTER TABLE subject_views ADD COLUMN provider_instance_id TEXT NOT NULL DEFAULT ''"),ve(n,"subject_views","workflow_id")||n.exec("ALTER TABLE subject_views ADD COLUMN workflow_id TEXT NOT NULL DEFAULT ''"),ve(n,"schedules","workflow_id")&&n.exec("ALTER TABLE schedules DROP COLUMN workflow_id"),ve(n,"workflow_definitions","cardinality")&&!ve(n,"workflow_definitions","subject_handling")&&(n.exec("ALTER TABLE workflow_definitions ADD COLUMN subject_handling TEXT NOT NULL DEFAULT 'per-subject'"),n.exec("UPDATE workflow_definitions SET subject_handling = 'collection' WHERE cardinality = 'aggregate'"),n.exec("UPDATE workflow_definitions SET subject_handling = 'per-subject' WHERE cardinality IN ('single', 'batch')")),n.exec("DROP INDEX IF EXISTS workflow_definitions_cardinality_idx"),ve(n,"workflow_definitions","cardinality")&&n.exec("ALTER TABLE workflow_definitions DROP COLUMN cardinality"),ve(n,"workflow_definitions","subject_handling")&&n.exec(`
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
CREATE TABLE IF NOT EXISTS workflow_definitions (
|
|
12
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
13
|
-
name TEXT NOT NULL,
|
|
14
|
-
description TEXT,
|
|
15
|
-
applies_to TEXT NOT NULL,
|
|
16
|
-
subject_handling TEXT NOT NULL,
|
|
17
|
-
input_schema TEXT NOT NULL,
|
|
18
|
-
steps TEXT NOT NULL,
|
|
19
|
-
notification_policy TEXT NOT NULL,
|
|
20
|
-
created_at TEXT NOT NULL,
|
|
21
|
-
updated_at TEXT NOT NULL
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
CREATE TABLE IF NOT EXISTS subject_views (
|
|
25
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
26
|
-
name TEXT NOT NULL,
|
|
27
|
-
subject_type TEXT NOT NULL,
|
|
28
|
-
workflow_id TEXT NOT NULL,
|
|
29
|
-
query TEXT NOT NULL,
|
|
30
|
-
description TEXT,
|
|
31
|
-
query_template TEXT,
|
|
32
|
-
provider_instance_id TEXT NOT NULL DEFAULT '',
|
|
33
|
-
"order" INTEGER NOT NULL DEFAULT 0
|
|
34
|
-
);
|
|
35
|
-
CREATE INDEX IF NOT EXISTS subject_views_subject_type_idx
|
|
36
|
-
ON subject_views (subject_type);
|
|
37
|
-
|
|
38
|
-
CREATE TABLE IF NOT EXISTS job_batches (
|
|
39
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
40
|
-
workflow_id TEXT NOT NULL,
|
|
41
|
-
selection TEXT NOT NULL,
|
|
42
|
-
resolved_subjects TEXT NOT NULL,
|
|
43
|
-
status TEXT NOT NULL,
|
|
44
|
-
triggered_by TEXT NOT NULL,
|
|
45
|
-
schedule_id TEXT,
|
|
46
|
-
notification_override TEXT,
|
|
47
|
-
notification_sent INTEGER NOT NULL,
|
|
48
|
-
created_at TEXT NOT NULL,
|
|
49
|
-
completed_at TEXT
|
|
50
|
-
);
|
|
51
|
-
CREATE INDEX IF NOT EXISTS job_batches_workflow_id_idx ON job_batches (workflow_id);
|
|
52
|
-
CREATE INDEX IF NOT EXISTS job_batches_schedule_id_idx ON job_batches (schedule_id);
|
|
53
|
-
|
|
54
|
-
CREATE TABLE IF NOT EXISTS jobs (
|
|
55
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
56
|
-
workflow_id TEXT NOT NULL REFERENCES workflow_definitions(id),
|
|
57
|
-
status TEXT NOT NULL,
|
|
58
|
-
selection TEXT,
|
|
59
|
-
batch_id TEXT REFERENCES job_batches(id),
|
|
60
|
-
parent_job_id TEXT,
|
|
61
|
-
parent_step_execution_id TEXT,
|
|
62
|
-
fan_out_index INTEGER,
|
|
63
|
-
retry_of TEXT,
|
|
64
|
-
context TEXT NOT NULL,
|
|
65
|
-
worktree_path TEXT,
|
|
66
|
-
branch TEXT,
|
|
67
|
-
current_step_id TEXT,
|
|
68
|
-
current_step_execution_id TEXT,
|
|
69
|
-
created_at TEXT NOT NULL,
|
|
70
|
-
updated_at TEXT NOT NULL,
|
|
71
|
-
completed_at TEXT
|
|
72
|
-
);
|
|
73
|
-
CREATE INDEX IF NOT EXISTS jobs_workflow_id_idx ON jobs (workflow_id);
|
|
74
|
-
CREATE INDEX IF NOT EXISTS jobs_status_idx ON jobs (status);
|
|
75
|
-
CREATE INDEX IF NOT EXISTS jobs_batch_id_idx ON jobs (batch_id);
|
|
76
|
-
CREATE INDEX IF NOT EXISTS jobs_parent_job_id_idx ON jobs (parent_job_id);
|
|
77
|
-
|
|
78
|
-
CREATE TABLE IF NOT EXISTS job_subjects (
|
|
79
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
80
|
-
job_id TEXT NOT NULL REFERENCES jobs(id),
|
|
81
|
-
subject_type TEXT NOT NULL,
|
|
82
|
-
subject_id TEXT NOT NULL,
|
|
83
|
-
snapshot TEXT NOT NULL
|
|
84
|
-
);
|
|
85
|
-
CREATE INDEX IF NOT EXISTS job_subjects_job_id_idx ON job_subjects (job_id);
|
|
86
|
-
CREATE INDEX IF NOT EXISTS job_subjects_subject_lookup_idx
|
|
87
|
-
ON job_subjects (subject_type, subject_id);
|
|
88
|
-
|
|
89
|
-
CREATE TABLE IF NOT EXISTS job_step_executions (
|
|
90
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
91
|
-
job_id TEXT NOT NULL REFERENCES jobs(id),
|
|
92
|
-
step_definition_id TEXT NOT NULL,
|
|
93
|
-
type TEXT NOT NULL,
|
|
94
|
-
status TEXT NOT NULL,
|
|
95
|
-
started_at TEXT,
|
|
96
|
-
completed_at TEXT,
|
|
97
|
-
output TEXT,
|
|
98
|
-
error TEXT,
|
|
99
|
-
child_job_ids TEXT,
|
|
100
|
-
parent_step_execution_id TEXT REFERENCES job_step_executions(id),
|
|
101
|
-
iteration_index INTEGER
|
|
102
|
-
);
|
|
103
|
-
CREATE INDEX IF NOT EXISTS job_step_executions_job_id_idx ON job_step_executions (job_id);
|
|
104
|
-
CREATE INDEX IF NOT EXISTS job_step_executions_parent_idx
|
|
105
|
-
ON job_step_executions (parent_step_execution_id);
|
|
106
|
-
|
|
107
|
-
CREATE TABLE IF NOT EXISTS schedules (
|
|
108
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
109
|
-
view_id TEXT NOT NULL,
|
|
110
|
-
trigger_type TEXT NOT NULL,
|
|
111
|
-
cadence TEXT NOT NULL,
|
|
112
|
-
notification_override TEXT,
|
|
113
|
-
missed_fire_policy TEXT NOT NULL,
|
|
114
|
-
enabled INTEGER NOT NULL,
|
|
115
|
-
last_fired_at TEXT,
|
|
116
|
-
created_at TEXT NOT NULL
|
|
117
|
-
);
|
|
118
|
-
CREATE INDEX IF NOT EXISTS schedules_enabled_idx ON schedules (enabled);
|
|
119
|
-
|
|
120
|
-
CREATE TABLE IF NOT EXISTS workflow_shortcuts (
|
|
121
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
122
|
-
name TEXT NOT NULL,
|
|
123
|
-
workflow_id TEXT NOT NULL,
|
|
124
|
-
input_values TEXT NOT NULL,
|
|
125
|
-
last_job_id TEXT,
|
|
126
|
-
"order" INTEGER NOT NULL DEFAULT 0
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
CREATE TABLE IF NOT EXISTS settings (
|
|
130
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
131
|
-
data TEXT NOT NULL
|
|
132
|
-
);
|
|
133
|
-
`),_u(n)}var yi=p(()=>{"use strict"});import{Injectable as vu}from"@nestjs/common";import{mkdirSync as Eu}from"node:fs";import{dirname as xu}from"node:path";import{fileURLToPath as Tu}from"node:url";import{DatabaseSync as wi}from"node:sqlite";var Iu,ju,z,bi=p(()=>{"use strict";gi();yi();Iu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ju=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},z=class{sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??Tu(new URL("../../data/kno.db",import.meta.url));t===":memory:"?this.sqlite=new wi(":memory:"):(Eu(xu(t),{recursive:!0}),this.sqlite=new wi(t)),this.db=hi(this.sqlite),qr(this.sqlite)}async onModuleInit(){qr(this.sqlite)}getDb(){return this.db}getSqlite(){return this.sqlite}};z=Iu([vu(),ju("design:paramtypes",[])],z)});import{Injectable as Au}from"@nestjs/common";import{eq as Si}from"drizzle-orm";var Ru,Pu,k,at=p(()=>{"use strict";zt();Ru=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Pu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},k=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(pe).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(pe).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(Si(pe.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(pe).where(Si(pe.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}}};k=Ru([Au(),Pu("design:paramtypes",[Object,Function])],k)});import{Injectable as Nu}from"@nestjs/common";import{eq as $r}from"drizzle-orm";var Ou,ku,_i,Y,en=p(()=>{"use strict";Pr();Ou=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ku=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_i=["ticket","pull_request","documentation"],Y=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert(le).values({id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,query:e.query,description:e.description??null,queryTemplate:e.queryTemplate??null,providerInstanceId:e.providerInstanceId,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.subjectViews.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.queryTemplate!==void 0?t.queryTemplate:t.query!==void 0?void 0:r.queryTemplate;return await this.db.update(le).set({name:t.name??r.name,subjectType:t.subjectType??r.subjectType,workflowId:t.workflowId??r.workflowId,query:t.query??r.query,description:t.description!==void 0?t.description??null:r.description??null,queryTemplate:o??null,providerInstanceId:t.providerInstanceId??r.providerInstanceId}).where($r(le.id,e)),this.get(e)}async list(e={}){let t=e.subjectType?await this.db.query.subjectViews.findMany({where:{subjectType:e.subjectType}}):await this.db.query.subjectViews.findMany();return this.sortViews(t.map(r=>this.toDomain(r)))}async reorder(e){let t=[];for(let o of e){let i=await this.get(o);if(!i)return[];t.push(i)}let r=t[0].subjectType;if(!t.every(o=>o.subjectType===r))return[];for(let o=0;o<e.length;o+=1)await this.db.update(le).set({order:o}).where($r(le.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(le).where($r(le.id,e)),!0):!1}async nextOrder(e){let t=await this.db.query.subjectViews.findMany({where:{subjectType:e}});return t.length===0?0:Math.max(...t.map(r=>r.order))+1}sortViews(e){return[...e].sort((t,r)=>{let o=_i.indexOf(t.subjectType)-_i.indexOf(r.subjectType);return o!==0?o:t.order-r.order})}toDomain(e){return{id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,providerInstanceId:e.providerInstanceId,query:e.query,order:e.order,...e.description!=null?{description:e.description}:{},...e.queryTemplate!=null?{queryTemplate:e.queryTemplate}:{}}}};Y=Ou([Nu(),ku("design:paramtypes",[Object])],Y)});import{Injectable as $u}from"@nestjs/common";import{and as Du,desc as Bu,eq as Ot,inArray as Lu}from"drizzle-orm";import{randomUUID as Uu}from"node:crypto";function Fu(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function Ju(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function ji(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(...ji(n,s.stepExecutions,i.id,s.index));return o}function Mu(n){let e=new Map;for(let o of n){let i=o.parentStepExecutionId,s=e.get(i)??[];s.push(o),e.set(i,s)}let t=o=>{let i=e.get(o)??[];if(i.length===0)return;let s=new Map;for(let a of i){if(a.iterationIndex==null)continue;let u=s.get(a.iterationIndex)??[];u.push(a),s.set(a.iterationIndex,u)}if(s.size!==0)return[...s.entries()].sort(([a],[u])=>a-u).map(([a,u])=>{let c=u.map(f=>Ii(f,t(f.id)));return{index:a,stepExecutions:c,startedAt:Hu(c),...Wu(c)?{completedAt:Ku(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Ii(o,t(o.id)))}function Ii(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 Hu(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 Ku(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function Wu(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function Vu(n){return n==="completed"||n==="failed"||n==="cancelled"}var Cu,qu,N,ct=p(()=>{"use strict";Tt();Ar();Or();Cu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},qu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},N=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(B).values(this.jobToRow(e)),await this.replaceSubjects(e.id,e.subjectContext),await this.replaceStepExecutions(e.id,e.stepHistory),await this.get(e.id)}async get(e){let t=await this.db.query.jobs.findFirst({where:{id:e},with:{subjects:!0,stepExecutions:!0}});return t?this.toDomain(t,t.subjects,t.stepExecutions):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o={...r,...t,id:e,context:t.context??r.context,stepHistory:t.stepHistory??r.stepHistory,updatedAt:t.updatedAt??new Date().toISOString()};return await this.db.update(B).set({workflowId:o.workflowId,status:o.status,selection:o.selection??null,batchId:o.batchId??null,parentJobId:o.parentJobId??null,parentStepExecutionId:o.parentStepExecutionId??null,fanOutIndex:o.fanOutIndex??null,retryOf:o.retryOf??null,context:o.context,worktreePath:o.worktreePath??null,branch:o.branch??null,currentStepId:o.currentStepId??null,currentStepExecutionId:o.currentStepExecutionId??null,createdAt:o.createdAt,updatedAt:o.updatedAt,completedAt:o.completedAt??null}).where(Ot(B.id,e)),t.subjectContext!==void 0&&await this.replaceSubjects(e,t.subjectContext),t.stepHistory!==void 0&&await this.replaceStepExecutions(e,t.stepHistory),this.get(e)}async list(e={}){let t={};e.workflowId!==void 0&&(t.workflowId=e.workflowId),e.status!==void 0&&(t.status=e.status),e.batchId!==void 0&&(t.batchId=e.batchId),e.parentJobId!==void 0&&(t.parentJobId=e.parentJobId),e.parentStepExecutionId!==void 0&&(t.parentStepExecutionId=e.parentStepExecutionId);let o=(Object.keys(t).length>0?await this.db.query.jobs.findMany({where:t,with:{subjects:!0,stepExecutions:!0}}):await this.db.query.jobs.findMany({with:{subjects:!0,stepExecutions:!0}})).map(s=>this.toDomain(s,s.subjects,s.stepExecutions)),i=e.topLevelOnly?o.filter(s=>s.batchId==null&&s.parentJobId==null):o;return e.terminal===void 0?i:i.filter(s=>Vu(s.status)===e.terminal)}async latestBySubject(e,t){let r={};for(let c of t)r[c]=null;if(t.length===0)return r;let o=await this.db.select({subjectId:me.subjectId,jobId:B.id,createdAt:B.createdAt}).from(me).innerJoin(B,Ot(me.jobId,B.id)).where(Du(Ot(B.workflowId,e),Lu(me.subjectId,t))).orderBy(Bu(B.createdAt)),i=new Map;for(let c of o)i.has(c.subjectId)||i.set(c.subjectId,c.jobId);let s=[...new Set(i.values())],a=await Promise.all(s.map(c=>this.get(c))),u=new Map(a.filter(c=>c!=null).map(c=>[c.id,c]));for(let[c,f]of i)r[c]=u.get(f)??null;return r}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,context:e.context,worktreePath:e.worktreePath??null,branch:e.branch??null,currentStepId:e.currentStepId??null,currentStepExecutionId:e.currentStepExecutionId??null,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt??null}}async replaceSubjects(e,t){await this.db.delete(me).where(Ot(me.jobId,e));let r=Fu(t);r.length!==0&&await this.db.insert(me).values(r.map(o=>({id:Uu(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(Ye).where(Ot(Ye.jobId,e));let r=ji(e,t);r.length!==0&&await this.db.insert(Ye).values(r)}toDomain(e,t,r){let o=Ju(t.map(s=>s.snapshot)),i=Mu(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}:{},context:e.context,...e.worktreePath!=null?{worktreePath:e.worktreePath}:{},...e.branch!=null?{branch:e.branch}:{},...e.currentStepId!=null?{currentStepId:e.currentStepId}:{},...e.currentStepExecutionId!=null?{currentStepExecutionId:e.currentStepExecutionId}:{},stepHistory:i,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};N=Cu([$u(),qu("design:paramtypes",[Object])],N)});import{Injectable as Qu}from"@nestjs/common";import{eq as zu}from"drizzle-orm";var Gu,Xu,Z,tn=p(()=>{"use strict";Yt();Gu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Xu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert($e).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($e).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(zu($e.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}:{}}}};Z=Gu([Qu(),Xu("design:paramtypes",[Object])],Z)});import{Injectable as ed}from"@nestjs/common";import{eq as vi}from"drizzle-orm";var Yu,Zu,Ee,Dr=p(()=>{"use strict";kr();Yu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ee=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(Be).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(Be).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(vi(Be.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(Be).where(vi(Be.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}}};Ee=Yu([ed(),Zu("design:paramtypes",[Object])],Ee)});import{Injectable as rd}from"@nestjs/common";import{eq as Br}from"drizzle-orm";var td,nd,xe,Lr=p(()=>{"use strict";Nr();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},nd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xe=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(he).values({id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,lastJobId:e.lastJobId??null,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowShortcuts.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(he).set({name:t.name??r.name,workflowId:t.workflowId??r.workflowId,inputValues:t.inputValues??r.inputValues,lastJobId:t.lastJobId!==void 0?t.lastJobId??null:r.lastJobId??null}).where(Br(he.id,e)),this.get(e)):null}async list(){return(await this.db.query.workflowShortcuts.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.order-r.order)}async reorder(e){let t=[];for(let r of e){let o=await this.get(r);if(!o)return[];t.push(o)}for(let r=0;r<e.length;r+=1)await this.db.update(he).set({order:r}).where(Br(he.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(he).where(Br(he.id,e)),!0):!1}async nextOrder(){let e=await this.db.query.workflowShortcuts.findMany();return e.length===0?0:Math.max(...e.map(t=>t.order))+1}toDomain(e){return{id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,order:e.order,...e.lastJobId!=null?{lastJobId:e.lastJobId}:{}}}};xe=td([rd(),nd("design:paramtypes",[Object])],xe)});import{z as v}from"zod";var Ei,xi,Ti,Ur,nn,Ri,Fr=p(()=>{"use strict";Ei=v.object({name:v.string().min(1),label:v.string().min(1),type:v.enum(["string","select"]),options:v.array(v.string()).optional(),required:v.boolean()}),xi=v.object({id:v.string().min(1),label:v.string().min(1),params:v.array(Ei)}),Ti=v.object({actionId:v.string().min(1),label:v.string().min(1),params:v.array(Ei)}),Ur=v.object({templateId:v.string().min(1),params:v.record(v.string(),v.unknown())}),nn=v.object({params:v.record(v.string(),v.unknown())}),Ri=v.object({query:v.record(v.string(),v.unknown())})});import{z as K}from"zod";var G,rn,on,sn,an,cn=p(()=>{"use strict";Fr();G=K.enum(["ticket","pull_request","documentation"]),rn=K.object({id:K.string().min(1),name:K.string().min(1),subjectType:G,workflowId:K.string().min(1),providerInstanceId:K.string().min(1),query:K.record(K.string(),K.unknown()),description:K.string().optional(),queryTemplate:Ur.optional(),order:K.number().int().nonnegative()}),on=rn.omit({order:!0}),sn=rn.partial().omit({id:!0,order:!0}).extend({queryTemplate:Ur.nullable().optional()}),an=K.object({viewIds:K.array(K.string().min(1)).min(1)})});var Pi=p(()=>{"use strict";cn()});var Ai=p(()=>{"use strict";Fr()});function od(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function Oi(n,e){let t=e instanceof Set?e:new Set(e),r=od(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function ki(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&ki(t.steps,e)}function Ni(n){let e=[];ki(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 Ci(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 Jr=p(()=>{"use strict"});import{z as l}from"zod";var id,kt,sd,Le,qi,$i,Di,Bi,Li,Ui,Fi,Ji,ad,Mi,Hi,Nt,cd,ud,dd,pd,ld,fd,md,Ki,ut,Wi=p(()=>{"use strict";cn();Jr();id=l.enum(["on_fail","on_complete","on_needs_input"]),kt=l.object({triggers:l.array(id),messageTemplate:l.string().optional()}),sd=l.object({name:l.string().min(1),label:l.string().min(1),type:l.enum(["string","number","boolean","select"]),options:l.array(l.string()).optional(),required:l.boolean(),defaultValue:l.unknown().optional()}),Le=l.string().min(1),qi=l.object({type:l.literal("agent"),id:l.string().min(1),name:Le,objective:l.string().min(1),knowledgeScope:l.array(l.enum(["user","organization","project"])).optional(),outputFormat:l.enum(["questionnaire","confirmation","comment_suggestions","free_text"]),agentInstanceId:l.string().min(1).optional()}),$i=l.object({type:l.literal("interaction"),id:l.string().min(1),name:Le,interaction:l.union([l.literal("questionnaire"),l.literal("confirmation"),l.literal("conversation")]),notify:l.boolean().optional()}),Di=l.object({type:l.literal("shell"),id:l.string().min(1),name:Le,command:l.string().min(1)}),Bi=l.object({type:l.literal("git"),id:l.string().min(1),name:Le,operation:l.enum(["create_worktree","checkout","create_branch","commit","push"]),params:l.record(l.string(),l.unknown())}),Li=l.object({type:l.literal("provider_action"),id:l.string().min(1),name:Le,action:l.enum(["get_subject","get_comments","post_comment","update_status","get_content"]),params:l.record(l.string(),l.unknown()).optional(),extendedAction:l.object({providerId:l.string().min(1),actionId:l.string().min(1),params:l.record(l.string(),l.unknown()).optional()}).optional(),target:l.object({subjectType:G,source:l.string().min(1),subjectId:l.string().min(1)}).optional()}),Ui=l.object({type:l.literal("sub_workflow"),id:l.string().min(1),name:Le,workflowId:l.string().min(1),forEach:l.literal("selection")}),Fi=l.discriminatedUnion("type",[l.object({type:l.literal("field_empty"),stepId:l.string().min(1),field:l.string().min(1)}),l.object({type:l.literal("field_equals"),stepId:l.string().min(1),field:l.string().min(1),value:l.unknown()})]),Ji=l.discriminatedUnion("action",[l.object({action:l.literal("fail")}),l.object({action:l.literal("continue")}),l.object({action:l.literal("ask_human")})]),ad=l.object({type:l.literal("loop"),id:l.string().min(1),name:Le,steps:l.array(l.lazy(()=>Mi)),until:Fi,maxIterations:l.number().int().nonnegative(),onMaxIterations:Ji}),Mi=l.lazy(()=>l.discriminatedUnion("type",[Bi,Li,Di,qi,$i,Ui,ad])),Hi=l.object({id:l.string().min(1),name:l.string().min(1),description:l.string().optional(),appliesTo:l.union([G,l.array(G),l.literal("none")]),subjectHandling:l.enum(["per-subject","collection"]),inputSchema:l.array(sd),steps:l.array(Mi),notificationPolicy:kt}),Nt=Hi.superRefine((n,e)=>{let t=Ni(n.steps);t.length!==0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`})}),cd=qi.extend({id:l.string().min(1).optional()}),ud=$i.extend({id:l.string().min(1).optional()}),dd=Di.extend({id:l.string().min(1).optional()}),pd=Bi.extend({id:l.string().min(1).optional()}),ld=Li.extend({id:l.string().min(1).optional()}),fd=Ui.extend({id:l.string().min(1).optional()}),md=l.object({type:l.literal("loop"),id:l.string().min(1).optional(),name:Le,steps:l.array(l.lazy(()=>Ki)),until:Fi,maxIterations:l.number().int().nonnegative(),onMaxIterations:Ji}),Ki=l.lazy(()=>l.discriminatedUnion("type",[pd,ld,dd,cd,ud,fd,md])),ut=Hi.omit({id:!0,steps:!0}).extend({id:l.string().min(1).optional(),steps:l.array(Ki)})});function hd(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function Vi(n,e){return hd(n).includes(e)}var Gi=p(()=>{"use strict"});var Xi=p(()=>{"use strict";Wi();Jr();Gi()});var Qi=p(()=>{"use strict"});var zi=p(()=>{"use strict";Qi()});var Yi=p(()=>{"use strict"});var Zi=p(()=>{"use strict";Yi()});var es=p(()=>{"use strict"});var ts=p(()=>{"use strict";es()});import{z as W}from"zod";var dt,ns=p(()=>{"use strict";dt=W.object({id:W.string().min(1),viewId:W.string().min(1),trigger:W.object({type:W.literal("cron"),cadence:W.string().min(1)}),notificationOverride:W.object({triggers:W.array(W.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:W.string().optional()}).optional(),missedFirePolicy:W.enum(["skip","catch_up"]),enabled:W.boolean(),lastFiredAt:W.string().optional(),createdAt:W.string()})});var rs=p(()=>{"use strict";ns()});import{z as ee}from"zod";var un,dn,pn,ln,os=p(()=>{"use strict";un=ee.object({id:ee.string().min(1),name:ee.string().min(1),workflowId:ee.string().min(1),inputValues:ee.record(ee.string(),ee.unknown()),lastJobId:ee.string().min(1).optional(),order:ee.number().int().nonnegative()}),dn=un.omit({order:!0}),pn=un.partial().omit({id:!0,order:!0}),ln=ee.object({shortcutIds:ee.array(ee.string().min(1)).min(1)})});var is=p(()=>{"use strict";os()});import{z as w}from"zod";function Mr(n){return n.kind==="subject"}function pt(n){return n.kind==="agent"}var gd,ss,as,cs,us,fn,mn,hn,gn,yn,wn,ds,ps,ls=p(()=>{"use strict";cn();gd=w.enum(["jira","bitbucket","github","confluence","manual"]),ss=w.enum(["claude","cursor"]),as={id:w.string().min(1),displayName:w.string().min(1),config:w.record(w.string(),w.unknown()),secretKey:w.string().min(1),expiresOn:w.string().min(1).optional()},cs=w.object({...as,kind:w.literal("subject"),type:gd,subjectType:G}),us=w.object({...as,kind:w.literal("agent"),type:ss}),fn=w.discriminatedUnion("kind",[cs,us]),mn=w.object({providerInstances:w.array(fn).default([]),defaultAgentInstanceId:w.string().min(1).optional()}),hn=w.object({providerInstances:w.array(fn).optional(),defaultAgentInstanceId:w.string().min(1).nullable().optional()}),gn=w.discriminatedUnion("kind",[cs.extend({defaultAgent:w.boolean().optional()}),us.extend({defaultAgent:w.boolean().optional()})]),yn=w.object({displayName:w.string().min(1).optional(),config:w.record(w.string(),w.unknown()).optional(),secretKey:w.string().min(1).optional(),expiresOn:w.union([w.string().min(1),w.null()]).optional(),defaultAgent:w.boolean().optional()}),wn=w.object({type:ss,apiKey:w.string().min(1).optional(),instanceId:w.string().min(1).optional()}),ds=w.object({id:w.string().min(1),displayName:w.string().min(1)}),ps={providerInstances:[]}});var fs=p(()=>{"use strict";ls()});var ms=p(()=>{"use strict"});var hs=p(()=>{"use strict";ms()});var q=p(()=>{"use strict";Pi();Ai();Xi();zi();Zi();ts();rs();is();fs();hs()});import{Injectable as bd}from"@nestjs/common";import{eq as Sd}from"drizzle-orm";function _d(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 Hr({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function Hr(n){return{providerInstances:n.providerInstances??ps.providerInstances,...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function gs(n){return n.providerInstances!==void 0}var yd,wd,x,Ue=p(()=>{"use strict";q();Cr();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},wd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},x=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:At}});return Hr(e?e.data:{})}async update(e){let t=_d(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:At}})?await this.db.update(st).set({data:t}).where(Sd(st.id,At)):await this.db.insert(st).values({id:At,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};x=yd([bd(),wd("design:paramtypes",[Object])],x)});import{Module as jd}from"@nestjs/common";var Id,vd,ge,Ct=p(()=>{"use strict";bi();at();en();ct();tn();Dr();Lr();Ue();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},vd=[k,Y,N,Z,Ee,xe,x],ge=class{};ge=Id([jd({providers:[z,{provide:k,useFactory:n=>new k(n.getDb(),n.getSqlite()),inject:[z]},{provide:Y,useFactory:n=>new Y(n.getDb()),inject:[z]},{provide:N,useFactory:n=>new N(n.getDb()),inject:[z]},{provide:Z,useFactory:n=>new Z(n.getDb()),inject:[z]},{provide:Ee,useFactory:n=>new Ee(n.getDb()),inject:[z]},{provide:xe,useFactory:n=>new xe(n.getDb()),inject:[z]},{provide:x,useFactory:n=>new x(n.getDb()),inject:[z]}],exports:[z,...vd]})],ge)});import{Injectable as Td,Logger as Rd,Inject as ws}from"@nestjs/common";async function bs(n,e){let t=[];for(let r of e){let o=await n.get(r.secretKey);t.push({providerId:r.id,secretKey:r.secretKey,configured:typeof o=="string"&&o.length>0})}return t}async function Pd(n,e,t){let r=await bs(n,e);for(let o of r)o.configured||t(`Provider instance '${o.providerId}' API key not configured (looked up as '${o.secretKey}'). GET /api/providers/status lists what's missing; store a key with: POST /api/secrets/${o.secretKey} or npm --workspace apps/engine run set-secret -- ${o.secretKey} <value>`)}var Ed,xd,ys,Kr,Fe,Wr=p(()=>{"use strict";Ue();je();Ed=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ys=function(n,e){return function(t,r){e(t,r,n)}};Fe=Kr=class{secrets;settings;logger=new Rd(Kr.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await Pd(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return bs(this.secrets,e.providerInstances??[])}};Fe=Kr=Ed([Td(),ys(0,ws(re)),ys(1,ws(x)),xd("design:paramtypes",[Function,x])],Fe)});function bn(n,e=ot(n)){let t=Nd[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function Ss(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 Od){let o=e.get(r);o?.length&&t.push(`## ${Ad[r]}
|
|
2
|
+
var d=(n,e)=>()=>(n&&(e=n(n=0)),e);import{Controller as tu,Get as nu}from"@nestjs/common";var ni,xr,Et,ri=d(()=>{"use strict";ni=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Et=class{getHealth(){return{ok:!0,service:"kno-engine",timestamp:new Date().toISOString()}}};ni([nu(),xr("design:type",Function),xr("design:paramtypes",[]),xr("design:returntype",Object)],Et.prototype,"getHealth",null);Et=ni([tu("health")],Et)});import{Module as ou}from"@nestjs/common";var ru,zt,oi=d(()=>{"use strict";ru=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zt=class{};zt=ru([ou({})],zt)});import{Module as su}from"@nestjs/common";var iu,Xt,ii=d(()=>{"use strict";iu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Xt=class{};Xt=iu([su({})],Xt)});var Pt,Er=d(()=>{"use strict";Pt=Symbol("NOTIFICATION_PROVIDER")});var Zt,si=d(()=>{"use strict";Zt=class{async send(e){console.log("[notification]",JSON.stringify(e))}}});var Rt,Pr=d(()=>{"use strict";Rt=Symbol("KNOWLEDGE_PROVIDER")});import{readdir as au,readFile as cu}from"node:fs/promises";import{join as ai}from"node:path";var Yt,ci=d(()=>{"use strict";Yt=class{baseDir;constructor(e){this.baseDir=e}async resolve(e,t){let r=ai(this.baseDir,e),o;try{o=await au(r)}catch(a){if(a.code==="ENOENT")return[];throw a}let i=o.filter(a=>a.endsWith(".md")).sort(),s=[];for(let a of i){let u=ai(r,a),c=await cu(u,"utf8");s.push({tier:e,content:c,sourceRef:u})}return s}}});import{existsSync as ui}from"node:fs";import{dirname as uu,join as At}from"node:path";import{fileURLToPath as du}from"node:url";function kt(){let n=uu(du(import.meta.url)),e=At(n,"../data"),t=At(n,"../../data");return ui(At(e,"kno.db"))?e:ui(At(t,"kno.db"))?t:e}function di(){return At(kt(),"kno.db")}var en=d(()=>{"use strict"});import{createCipheriv as pu,createDecipheriv as lu,randomBytes as pi}from"node:crypto";import{mkdir as li,readFile as fi,writeFile as mi}from"node:fs/promises";import{join as Ar}from"node:path";function st(n){return`kno.${n}.apiKey`}function gu(n){return Ar(n,"secrets")}function gi(n){return new kr(gu(n.dataDir),n.keyring)}function yu(n){try{return n(tn,"__kno_probe__").getPassword(),!0}catch(e){return Tr(e)}}function Tr(n){let e=n instanceof Error?n.message:String(n);return/noentry|no matching entry|not found|no such/i.test(e)}var tn,hi,fu,Rr,mu,hu,kr,oe,_e=d(()=>{"use strict";tn="kno-flows";hi="aes-256-gcm",fu=12,Rr=32,mu="master.key",hu="store.json",kr=class{secretsDir;keyring;keyringResolved=!1;masterKey=null;constructor(e,t){this.secretsDir=e,this.keyring=t,t!==void 0&&(this.keyringResolved=!0)}async get(e){let t=await this.resolveKeyring();if(t)try{let r=t(tn,e).getPassword();if(r!=null)return r}catch(r){Tr(r)||this.disableKeyring()}return this.fileGet(e)}async set(e,t){let r=await this.resolveKeyring();if(r)try{r(tn,e).setPassword(t),await this.fileDelete(e);return}catch{this.disableKeyring()}await this.fileSet(e,t)}async delete(e){let t=await this.resolveKeyring();if(t)try{t(tn,e).deletePassword()}catch(r){Tr(r)||this.disableKeyring()}await this.fileDelete(e)}disableKeyring(){this.keyring=null,this.keyringResolved=!0}async resolveKeyring(){if(this.keyringResolved)return this.keyring??null;this.keyringResolved=!0;try{let{Entry:e}=await import("@napi-rs/keyring"),t=(r,o)=>new e(r,o);return yu(t)?(this.keyring=t,t):(this.keyring=null,null)}catch{return this.keyring=null,null}}async fileGet(e){let r=(await this.readStore())[e];return r?this.decrypt(r):null}async fileSet(e,t){let r=await this.readStore();r[e]=await this.encrypt(t),await this.writeStore(r)}async fileDelete(e){let t=await this.readStore();e in t&&(delete t[e],await this.writeStore(t))}async readStore(){try{let e=await fi(this.storePath(),"utf8"),t=JSON.parse(e);if(t==null||typeof t!="object"||Array.isArray(t))throw new Error(`Corrupt secret store at ${this.storePath()}`);return t}catch(e){if(e.code==="ENOENT")return{};throw e}}async writeStore(e){await li(this.secretsDir,{recursive:!0}),await mi(this.storePath(),JSON.stringify(e,null,2),{encoding:"utf8",mode:384})}async encrypt(e){let t=await this.loadOrCreateMasterKey(),r=pi(fu),o=pu(hi,t,r),i=Buffer.concat([o.update(e,"utf8"),o.final()]);return{iv:r.toString("base64"),tag:o.getAuthTag().toString("base64"),ciphertext:i.toString("base64")}}async decrypt(e){let t=await this.loadOrCreateMasterKey(),r=lu(hi,t,Buffer.from(e.iv,"base64"));return r.setAuthTag(Buffer.from(e.tag,"base64")),Buffer.concat([r.update(Buffer.from(e.ciphertext,"base64")),r.final()]).toString("utf8")}async loadOrCreateMasterKey(){if(this.masterKey)return this.masterKey;await li(this.secretsDir,{recursive:!0});let e=this.masterKeyPath();try{let r=(await fi(e,"utf8")).trim(),o=Buffer.from(r,"hex");if(o.length!==Rr)throw new Error(`Secret store master key at ${e} is not ${Rr} bytes`);return this.masterKey=o,o}catch(r){if(r.code!=="ENOENT")throw r}let t=pi(Rr);return await mi(e,t.toString("hex"),{encoding:"utf8",mode:384}),this.masterKey=t,t}storePath(){return Ar(this.secretsDir,hu)}masterKeyPath(){return Ar(this.secretsDir,mu)}};oe=Symbol("SECRET_STORE")});import{Module as bu}from"@nestjs/common";import{mkdirSync as Su}from"node:fs";var wu,yi,at,Or=d(()=>{"use strict";en();_e();wu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},yi=kt();Su(yi,{recursive:!0});at=class{};at=wu([bu({providers:[{provide:oe,useFactory:()=>gi({dataDir:yi})}],exports:[oe]})],at)});import{index as Iu,sqliteTable as ju,text as pe}from"drizzle-orm/sqlite-core";var $e,qr=d(()=>{"use strict";$e=ju("workflow_definitions",{id:pe("id").primaryKey(),name:pe("name").notNull(),description:pe("description"),appliesTo:pe("applies_to",{mode:"json"}).$type().notNull(),subjectHandling:pe("subject_handling",{enum:["per-subject","collection"]}).notNull(),inputSchema:pe("input_schema",{mode:"json"}).$type().notNull(),steps:pe("steps",{mode:"json"}).$type().notNull(),notificationPolicy:pe("notification_policy",{mode:"json"}).$type().notNull(),createdAt:pe("created_at").notNull(),updatedAt:pe("updated_at").notNull()},n=>[Iu("workflow_definitions_subject_handling_idx").on(n.subjectHandling)])});import{index as wi,integer as vu,sqliteTable as _u,text as Ce}from"drizzle-orm/sqlite-core";var le,$r=d(()=>{"use strict";le=_u("subject_views",{id:Ce("id").primaryKey(),name:Ce("name").notNull(),subjectType:Ce("subject_type").$type().notNull(),workflowId:Ce("workflow_id").notNull(),query:Ce("query",{mode:"json"}).$type().notNull(),description:Ce("description"),queryTemplate:Ce("query_template",{mode:"json"}).$type(),providerInstanceId:Ce("provider_instance_id").notNull().default(""),order:vu("order").notNull().default(0)},n=>[wi("subject_views_subject_type_idx").on(n.subjectType),wi("subject_views_subject_type_order_idx").on(n.subjectType,n.order)])});import{index as bi,integer as xu,sqliteTable as Eu,text as fe}from"drizzle-orm/sqlite-core";var De,nn=d(()=>{"use strict";De=Eu("job_batches",{id:fe("id").primaryKey(),workflowId:fe("workflow_id").notNull(),selection:fe("selection",{mode:"json"}).$type().notNull(),resolvedSubjects:fe("resolved_subjects",{mode:"json"}).$type().notNull(),status:fe("status",{enum:["running","completed","completed_with_issues","failed"]}).notNull(),triggeredBy:fe("triggered_by",{enum:["schedule","view_bulk","multiselect"]}).notNull(),scheduleId:fe("schedule_id"),notificationOverride:fe("notification_override",{mode:"json"}).$type(),notificationSent:xu("notification_sent",{mode:"boolean"}).notNull(),createdAt:fe("created_at").notNull(),completedAt:fe("completed_at")},n=>[bi("job_batches_workflow_id_idx").on(n.workflowId),bi("job_batches_schedule_id_idx").on(n.scheduleId)])});import{index as rn,integer as Pu,sqliteTable as Ru,text as C}from"drizzle-orm/sqlite-core";var B,Tt=d(()=>{"use strict";nn();B=Ru("jobs",{id:C("id").primaryKey(),workflowId:C("workflow_id").notNull(),status:C("status").$type().notNull(),selection:C("selection",{mode:"json"}).$type(),batchId:C("batch_id").references(()=>De.id),parentJobId:C("parent_job_id"),parentStepExecutionId:C("parent_step_execution_id"),fanOutIndex:Pu("fan_out_index"),retryOf:C("retry_of"),workflowSnapshot:C("workflow_snapshot",{mode:"json"}).$type(),context:C("context",{mode:"json"}).$type().notNull(),worktreePath:C("worktree_path"),branch:C("branch"),currentStepId:C("current_step_id"),currentStepExecutionId:C("current_step_execution_id"),createdAt:C("created_at").notNull(),updatedAt:C("updated_at").notNull(),completedAt:C("completed_at")},n=>[rn("jobs_workflow_id_idx").on(n.workflowId),rn("jobs_status_idx").on(n.status),rn("jobs_batch_id_idx").on(n.batchId),rn("jobs_parent_job_id_idx").on(n.parentJobId)])});import{index as Si,sqliteTable as Au,text as Ot}from"drizzle-orm/sqlite-core";var me,Cr=d(()=>{"use strict";Tt();me=Au("job_subjects",{id:Ot("id").primaryKey(),jobId:Ot("job_id").notNull().references(()=>B.id),subjectType:Ot("subject_type").$type().notNull(),subjectId:Ot("subject_id").notNull(),snapshot:Ot("snapshot",{mode:"json"}).$type().notNull()},n=>[Si("job_subjects_job_id_idx").on(n.jobId),Si("job_subjects_subject_lookup_idx").on(n.subjectType,n.subjectId)])});import{index as Ii,integer as ku,sqliteTable as Tu,text as ie}from"drizzle-orm/sqlite-core";var ze,Dr=d(()=>{"use strict";Tt();ze=Tu("job_step_executions",{id:ie("id").primaryKey(),jobId:ie("job_id").notNull().references(()=>B.id),stepDefinitionId:ie("step_definition_id").notNull(),type:ie("type").$type().notNull(),status:ie("status").$type().notNull(),startedAt:ie("started_at"),completedAt:ie("completed_at"),output:ie("output",{mode:"json"}).$type(),error:ie("error"),childJobIds:ie("child_job_ids",{mode:"json"}).$type(),parentStepExecutionId:ie("parent_step_execution_id").references(()=>ze.id),iterationIndex:ku("iteration_index")},n=>[Ii("job_step_executions_job_id_idx").on(n.jobId),Ii("job_step_executions_parent_idx").on(n.parentStepExecutionId)])});import{index as Ou,integer as qu,sqliteTable as $u,text as Be}from"drizzle-orm/sqlite-core";var Ne,Br=d(()=>{"use strict";Ne=$u("schedules",{id:Be("id").primaryKey(),viewId:Be("view_id").notNull(),triggerType:Be("trigger_type",{enum:["cron"]}).notNull(),cadence:Be("cadence").notNull(),notificationOverride:Be("notification_override",{mode:"json"}).$type(),missedFirePolicy:Be("missed_fire_policy",{enum:["skip","catch_up"]}).notNull(),enabled:qu("enabled",{mode:"boolean"}).notNull(),lastFiredAt:Be("last_fired_at"),createdAt:Be("created_at").notNull()},n=>[Ou("schedules_enabled_idx").on(n.enabled)])});import{integer as Cu,sqliteTable as Du,text as qt}from"drizzle-orm/sqlite-core";var he,Nr=d(()=>{"use strict";he=Du("workflow_shortcuts",{id:qt("id").primaryKey(),name:qt("name").notNull(),workflowId:qt("workflow_id").notNull(),inputValues:qt("input_values",{mode:"json"}).$type().notNull(),lastJobId:qt("last_job_id"),order:Cu("order").notNull().default(0)})});import{sqliteTable as Bu,text as ji}from"drizzle-orm/sqlite-core";var $t,ct,Fr=d(()=>{"use strict";$t="default",ct=Bu("settings",{id:ji("id").primaryKey(),data:ji("data",{mode:"json"}).$type().notNull()})});import{defineRelations as Nu}from"drizzle-orm";var Fu,vi,_i=d(()=>{"use strict";qr();$r();Tt();Cr();Dr();nn();Br();Nr();Fr();Fu={workflowDefinitions:$e,subjectViews:le,jobs:B,jobSubjects:me,jobStepExecutions:ze,jobBatches:De,schedules:Ne,workflowShortcuts:he,settings:ct},vi=Nu(Fu,n=>({workflowDefinitions:{},subjectViews:{},schedules:{},workflowShortcuts:{},settings:{},jobs:{subjects:n.many.jobSubjects({from:n.jobs.id,to:n.jobSubjects.jobId}),stepExecutions:n.many.jobStepExecutions({from:n.jobs.id,to:n.jobStepExecutions.jobId}),batch:n.one.jobBatches({from:n.jobs.batchId,to:n.jobBatches.id})},jobSubjects:{job:n.one.jobs({from:n.jobSubjects.jobId,to:n.jobs.id})},jobStepExecutions:{job:n.one.jobs({from:n.jobStepExecutions.jobId,to:n.jobs.id}),parent:n.one.jobStepExecutions({from:n.jobStepExecutions.parentStepExecutionId,to:n.jobStepExecutions.id,alias:"job_step_executions_parent"}),children:n.many.jobStepExecutions({from:n.jobStepExecutions.id,to:n.jobStepExecutions.parentStepExecutionId,alias:"job_step_executions_children"})},jobBatches:{jobs:n.many.jobs({from:n.jobBatches.id,to:n.jobs.batchId})}}))});import{drizzle as Ju}from"drizzle-orm/node-sqlite";import{DatabaseSync as cg}from"node:sqlite";function xi(n){return n.exec("PRAGMA foreign_keys = ON;"),Ju({client:n,relations:vi})}var Ei=d(()=>{"use strict";_i()});import{existsSync as Pi,readdirSync as Uu}from"node:fs";import{dirname as Mu,join as Jr}from"node:path";import{fileURLToPath as Hu}from"node:url";function Ri(){let n=Mu(Hu(import.meta.url)),e=[Jr(n,"persistence/migrations"),Jr(n,"migrations")];for(let t of e)if(Lu(t))return t;throw new Error(`Engine SQL migrations not found. Looked in: ${e.join(", ")}`)}function Lu(n){return Pi(n)?Uu(n,{withFileTypes:!0}).some(e=>e.isDirectory()&&Pi(Jr(n,e.name,"migration.sql"))):!1}var Ai=d(()=>{"use strict"});import{migrate as ki}from"drizzle-orm/node-sqlite/migrator";import{readMigrationFiles as Ku}from"drizzle-orm/migrator";function Hr(n,e){let t=Ri(),r=Ku({migrationsFolder:t});if(r.length===0)throw new X(`No SQL migrations in ${t}`);let o=Ur(n,Xe),i=Oi.filter(u=>Ur(n,u));if(!o&&i.length===0){ki(e,{migrationsFolder:t}),Ti(n);return}if(!o){let u=Mr(n);if(u.length>0)throw new X(`existing database has a partial schema and cannot be upgraded automatically (${u.join("; ")}). Restore a backup or start from an empty database.`);Gu(n,r);return}Vu(n,r);let s=Mr(n),a=$i(n);if(a.length===0&&i.length>0)throw new X("migrations table exists but is empty while application tables are present \u2014 treating this as an interrupted update");if(a.length>0&&s.length>0)throw new X(`migrations journal is present but the schema is incomplete (${s.join("; ")}) \u2014 treating this as an interrupted update`);ki(e,{migrationsFolder:t}),Ti(n)}function Ur(n,e){return n.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!=null}function qi(n,e){return n.prepare(`PRAGMA table_info(${e})`).all().map(r=>r.name)}function Mr(n){let e=[];for(let t of Oi){if(!Ur(n,t)){e.push(`missing table '${t}'`);continue}let r=new Set(qi(n,t));for(let o of Wu[t])r.has(o)||e.push(`table '${t}' is missing column '${o}'`)}return e}function Ti(n){let e=Mr(n);if(e.length>0)throw new X(`schema is incomplete after migrate (${e.join("; ")})`)}function $i(n){let e=new Set(qi(n,Xe));if(!e.has("hash"))throw new X(`migrations table '${Xe}' is missing required columns`);if(!e.has("name"))throw new X(`migrations table '${Xe}' is missing column 'name' \u2014 journal is from an interrupted upgrade`);return n.prepare(`SELECT name, hash FROM ${Xe}`).all()}function Vu(n,e){let t=new Map(e.map(r=>[r.name,r]));for(let r of $i(n)){if(r.name==null||r.name==="")throw new X("migrations journal has a row with no name \u2014 treating this as an interrupted update");let o=t.get(r.name);if(!o)throw new X(`database has unknown migration '${r.name}' that is not in this Engine build`);if(r.hash!=null&&r.hash!==o.hash)throw new X(`migration '${r.name}' hash does not match this Engine build \u2014 treating this as a corrupt or interrupted update`)}}function Gu(n,e){n.exec(`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS ${Xe} (
|
|
4
|
+
id INTEGER PRIMARY KEY,
|
|
5
|
+
hash text NOT NULL,
|
|
6
|
+
created_at numeric,
|
|
7
|
+
name text,
|
|
8
|
+
applied_at TEXT
|
|
9
|
+
)
|
|
10
|
+
`);let t=n.prepare(`INSERT INTO ${Xe} (hash, created_at, name, applied_at) VALUES (?, ?, ?, ?)`),r=new Date().toISOString();n.exec("BEGIN");try{for(let o of e)t.run(o.hash,o.folderMillis,o.name,r);n.exec("COMMIT")}catch(o){throw n.exec("ROLLBACK"),o}}var Xe,X,Oi,Wu,Ci=d(()=>{"use strict";Ai();Xe="__drizzle_migrations",X=class extends Error{constructor(e){super(`Engine database migration failed: ${e}`),this.name="DatabaseMigrationError"}},Oi=["workflow_definitions","subject_views","job_batches","jobs","job_subjects","job_step_executions","schedules","workflow_shortcuts","settings"],Wu={workflow_definitions:["id","subject_handling","steps","notification_policy"],subject_views:["id","workflow_id","query_template","provider_instance_id","order"],job_batches:["id","resolved_subjects","schedule_id"],jobs:["id","fan_out_index","current_step_execution_id","workflow_snapshot","batch_id"],job_subjects:["id","job_id","subject_id","snapshot"],job_step_executions:["id","job_id","parent_step_execution_id","iteration_index"],schedules:["id","view_id","cadence","enabled"],workflow_shortcuts:["id","workflow_id","order"],settings:["id","data"]}});import{Injectable as Xu}from"@nestjs/common";import{mkdirSync as Zu}from"node:fs";import{dirname as Yu}from"node:path";import{DatabaseSync as Di}from"node:sqlite";var Qu,zu,Z,Bi=d(()=>{"use strict";en();Ei();Ci();Qu=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zu=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Z=class{sqlite;db;constructor(){let t=process.env.KNO_SQLITE_PATH??di();t===":memory:"?this.sqlite=new Di(":memory:"):(Zu(Yu(t),{recursive:!0}),this.sqlite=new Di(t)),this.db=xi(this.sqlite),Hr(this.sqlite,this.db)}async onModuleInit(){Hr(this.sqlite,this.db)}getDb(){return this.db}getSqlite(){return this.sqlite}};Z=Qu([Xu(),zu("design:paramtypes",[])],Z)});import{Injectable as nd}from"@nestjs/common";import{eq as Ni}from"drizzle-orm";var ed,td,q,ut=d(()=>{"use strict";qr();ed=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},td=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},q=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){let t=new Date().toISOString();return await this.db.insert($e).values({id:e.id,name:e.name,description:e.description??null,appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy,createdAt:t,updatedAt:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowDefinitions.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update($e).set({name:t.name??r.name,description:t.description!==void 0?t.description??null:r.description??null,appliesTo:t.appliesTo??r.appliesTo,subjectHandling:t.subjectHandling??r.subjectHandling,inputSchema:t.inputSchema??r.inputSchema,steps:t.steps??r.steps,notificationPolicy:t.notificationPolicy??r.notificationPolicy,updatedAt:new Date().toISOString()}).where(Ni($e.id,e)),this.get(e)):null}async list(e={}){return(e.subjectHandling?await this.db.query.workflowDefinitions.findMany({where:{subjectHandling:e.subjectHandling}}):await this.db.query.workflowDefinitions.findMany()).map(r=>this.toDomain(r))}async delete(e){if(!await this.get(e))return!1;try{this.sqlite?.exec("PRAGMA foreign_keys = OFF"),await this.db.delete($e).where(Ni($e.id,e))}finally{this.sqlite?.exec("PRAGMA foreign_keys = ON")}return!0}toDomain(e){return{id:e.id,name:e.name,...e.description!=null?{description:e.description}:{},appliesTo:e.appliesTo,subjectHandling:e.subjectHandling,inputSchema:e.inputSchema,steps:e.steps,notificationPolicy:e.notificationPolicy}}};q=ed([nd(),td("design:paramtypes",[Object,Function])],q)});import{Injectable as id}from"@nestjs/common";import{eq as Lr}from"drizzle-orm";var rd,od,Fi,Y,on=d(()=>{"use strict";$r();rd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},od=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Fi=["ticket","pull_request","documentation"],Y=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder(e.subjectType);return await this.db.insert(le).values({id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,query:e.query,description:e.description??null,queryTemplate:e.queryTemplate??null,providerInstanceId:e.providerInstanceId,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.subjectViews.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.queryTemplate!==void 0?t.queryTemplate:t.query!==void 0?void 0:r.queryTemplate;return await this.db.update(le).set({name:t.name??r.name,subjectType:t.subjectType??r.subjectType,workflowId:t.workflowId??r.workflowId,query:t.query??r.query,description:t.description!==void 0?t.description??null:r.description??null,queryTemplate:o??null,providerInstanceId:t.providerInstanceId??r.providerInstanceId}).where(Lr(le.id,e)),this.get(e)}async list(e={}){let t=e.subjectType?await this.db.query.subjectViews.findMany({where:{subjectType:e.subjectType}}):await this.db.query.subjectViews.findMany();return this.sortViews(t.map(r=>this.toDomain(r)))}async reorder(e){let t=[];for(let o of e){let i=await this.get(o);if(!i)return[];t.push(i)}let r=t[0].subjectType;if(!t.every(o=>o.subjectType===r))return[];for(let o=0;o<e.length;o+=1)await this.db.update(le).set({order:o}).where(Lr(le.id,e[o]));return this.list({subjectType:r})}async delete(e){return await this.get(e)?(await this.db.delete(le).where(Lr(le.id,e)),!0):!1}async nextOrder(e){let t=await this.db.query.subjectViews.findMany({where:{subjectType:e}});return t.length===0?0:Math.max(...t.map(r=>r.order))+1}sortViews(e){return[...e].sort((t,r)=>{let o=Fi.indexOf(t.subjectType)-Fi.indexOf(r.subjectType);return o!==0?o:t.order-r.order})}toDomain(e){return{id:e.id,name:e.name,subjectType:e.subjectType,workflowId:e.workflowId,providerInstanceId:e.providerInstanceId,query:e.query,order:e.order,...e.description!=null?{description:e.description}:{},...e.queryTemplate!=null?{queryTemplate:e.queryTemplate}:{}}}};Y=rd([id(),od("design:paramtypes",[Object])],Y)});import{Injectable as cd}from"@nestjs/common";import{and as ud,desc as dd,eq as Ct,inArray as pd}from"drizzle-orm";import{randomUUID as ld}from"node:crypto";function fd(n){return n?n.mode==="single"?[n.subject]:n.subjects:[]}function md(n){if(n.length!==0)return n.length===1?{mode:"single",subject:n[0]}:{mode:"collection",subjects:n}}function Ui(n,e,t=null,r=null){let o=[];for(let i of e)if(o.push({id:i.id,jobId:n,stepDefinitionId:i.stepDefinitionId,type:i.type,status:i.status,startedAt:i.startedAt??null,completedAt:i.completedAt??null,output:i.output??null,error:i.error??null,childJobIds:i.childJobIds??null,parentStepExecutionId:t,iterationIndex:r}),i.iterations)for(let s of i.iterations)o.push(...Ui(n,s.stepExecutions,i.id,s.index));return o}function hd(n){let e=new Map;for(let o of n){let i=o.parentStepExecutionId,s=e.get(i)??[];s.push(o),e.set(i,s)}let t=o=>{let i=e.get(o)??[];if(i.length===0)return;let s=new Map;for(let a of i){if(a.iterationIndex==null)continue;let u=s.get(a.iterationIndex)??[];u.push(a),s.set(a.iterationIndex,u)}if(s.size!==0)return[...s.entries()].sort(([a],[u])=>a-u).map(([a,u])=>{let c=u.map(f=>Ji(f,t(f.id)));return{index:a,stepExecutions:c,startedAt:gd(c),...wd(c)?{completedAt:yd(c)}:{}}})};return(e.get(null)??[]).filter(o=>o.iterationIndex==null).map(o=>Ji(o,t(o.id)))}function Ji(n,e){return{id:n.id,stepDefinitionId:n.stepDefinitionId,type:n.type,status:n.status,...n.startedAt!=null?{startedAt:n.startedAt}:{},...n.completedAt!=null?{completedAt:n.completedAt}:{},...n.output!==null&&n.output!==void 0?{output:n.output}:{},...n.error!=null?{error:n.error}:{},...n.childJobIds!=null?{childJobIds:n.childJobIds}:{},...e&&e.length>0?{iterations:e}:{}}}function gd(n){let e=n.map(t=>t.startedAt).filter(t=>t!=null);return e.length===0?"":e.reduce((t,r)=>t<r?t:r)}function yd(n){return n.map(t=>t.completedAt).filter(t=>t!=null).reduce((t,r)=>t>r?t:r)}function wd(n){return n.length>0&&n.every(e=>e.completedAt!=null)}function bd(n){return n==="completed"||n==="failed"||n==="cancelled"}var sd,ad,H,Dt=d(()=>{"use strict";Tt();Cr();Dr();sd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ad=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},H=class{db;sqlite;constructor(e,t){this.db=e,this.sqlite=t}async create(e){return await this.withoutForeignKeys(async()=>{await this.db.insert(B).values(this.jobToRow(e)),await this.replaceSubjects(e.id,e.subjectContext),await this.replaceStepExecutions(e.id,e.stepHistory)}),await this.get(e.id)}async get(e){let t=await this.db.query.jobs.findFirst({where:{id:e},with:{subjects:!0,stepExecutions:!0}});return t?this.toDomain(t,t.subjects,t.stepExecutions):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o={...r,...t,id:e,context:t.context??r.context,stepHistory:t.stepHistory??r.stepHistory,updatedAt:t.updatedAt??new Date().toISOString()};return await this.withoutForeignKeys(async()=>{await this.db.update(B).set({workflowId:o.workflowId,status:o.status,selection:o.selection??null,batchId:o.batchId??null,parentJobId:o.parentJobId??null,parentStepExecutionId:o.parentStepExecutionId??null,fanOutIndex:o.fanOutIndex??null,retryOf:o.retryOf??null,workflowSnapshot:o.workflowSnapshot??null,context:o.context,worktreePath:o.worktreePath??null,branch:o.branch??null,currentStepId:o.currentStepId??null,currentStepExecutionId:o.currentStepExecutionId??null,createdAt:o.createdAt,updatedAt:o.updatedAt,completedAt:o.completedAt??null}).where(Ct(B.id,e)),t.subjectContext!==void 0&&await this.replaceSubjects(e,t.subjectContext),t.stepHistory!==void 0&&await this.replaceStepExecutions(e,t.stepHistory)}),this.get(e)}async list(e={}){let t={};e.workflowId!==void 0&&(t.workflowId=e.workflowId),e.status!==void 0&&(t.status=e.status),e.batchId!==void 0&&(t.batchId=e.batchId),e.parentJobId!==void 0&&(t.parentJobId=e.parentJobId),e.parentStepExecutionId!==void 0&&(t.parentStepExecutionId=e.parentStepExecutionId);let o=(Object.keys(t).length>0?await this.db.query.jobs.findMany({where:t,with:{subjects:!0,stepExecutions:!0}}):await this.db.query.jobs.findMany({with:{subjects:!0,stepExecutions:!0}})).map(s=>this.toDomain(s,s.subjects,s.stepExecutions)),i=e.topLevelOnly?o.filter(s=>s.batchId==null&&s.parentJobId==null):o;return e.terminal===void 0?i:i.filter(s=>bd(s.status)===e.terminal)}async latestBySubject(e,t){let r={};for(let c of t)r[c]=null;if(t.length===0)return r;let o=await this.db.select({subjectId:me.subjectId,jobId:B.id,createdAt:B.createdAt}).from(me).innerJoin(B,Ct(me.jobId,B.id)).where(ud(Ct(B.workflowId,e),pd(me.subjectId,t))).orderBy(dd(B.createdAt)),i=new Map;for(let c of o)i.has(c.subjectId)||i.set(c.subjectId,c.jobId);let s=[...new Set(i.values())],a=await Promise.all(s.map(c=>this.get(c))),u=new Map(a.filter(c=>c!=null).map(c=>[c.id,c]));for(let[c,f]of i)r[c]=u.get(f)??null;return r}async withoutForeignKeys(e){if(!this.sqlite){await e();return}try{this.sqlite.exec("PRAGMA foreign_keys = OFF"),await e()}finally{this.sqlite.exec("PRAGMA foreign_keys = ON")}}jobToRow(e){return{id:e.id,workflowId:e.workflowId,status:e.status,selection:e.selection??null,batchId:e.batchId??null,parentJobId:e.parentJobId??null,parentStepExecutionId:e.parentStepExecutionId??null,fanOutIndex:e.fanOutIndex??null,retryOf:e.retryOf??null,workflowSnapshot:e.workflowSnapshot??null,context:e.context,worktreePath:e.worktreePath??null,branch:e.branch??null,currentStepId:e.currentStepId??null,currentStepExecutionId:e.currentStepExecutionId??null,createdAt:e.createdAt,updatedAt:e.updatedAt,completedAt:e.completedAt??null}}async replaceSubjects(e,t){await this.db.delete(me).where(Ct(me.jobId,e));let r=fd(t);r.length!==0&&await this.db.insert(me).values(r.map(o=>({id:ld(),jobId:e,subjectType:o.subjectType,subjectId:o.id,snapshot:o})))}async replaceStepExecutions(e,t){await this.db.delete(ze).where(Ct(ze.jobId,e));let r=Ui(e,t);r.length!==0&&await this.db.insert(ze).values(r)}toDomain(e,t,r){let o=md(t.map(s=>s.snapshot)),i=hd(r);return{id:e.id,workflowId:e.workflowId,status:e.status,...o?{subjectContext:o}:{},...e.selection!=null?{selection:e.selection}:{},...e.batchId!=null?{batchId:e.batchId}:{},...e.parentJobId!=null?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId!=null?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf!=null?{retryOf:e.retryOf}:{},...e.workflowSnapshot!=null?{workflowSnapshot:e.workflowSnapshot}:{},context:e.context,...e.worktreePath!=null?{worktreePath:e.worktreePath}:{},...e.branch!=null?{branch:e.branch}:{},...e.currentStepId!=null?{currentStepId:e.currentStepId}:{},...e.currentStepExecutionId!=null?{currentStepExecutionId:e.currentStepExecutionId}:{},stepHistory:i,createdAt:e.createdAt,updatedAt:e.updatedAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};H=sd([cd(),ad("design:paramtypes",[Object,Function])],H)});import{Injectable as jd}from"@nestjs/common";import{eq as vd}from"drizzle-orm";var Sd,Id,ee,sn=d(()=>{"use strict";nn();Sd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Id=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ee=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(De).values({id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,status:e.status,triggeredBy:e.triggeredBy,scheduleId:e.scheduleId??null,notificationOverride:e.notificationOverride??null,notificationSent:e.notificationSent,createdAt:e.createdAt,completedAt:e.completedAt??null}),await this.get(e.id)}async get(e){let t=await this.db.query.jobBatches.findFirst({where:{id:e},with:{jobs:!0}});return t?this.toDomain(t,t.jobs.map(r=>r.id)):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(De).set({workflowId:t.workflowId??r.workflowId,selection:t.selection??r.selection,resolvedSubjects:t.resolvedSubjects??r.resolvedSubjects,status:t.status??r.status,triggeredBy:t.triggeredBy??r.triggeredBy,scheduleId:t.scheduleId!==void 0?t.scheduleId??null:r.scheduleId??null,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,notificationSent:t.notificationSent??r.notificationSent,createdAt:t.createdAt??r.createdAt,completedAt:t.completedAt!==void 0?t.completedAt??null:r.completedAt??null}).where(vd(De.id,e)),this.get(e)):null}async list(e={}){return(e.workflowId?await this.db.query.jobBatches.findMany({where:{workflowId:e.workflowId},with:{jobs:!0}}):await this.db.query.jobBatches.findMany({with:{jobs:!0}})).map(r=>this.toDomain(r,r.jobs.map(o=>o.id)))}toDomain(e,t){return{id:e.id,workflowId:e.workflowId,selection:e.selection,resolvedSubjects:e.resolvedSubjects,jobIds:t,status:e.status,triggeredBy:e.triggeredBy,...e.scheduleId!=null?{scheduleId:e.scheduleId}:{},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},notificationSent:e.notificationSent,createdAt:e.createdAt,...e.completedAt!=null?{completedAt:e.completedAt}:{}}}};ee=Sd([jd(),Id("design:paramtypes",[Object])],ee)});import{Injectable as Ed}from"@nestjs/common";import{eq as Mi}from"drizzle-orm";var _d,xd,xe,Kr=d(()=>{"use strict";Br();_d=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},xd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xe=class{db;constructor(e){this.db=e}async create(e){return await this.db.insert(Ne).values({id:e.id,viewId:e.viewId,triggerType:e.trigger.type,cadence:e.trigger.cadence,notificationOverride:e.notificationOverride??null,missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,lastFiredAt:e.lastFiredAt??null,createdAt:e.createdAt}),await this.get(e.id)}async get(e){let t=await this.db.query.schedules.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);if(!r)return null;let o=t.trigger??r.trigger;return await this.db.update(Ne).set({viewId:t.viewId??r.viewId,triggerType:o.type,cadence:o.cadence,notificationOverride:t.notificationOverride!==void 0?t.notificationOverride??null:r.notificationOverride??null,missedFirePolicy:t.missedFirePolicy??r.missedFirePolicy,enabled:t.enabled??r.enabled,lastFiredAt:t.lastFiredAt!==void 0?t.lastFiredAt??null:r.lastFiredAt??null,createdAt:t.createdAt??r.createdAt}).where(Mi(Ne.id,e)),this.get(e)}async list(e={}){return(e.enabled!==void 0?await this.db.query.schedules.findMany({where:{enabled:e.enabled}}):await this.db.query.schedules.findMany()).map(r=>this.toDomain(r))}async delete(e){return await this.get(e)?(await this.db.delete(Ne).where(Mi(Ne.id,e)),!0):!1}async findDue(e){return(await this.list({enabled:!0})).filter(r=>r.lastFiredAt==null||r.lastFiredAt<e)}toDomain(e){return{id:e.id,viewId:e.viewId,trigger:{type:"cron",cadence:e.cadence},...e.notificationOverride!=null?{notificationOverride:e.notificationOverride}:{},missedFirePolicy:e.missedFirePolicy,enabled:e.enabled,...e.lastFiredAt!=null?{lastFiredAt:e.lastFiredAt}:{},createdAt:e.createdAt}}};xe=_d([Ed(),xd("design:paramtypes",[Object])],xe)});import{Injectable as Ad}from"@nestjs/common";import{eq as Wr}from"drizzle-orm";var Pd,Rd,Ee,Vr=d(()=>{"use strict";Nr();Pd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Rd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ee=class{db;constructor(e){this.db=e}async create(e){let t=await this.nextOrder();return await this.db.insert(he).values({id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,lastJobId:e.lastJobId??null,order:t}),await this.get(e.id)}async get(e){let t=await this.db.query.workflowShortcuts.findFirst({where:{id:e}});return t?this.toDomain(t):null}async update(e,t){let r=await this.get(e);return r?(await this.db.update(he).set({name:t.name??r.name,workflowId:t.workflowId??r.workflowId,inputValues:t.inputValues??r.inputValues,lastJobId:t.lastJobId!==void 0?t.lastJobId??null:r.lastJobId??null}).where(Wr(he.id,e)),this.get(e)):null}async list(){return(await this.db.query.workflowShortcuts.findMany()).map(t=>this.toDomain(t)).sort((t,r)=>t.order-r.order)}async reorder(e){let t=[];for(let r of e){let o=await this.get(r);if(!o)return[];t.push(o)}for(let r=0;r<e.length;r+=1)await this.db.update(he).set({order:r}).where(Wr(he.id,e[r]));return this.list()}async delete(e){return await this.get(e)?(await this.db.delete(he).where(Wr(he.id,e)),!0):!1}async nextOrder(){let e=await this.db.query.workflowShortcuts.findMany();return e.length===0?0:Math.max(...e.map(t=>t.order))+1}toDomain(e){return{id:e.id,name:e.name,workflowId:e.workflowId,inputValues:e.inputValues,order:e.order,...e.lastJobId!=null?{lastJobId:e.lastJobId}:{}}}};Ee=Pd([Ad(),Rd("design:paramtypes",[Object])],Ee)});import{z as _}from"zod";var Hi,Li,Ki,Gr,an,Wi,Qr=d(()=>{"use strict";Hi=_.object({name:_.string().min(1),label:_.string().min(1),type:_.enum(["string","select"]),options:_.array(_.string()).optional(),required:_.boolean()}),Li=_.object({id:_.string().min(1),label:_.string().min(1),params:_.array(Hi)}),Ki=_.object({actionId:_.string().min(1),label:_.string().min(1),params:_.array(Hi)}),Gr=_.object({templateId:_.string().min(1),params:_.record(_.string(),_.unknown())}),an=_.object({params:_.record(_.string(),_.unknown())}),Wi=_.object({query:_.record(_.string(),_.unknown())})});import{z as K}from"zod";var G,cn,un,dn,pn,ln=d(()=>{"use strict";Qr();G=K.enum(["ticket","pull_request","documentation"]),cn=K.object({id:K.string().min(1),name:K.string().min(1),subjectType:G,workflowId:K.string().min(1),providerInstanceId:K.string().min(1),query:K.record(K.string(),K.unknown()),description:K.string().optional(),queryTemplate:Gr.optional(),order:K.number().int().nonnegative()}),un=cn.omit({order:!0}),dn=cn.partial().omit({id:!0,order:!0}).extend({queryTemplate:Gr.nullable().optional()}),pn=K.object({viewIds:K.array(K.string().min(1)).min(1)})});var Vi=d(()=>{"use strict";ln()});var Gi=d(()=>{"use strict";Qr()});function kd(n){let e=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"");return e.length>0?e:"step"}function Qi(n,e){let t=e instanceof Set?e:new Set(e),r=kd(n);if(!t.has(r))return r;let o=2;for(;t.has(`${r}-${o}`);)o+=1;return`${r}-${o}`}function zi(n,e){for(let t of n)t.id&&e.push(t.id),t.type==="loop"&&Array.isArray(t.steps)&&zi(t.steps,e)}function Xi(n){let e=[];zi(n,e);let t=new Map;for(let r of e)t.set(r,(t.get(r)??0)+1);return[...t.entries()].filter(([,r])=>r>1).map(([r])=>r)}function Zi(n){let e=new Set,t=r=>{for(let o of r)o.id&&e.add(o.id),o.type==="loop"&&Array.isArray(o.steps)&&t(o.steps)};return t(n),e}var zr=d(()=>{"use strict"});import{z as l}from"zod";var Td,Bt,Od,Fe,Yi,es,ts,ns,rs,os,is,ss,qd,as,cs,dt,$d,Cd,Dd,Bd,Nd,Fd,Jd,us,pt,ds=d(()=>{"use strict";ln();zr();Td=l.enum(["on_fail","on_complete","on_needs_input"]),Bt=l.object({triggers:l.array(Td),messageTemplate:l.string().optional()}),Od=l.object({name:l.string().min(1),label:l.string().min(1),type:l.enum(["string","number","boolean","select"]),options:l.array(l.string()).optional(),required:l.boolean(),defaultValue:l.unknown().optional()}),Fe=l.string().min(1),Yi=l.object({type:l.literal("agent"),id:l.string().min(1),name:Fe,objective:l.string().min(1),knowledgeScope:l.array(l.enum(["user","organization","project"])).optional(),outputFormat:l.enum(["questionnaire","confirmation","comment_suggestions","free_text"]),agentInstanceId:l.string().min(1).optional()}),es=l.object({type:l.literal("interaction"),id:l.string().min(1),name:Fe,interaction:l.union([l.literal("questionnaire"),l.literal("confirmation"),l.literal("conversation")]),notify:l.boolean().optional()}),ts=l.object({type:l.literal("shell"),id:l.string().min(1),name:Fe,command:l.string().min(1)}),ns=l.object({type:l.literal("git"),id:l.string().min(1),name:Fe,operation:l.enum(["create_worktree","checkout","create_branch","commit","push"]),params:l.record(l.string(),l.unknown())}),rs=l.object({type:l.literal("provider_action"),id:l.string().min(1),name:Fe,action:l.enum(["get_subject","get_comments","post_comment","update_status","get_content"]),params:l.record(l.string(),l.unknown()).optional(),extendedAction:l.object({providerId:l.string().min(1),actionId:l.string().min(1),params:l.record(l.string(),l.unknown()).optional()}).optional(),target:l.object({subjectType:G,source:l.string().min(1),subjectId:l.string().min(1)}).optional()}),os=l.object({type:l.literal("sub_workflow"),id:l.string().min(1),name:Fe,workflowId:l.string().min(1),forEach:l.literal("selection")}),is=l.discriminatedUnion("type",[l.object({type:l.literal("field_empty"),stepId:l.string().min(1),field:l.string().min(1)}),l.object({type:l.literal("field_equals"),stepId:l.string().min(1),field:l.string().min(1),value:l.unknown()})]),ss=l.discriminatedUnion("action",[l.object({action:l.literal("fail")}),l.object({action:l.literal("continue")}),l.object({action:l.literal("ask_human")})]),qd=l.object({type:l.literal("loop"),id:l.string().min(1),name:Fe,steps:l.array(l.lazy(()=>as)),until:is,maxIterations:l.number().int().nonnegative(),onMaxIterations:ss}),as=l.lazy(()=>l.discriminatedUnion("type",[ns,rs,ts,Yi,es,os,qd])),cs=l.object({id:l.string().min(1),name:l.string().min(1),description:l.string().optional(),appliesTo:l.union([G,l.array(G),l.literal("none")]),subjectHandling:l.enum(["per-subject","collection"]),inputSchema:l.array(Od),steps:l.array(as),notificationPolicy:Bt}),dt=cs.superRefine((n,e)=>{let t=Xi(n.steps);t.length!==0&&e.addIssue({code:"custom",path:["steps"],message:`Duplicate step id(s): ${t.join(", ")}`})}),$d=Yi.extend({id:l.string().min(1).optional()}),Cd=es.extend({id:l.string().min(1).optional()}),Dd=ts.extend({id:l.string().min(1).optional()}),Bd=ns.extend({id:l.string().min(1).optional()}),Nd=rs.extend({id:l.string().min(1).optional()}),Fd=os.extend({id:l.string().min(1).optional()}),Jd=l.object({type:l.literal("loop"),id:l.string().min(1).optional(),name:Fe,steps:l.array(l.lazy(()=>us)),until:is,maxIterations:l.number().int().nonnegative(),onMaxIterations:ss}),us=l.lazy(()=>l.discriminatedUnion("type",[Bd,Nd,Dd,$d,Cd,Fd,Jd])),pt=cs.omit({id:!0,steps:!0}).extend({id:l.string().min(1).optional(),steps:l.array(us)})});function Ud(n){return n==="none"?[]:Array.isArray(n)?n:[n]}function ps(n,e){return Ud(n).includes(e)}var ls=d(()=>{"use strict"});var fs=d(()=>{"use strict";ds();zr();ls()});var ms=d(()=>{"use strict"});var hs=d(()=>{"use strict";ms()});var gs=d(()=>{"use strict"});var ys=d(()=>{"use strict";gs()});var ws=d(()=>{"use strict"});var bs=d(()=>{"use strict";ws()});import{z as W}from"zod";var lt,Ss=d(()=>{"use strict";lt=W.object({id:W.string().min(1),viewId:W.string().min(1),trigger:W.object({type:W.literal("cron"),cadence:W.string().min(1)}),notificationOverride:W.object({triggers:W.array(W.enum(["on_fail","on_complete","on_needs_input"])),messageTemplate:W.string().optional()}).optional(),missedFirePolicy:W.enum(["skip","catch_up"]),enabled:W.boolean(),lastFiredAt:W.string().optional(),createdAt:W.string()})});var Is=d(()=>{"use strict";Ss()});import{z as te}from"zod";var fn,mn,hn,gn,js=d(()=>{"use strict";fn=te.object({id:te.string().min(1),name:te.string().min(1),workflowId:te.string().min(1),inputValues:te.record(te.string(),te.unknown()),lastJobId:te.string().min(1).optional(),order:te.number().int().nonnegative()}),mn=fn.omit({order:!0}),hn=fn.partial().omit({id:!0,order:!0}),gn=te.object({shortcutIds:te.array(te.string().min(1)).min(1)})});var vs=d(()=>{"use strict";js()});import{z as w}from"zod";function Ze(n){return n.kind==="subject"}function ft(n){return n.kind==="agent"}var Md,_s,xs,Es,Ps,yn,wn,bn,Sn,In,jn,Rs,As,ks=d(()=>{"use strict";ln();Md=w.enum(["jira","bitbucket","github","confluence","manual"]),_s=w.enum(["claude","cursor"]),xs={id:w.string().min(1),displayName:w.string().min(1),config:w.record(w.string(),w.unknown()),secretKey:w.string().min(1),expiresOn:w.string().min(1).optional()},Es=w.object({...xs,kind:w.literal("subject"),type:Md,subjectType:G}),Ps=w.object({...xs,kind:w.literal("agent"),type:_s}),yn=w.discriminatedUnion("kind",[Es,Ps]),wn=w.object({providerInstances:w.array(yn).default([]),defaultAgentInstanceId:w.string().min(1).optional()}),bn=w.object({providerInstances:w.array(yn).optional(),defaultAgentInstanceId:w.string().min(1).nullable().optional()}),Sn=w.discriminatedUnion("kind",[Es.extend({defaultAgent:w.boolean().optional()}),Ps.extend({defaultAgent:w.boolean().optional()})]),In=w.object({displayName:w.string().min(1).optional(),config:w.record(w.string(),w.unknown()).optional(),secretKey:w.string().min(1).optional(),expiresOn:w.union([w.string().min(1),w.null()]).optional(),defaultAgent:w.boolean().optional()}),jn=w.object({type:_s,apiKey:w.string().min(1).optional(),instanceId:w.string().min(1).optional()}),Rs=w.object({id:w.string().min(1),displayName:w.string().min(1)}),As={providerInstances:[]}});var Ts=d(()=>{"use strict";ks()});var Os=d(()=>{"use strict"});var qs=d(()=>{"use strict";Os()});var A=d(()=>{"use strict";Vi();Gi();fs();hs();ys();bs();Is();vs();Ts();qs()});import{Injectable as Kd}from"@nestjs/common";import{eq as Wd}from"drizzle-orm";function Vd(n,e){let t=e.providerInstances!==void 0?e.providerInstances:n.providerInstances,r=e.defaultAgentInstanceId===null?void 0:e.defaultAgentInstanceId!==void 0?e.defaultAgentInstanceId:n.defaultAgentInstanceId;return Xr({providerInstances:t,...r?{defaultAgentInstanceId:r}:{}})}function Xr(n){return{providerInstances:n.providerInstances??As.providerInstances,...n.defaultAgentInstanceId?{defaultAgentInstanceId:n.defaultAgentInstanceId}:{}}}function $s(n){return n.providerInstances!==void 0}var Hd,Ld,x,ge=d(()=>{"use strict";A();Fr();Hd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ld=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},x=class{db;constructor(e){this.db=e}async get(){let e=await this.db.query.settings.findFirst({where:{id:$t}});return Xr(e?e.data:{})}async update(e){let t=Vd(await this.get(),e);return await this.db.query.settings.findFirst({where:{id:$t}})?await this.db.update(ct).set({data:t}).where(Wd(ct.id,$t)):await this.db.insert(ct).values({id:$t,data:t}),t}async replaceProviderInstances(e){return this.update({providerInstances:e})}};x=Hd([Kd(),Ld("design:paramtypes",[Object])],x)});import{Module as Qd}from"@nestjs/common";var Gd,zd,ye,Nt=d(()=>{"use strict";Bi();ut();on();Dt();sn();Kr();Vr();ge();Gd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},zd=[q,Y,H,ee,xe,Ee,x],ye=class{};ye=Gd([Qd({providers:[Z,{provide:q,useFactory:n=>new q(n.getDb(),n.getSqlite()),inject:[Z]},{provide:Y,useFactory:n=>new Y(n.getDb()),inject:[Z]},{provide:H,useFactory:n=>new H(n.getDb(),n.getSqlite()),inject:[Z]},{provide:ee,useFactory:n=>new ee(n.getDb()),inject:[Z]},{provide:xe,useFactory:n=>new xe(n.getDb()),inject:[Z]},{provide:Ee,useFactory:n=>new Ee(n.getDb()),inject:[Z]},{provide:x,useFactory:n=>new x(n.getDb()),inject:[Z]}],exports:[Z,...zd]})],ye)});import{Injectable as Yd,Logger as ep,Inject as Ds}from"@nestjs/common";async function Bs(n,e){let t=[];for(let r of e){let o=await n.get(r.secretKey);t.push({providerId:r.id,secretKey:r.secretKey,configured:typeof o=="string"&&o.length>0})}return t}async function tp(n,e,t){let r=await Bs(n,e);for(let o of r)o.configured||t(`Provider instance '${o.providerId}' API key not configured (looked up as '${o.secretKey}'). GET /api/providers/status lists what's missing; store a key with: POST /api/secrets/${o.secretKey} or npm --workspace apps/engine run set-secret -- ${o.secretKey} <value>`)}var Xd,Zd,Cs,Zr,Je,Yr=d(()=>{"use strict";ge();_e();Xd=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zd=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Cs=function(n,e){return function(t,r){e(t,r,n)}};Je=Zr=class{secrets;settings;logger=new ep(Zr.name);constructor(e,t){this.secrets=e,this.settings=t}async onModuleInit(){let e=await this.settings.get();await tp(this.secrets,e.providerInstances??[],t=>this.logger.warn(t))}async list(){let e=await this.settings.get();return Bs(this.secrets,e.providerInstances??[])}};Je=Zr=Xd([Yd(),Cs(0,Ds(oe)),Cs(1,Ds(x)),Zd("design:paramtypes",[Function,x])],Je)});function vn(n,e=st(n)){let t=ip[n]??n;return new Error(`${t} API key not configured \u2014 set '${e}' via the setup script`)}function Ns(n){let e=new Map;for(let r of n){let o=r.content.trim();if(!o)continue;let i=e.get(r.tier)??[];i.push(o),e.set(r.tier,i)}let t=[];for(let r of rp){let o=e.get(r);o?.length&&t.push(`## ${np[r]}
|
|
134
11
|
${o.join(`
|
|
135
12
|
|
|
136
13
|
`)}`)}return t.join(`
|
|
137
14
|
|
|
138
|
-
`)}function
|
|
15
|
+
`)}function Ft(n){let e=[],t=Ns(n.knowledge);return t&&e.push(t),e.push(`# Objective
|
|
139
16
|
${n.objective}`),e.push(`# Output format
|
|
140
|
-
${
|
|
17
|
+
${op[n.outputFormat]}`),e.join(`
|
|
141
18
|
|
|
142
|
-
`)}function
|
|
143
|
-
`).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function
|
|
144
|
-
`;let t=(e.content??[]).map(
|
|
145
|
-
`:t}var Vr=p(()=>{"use strict"});function Jd(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function Ts(n){return{representation:"atlas_doc_format",value:JSON.stringify(En(n))}}function Ps(n){return Dt(Md(n))}function Md(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 Rs(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:Hd(e,n),raw:n}}function Hd(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 Kd(n,e){return{id:String(n.id??""),subjectId:e,body:Ps(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var Ld,Ud,Fd,xs,xn,Tn,Gr=p(()=>{"use strict";vn();Vr();Ld="kno.confluence.apiToken",Ud=50,Fd=10,xs=500,xn=[{actionId:"create_page",label:"Create Confluence page",params:[{name:"spaceKey",label:"Space key",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"content",label:"Content",type:"string",required:!0}]}],Tn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Ld}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Rs(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 Ps(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=${Ud}`,o=new Set;for(let i=0;i<Fd&&t.length<xs&&!(!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>=xs)break;t.push(Kd(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:Ts(t)}})}listExtendedActions(){return xn}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${lt(this.listExtendedActions())}`)}async createPage(e){let t=xn[0];jn(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:Ts(i)}});return Rs(u,s,this.instanceId)}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Confluence instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=Jd(o,t),u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Confluence ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as Wd}from"node:crypto";var Vd,Rn,As=p(()=>{"use strict";Vd=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),Rn=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:Wd(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(Vd.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Xr(){return Xd.replace(/\/$/,"")}function Bt(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 Qd(n,e){return`${n}#${e}`}function zd(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 Yd(n){if(typeof n.repoSlug=="string"&&n.repoSlug.trim().length>0||!Ns(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 ks(n){if(!Ns(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 Zd(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=ks(n.state);if(e)return`state="${e}"`}function ep(n){let e=n.destination?.repository?.name;if(typeof e=="string"&&e.trim().length>0)return e.trim();let t=n.destination?.repository?.full_name;if(typeof t=="string"&&t.includes("/"))return t.slice(t.lastIndexOf("/")+1);throw new Error("Bitbucket workspace pull request is missing destination.repository slug")}function tp(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 Ns(n){return n!=null&&n!==""}function Yr(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function Pn(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:Qd(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 np(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 Gd,Xd,Qr,Os,zr,Zr,An,eo=p(()=>{"use strict";vn();Gd="kno.bitbucket.apiToken",Xd="https://api.bitbucket.org/2.0";Qr=50,Os=10,zr=500,Zr=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],An=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()||Gd}async get(e){let{repoSlug:t,prNumber:r}=Bt(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return Pn(i,t,this.instanceId)}async query(e){let t=Yd(e);if(t)return this.queryWorkspacePullRequests(t,e);let r=zd(e),{workspace:o}=await this.requireConfig(),i=Zd(e),s=new URLSearchParams({pagelen:String(Qr)});i&&s.set("q",i);let a=`${Xr()}/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(Qr)}),s=ks(t.state);s&&i.set("state",s),e==="reviewer"&&i.set("role","REVIEWER");let a=`${Xr()}/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=Yr(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<Os&&r.length<zr&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),u=Array.isArray(a.values)?a.values:[];for(let f of u){if(r.length>=zr)break;r.push(Pn(f,t??ep(f),this.instanceId))}let c=typeof a.next=="string"&&a.next.length>0?a.next:void 0;if(!c||u.length===0)break;i=c}return r}async getComments(e){let{repoSlug:t,prNumber:r}=Bt(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${Qr}`;for(let u=0;u<Os&&i.length<zr&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),f=Array.isArray(c.values)?c.values:[];for(let I of f)i.push(np(I,e));let m=typeof c.next=="string"&&c.next.length>0?c.next:void 0;if(!m||f.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=Bt(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}=Bt(e),{workspace:i}=await this.requireConfig(),s=tp(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return Zr}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${lt(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}=Bt(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=Yr(u.uuid),f=Yr(u.account_id);if(!c&&!f)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(E=>c!=null&&E.uuid===c||f!=null&&E.account_id===f))return Pn(a,o,this.instanceId);let S=[...m.map(E=>E.uuid?{uuid:E.uuid}:{account_id:E.account_id}),c?{uuid:c}:{account_id:f}],$=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:S}});return Pn($,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:`${Xr()}${t.startsWith("/")?t:`/${t}`}`,a={Authorization:`Basic ${Buffer.from(`${o}:${i}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(a["Content-Type"]="application/json");let u=await this.fetchFn(s,{method:e,headers:a,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let f=await u.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${u.status}): ${f||u.statusText}`)}if(u.status===204)return;let c=await u.text();if(c)return JSON.parse(c)}}});import{randomUUID as rp}from"node:crypto";function op(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var On,Cs=p(()=>{"use strict";On=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=>op(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:rp(),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 to(n){return n.pull_request!=null}function kn(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}=qs(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 up(n,e,t){return`${n}/${e}#${t}`}function qs(n){let e=n.trim(),t=e.indexOf("/");if(t<=0||t===e.length-1||e.indexOf("/",t+1)!==-1)throw new Error(`GitHub repo must be '{owner}/{name}', got '${n}'`);return{owner:e.slice(0,t),name:e.slice(t+1)}}function dp(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function pp(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function lp(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: ${cp.join(", ")}`)}function fp(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function no(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:up(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 mp(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function Nn(n){return n!=null&&n!==""}var ip,sp,ap,cp,Cn,$s=p(()=>{"use strict";ip="2026-03-10",sp="https://api.github.com",ap="kno.github.apiToken",cp=["open","closed/done/completed","not_planned/wontfix"],Cn=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()||ap}async get(e){let{owner:t,repo:r,issueNumber:o}=kn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(to(i))throw new Error(`Ticket not found: ${e}`);return no(i,this.instanceId,`${t}/${r}`)}async query(e){let t=typeof e.repo=="string"?e.repo.trim():"";if(t)return this.queryRepoIssues(t,e);let r=dp(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repo ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=kn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>mp(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=kn(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}=kn(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:lp(t)})}async queryRepoIssues(e,t){let{owner:r,name:o}=qs(e),i=[],s=new URLSearchParams;s.set("per_page",String(100)),Nn(t.state)&&s.set("state",String(t.state)),Nn(t.labels)&&s.set("labels",String(t.labels)),Nn(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=10&&i.length<500;a++){s.set("page",String(a));let u=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues?${s.toString()}`),c=Array.isArray(u)?u:[];if(c.length===0)break;for(let f of c)if(!to(f)){if(i.length>=500)break;i.push(no(f,this.instanceId,`${r}/${o}`))}if(c.length<100)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[pp(e,r),"is:issue"];Nn(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=10&&s.length<500;a++){let u=new URLSearchParams({q:i,per_page:String(100),page:String(a)}),c=await this.request("GET",`/search/issues?${u.toString()}`),f=Array.isArray(c.items)?c.items:[];if(f.length===0)break;for(let m of f)if(!to(m)){if(s.length>=500)break;s.push(no(m,this.instanceId,fp(m)))}if(f.length<100)break}return s}requireUsername(){if(!this.username)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing config.username`);return this.username}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing SecretStore '${this.secretKey}'. Store the token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`);return e}async request(e,t,r={}){let o=await this.requireToken(),i=`${sp}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":ip};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 Ze,g,h,Te,R=p(()=>{"use strict";Ze=class extends Error{constructor(e){super(e),this.name=this.constructor.name}},g=class extends Ze{httpStatus=404},h=class extends Ze{httpStatus=400},Te=class extends Ze{httpStatus=409}});function wp(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if($n(n.project)&&e.push(`project = ${Dn(n.project)}`),$n(n.status)&&e.push(`status = ${Dn(n.status)}`),$n(n.assignee)&&e.push(`assignee = ${Dn(n.assignee)}`),$n(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${Dn(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 $n(n){return n!=null&&n!==""}function Dn(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function Ds(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=Dt(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 hp,gp,yp,qn,Bn,Bs=p(()=>{"use strict";R();Vr();hp="kno.jira.apiToken",gp=50,yp=10,qn=500,Bn=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()||hp}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return Ds(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=wp(e),o=[],i,s=new Set;for(let a=0;a<yp&&o.length<qn;a++){let u={jql:r,maxResults:Math.min(gp,qn-o.length),fields:["summary","description","status","assignee"]};i&&(u.nextPageToken=i);let c=await this.request("POST","/rest/api/3/search/jql",{body:u}),f=Array.isArray(c.issues)?c.issues:[];for(let I of f){if(o.length>=qn)break;o.push(Ds(I,t,this.instanceId))}let m=typeof c.nextPageToken=="string"?c.nextPageToken:void 0;if(c.isLast===!0||!m||f.length===0||m===i||s.has(m))break;s.add(m),i=m}return o}async getComments(e){let t=[],r=0,o=100,i=qn;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:Dt(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:En(t)}})}async updateStatus(e,t){let r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`),o=Array.isArray(r.transitions)?r.transitions:[],i=t.trim().toLowerCase(),s=o.find(a=>(a.to?.name??"").trim().toLowerCase()===i);if(!s?.id){let a=o.map(c=>c.to?.name).filter(c=>typeof c=="string"&&c.length>0),u=a.length>0?a.join(", "):"(none)";throw new Error(`No Jira transition to status '${t}' from the current state. Available: ${u}`)}await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`,{body:{transition:{id:s.id}}})}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Jira instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=`${o.replace(/\/$/,"")}${t}`,u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Jira ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as bp}from"node:crypto";function Sp(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var Ln,Ls=p(()=>{"use strict";Ln=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=>Sp(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:bp(),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 Re(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function Un(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function _p(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var Aw,C,ft=p(()=>{"use strict";q();Is();js();Gr();As();eo();Cs();$s();Bs();Ls();Aw=Symbol("PROVIDER_REGISTRY");C=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(pt(e)){let o=Re(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new _n(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new In(t,{secretKey:e.secretKey,model:o}));return}if(!Mr(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=_p(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 Bn(t,{instanceId:e.id,baseUrl:Re(e.config,"baseUrl"),email:Re(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new Cn(t,{instanceId:e.id,username:Re(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new An(t,{instanceId:e.id,email:Re(e.config,"email"),workspace:Re(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new Tn(t,{instanceId:e.id,baseUrl:Re(e.config,"baseUrl"),email:Re(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new Ln([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new On([],e.id));return}this.documentation.set(e.id,new Rn([],{instanceId:e.id,type:Re(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw Un(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw Un(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw Un(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw Un(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>Mr(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function Fs(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{role:"reviewer",state:"OPEN"};case"repo-open-prs":{let t=typeof e.repoSlug=="string"?e.repoSlug.trim():"";if(!t)throw new h("Bitbucket template 'repo-open-prs' requires params.repoSlug");return{repoSlug:t,state:"OPEN"}}default:throw new g(`Unknown Bitbucket query template: ${n}`)}}var Us,Js=p(()=>{"use strict";R();Us=[{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 Hs(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":{let t=typeof e.repo=="string"?e.repo.trim():"";if(!t)throw new h("GitHub template 'repo-open-issues' requires params.repo");return{repo:t,state:"open"}}default:throw new g(`Unknown GitHub query template: ${n}`)}}var Ms,Ks=p(()=>{"use strict";R();Ms=[{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 Qs(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 = ${Gs(Vs(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${Gs(Vs(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new g(`Unknown Jira query template: ${n}`)}}function Vs(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 Gs(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var Ws,Xs,zs=p(()=>{"use strict";R();Ws={name:"project",label:"Project key",type:"string",required:!0},Xs=[{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:[Ws]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[Ws]}]});import{Inject as Ep,Injectable as xp}from"@nestjs/common";var Ip,jp,vp,Ys,Je,ro=p(()=>{"use strict";R();ft();Js();Ks();zs();Ip=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},jp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},vp=function(n,e){return function(t,r){e(t,r,n)}},Ys={bitbucket:{list:()=>Us,resolve:Fs},github:{list:()=>Ms,resolve:Hs},jira:{list:()=>Xs,resolve:Qs}},Je=class{registry;constructor(e){this.registry=e}list(e){let t=this.providerType(e);return t?Ys[t]?.list()??[]:[]}resolve(e,t,r){let o=this.providerType(e),i=o?Ys[o]:void 0;if(!i)throw new g(`No query templates for provider instance '${e}'`);let s=i.list().find(a=>a.id===t);if(!s)throw new g(`Unknown query template '${t}' for provider instance '${e}'`);for(let a of s.params){if(!a.required)continue;let u=r[a.name];if(u==null||typeof u=="string"&&u.trim()==="")throw new h(`Template '${t}' requires params.${a.name}`)}return i.resolve(t,r)}providerType(e){let t=this.registry.getInstance(e);if(!(!t||t.kind!=="subject"))return t.type}};Je=Ip([xp(),vp(0,Ep(C)),jp("design:paramtypes",[C])],Je)});import{Inject as Ap,Injectable as Op}from"@nestjs/common";var Tp,Rp,Pp,kp,Me,oo=p(()=>{"use strict";Gr();eo();ft();Tp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Rp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Pp=function(n,e){return function(t,r){e(t,r,n)}},kp={bitbucket:()=>Zr,confluence:()=>xn},Me=class{registry;constructor(e){this.registry=e}list(e){let t=this.registry.getInstance(e);return!t||t.kind!=="subject"?[]:kp[t.type]?.()??[]}};Me=Tp([Op(),Pp(0,Ap(C)),Rp("design:paramtypes",[C])],Me)});async function Zs(n){let e=n.fetchFn??fetch;return n.type==="claude"?$p(n.apiKey,e):Dp(n.apiKey,e)}async function $p(n,e){let t=await e(Np,{method:"GET",headers:{"x-api-key":n,"anthropic-version":qp}});if(!t.ok)throw ea("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 Dp(n,e){let t=await e(Cp,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw ea("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 ea(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 Np,Cp,qp,ta=p(()=>{"use strict";Np="https://api.anthropic.com/v1/models",Cp="https://api.cursor.com/v1/models",qp="2023-06-01"});import{Inject as so,Injectable as Up}from"@nestjs/common";var Bp,Lp,io,Fn,He,ao=p(()=>{"use strict";q();Ue();je();R();ta();Bp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Lp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},io=function(n,e){return function(t,r){e(t,r,n)}},Fn="PREVIEW_MODELS_FETCH",He=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async preview(e){let t=e.apiKey?.trim();if(t)return this.lookup(e.type,t);let r=e.instanceId?.trim();if(!r)throw new h("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new g(`Provider instance not found: ${r}`);if(!pt(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 Zs({type:e,apiKey:t,fetchFn:this.fetchFn})}catch(r){throw r instanceof Error&&r.name==="PreviewModelsAuthError"?new h(r.message):new h(r instanceof Error?r.message:"Failed to fetch available models")}}};He=Bp([Up(),io(0,so(x)),io(1,so(re)),io(2,so(Fn)),Lp("design:paramtypes",[x,Function,Function])],He)});import{Module as Jp}from"@nestjs/common";import{fileURLToPath as Mp}from"node:url";import{dirname as Hp,join as Kp}from"node:path";var Fp,Wp,Ke,Jn=p(()=>{"use strict";Ir();Yo();jr();ei();Rr();je();Ct();Ue();Wr();ft();ro();oo();ao();Fp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Wp=Kp(Hp(Mp(import.meta.url)),"../../../knowledge"),Ke=class{};Ke=Fp([Jp({imports:[it,ge],providers:[{provide:C,useFactory:async(n,e)=>{let t=await n.get();return C.fromSettings(t.providerInstances??[],e)},inject:[x,re]},{provide:Et,useClass:Gt},{provide:xt,useFactory:()=>new Xt(Wp)},Fe,Je,Me,{provide:Fn,useValue:(n,e)=>fetch(n,e)},He],exports:[C,Et,xt,Fe,Je,Me,He,Fn]})],Ke)});import{Module as Gp}from"@nestjs/common";var Vp,Mn,na=p(()=>{"use strict";Vp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Mn=class{};Mn=Vp([Gp({})],Mn)});import{Injectable as Qp}from"@nestjs/common";var Xp,ie,Hn=p(()=>{"use strict";Xp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ie=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)}};ie=Xp([Qp()],ie)});import{Global as Yp,Module as Zp}from"@nestjs/common";var zp,We,Kn=p(()=>{"use strict";Hn();zp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},We=class{};We=zp([Yp(),Zp({providers:[ie],exports:[ie]})],We)});import{Injectable as nl}from"@nestjs/common";import{execFile as rl}from"node:child_process";import{mkdirSync as ra}from"node:fs";import{join as co}from"node:path";import{promisify as ol}from"node:util";function oa(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function ia(n){return co(n,"worktrees")}var el,tl,il,Pe,uo=p(()=>{"use strict";el=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},tl=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},il=ol(rl),Pe=class{worktreesRoot;constructor(e){this.worktreesRoot=e,ra(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??co(this.worktreesRoot,e);return ra(co(r,".."),{recursive:!0}),await this.git(t.repoPath,["worktree","add","-b",t.branchName,r,t.baseBranch]),{worktreePath:r,branch:t.branchName}}async checkout(e,t){await this.git(e,["checkout",t.branch])}async createBranch(e,t){t.baseBranch?await this.git(e,["checkout","-b",t.branchName,t.baseBranch]):await this.git(e,["checkout","-b",t.branchName])}async commit(e,t){return t.addAll!==!1&&await this.git(e,["add","-A"]),await this.git(e,["commit","-m",t.message]),{sha:(await this.git(e,["rev-parse","HEAD"])).stdout.trim()}}async push(e,t={}){let r=t.remote??"origin";t.branch?await this.git(e,["push",r,t.branch]):await this.git(e,["push",r,"HEAD"])}async git(e,t){try{let r=await il("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=oa(o.stderr),s=oa(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Pe=el([nl(),tl("design:paramtypes",[String])],Pe)});import{Module as al}from"@nestjs/common";import{mkdirSync as cl}from"node:fs";import{dirname as ul,join as dl}from"node:path";import{fileURLToPath as pl}from"node:url";var sl,sa,Wn,aa=p(()=>{"use strict";uo();sl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},sa=dl(ul(pl(import.meta.url)),"../../data");cl(sa,{recursive:!0});Wn=class{};Wn=sl([al({providers:[{provide:Pe,useFactory:()=>new Pe(ia(sa))}],exports:[Pe]})],Wn)});function Lt(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=ll(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function ll(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 mt(n,e){return typeof n=="string"?Lt(n,e):Array.isArray(n)?n.map(t=>mt(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,mt(r,e)])):n}var ca=p(()=>{"use strict"});function ua(n,e){switch(n){case"questionnaire":return po(e);case"confirmation":return fl(e);case"conversation":return ml(e);default:return n}}function po(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 fl(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)?[]:po(n)}function ml(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?po(n):[]}var da=p(()=>{"use strict"});function ht(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=ht(r.stepExecutions,e);if(o)return o}}}function Ut(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=Ut(s.stepExecutions,e,i.id,s.index);if(a)return a}}}function X(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:X(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 Ft(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Ft(t.steps,e);if(r)return r}}}function pa(n,e,t){return X(n,e,r=>{let o=(r.iterations??[]).map(i=>{if(i.index!==t)return i;let s=i.stepExecutions.every(a=>a.completedAt)?i.stepExecutions.map(a=>a.completedAt).reduce((a,u)=>a>u?a:u):void 0;return{...i,...s?{completedAt:s}:{}}});return{...r,iterations:o}})}var la=p(()=>{"use strict"});import{z as te}from"zod";function fa(n,e){let t=bl[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 hl,gl,yl,wl,bl,ma=p(()=>{"use strict";hl=te.object({questions:te.array(te.object({id:te.string(),prompt:te.string()}))}),gl=te.object({approved:te.boolean()}),yl=te.object({suggestions:te.array(te.object({body:te.string()}))}),wl=te.string(),bl={questionnaire:hl,confirmation:gl,comment_suggestions:yl,free_text:wl}});function ha(n){return n==="completed"||n==="failed"||n==="cancelled"}function fo(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=>ha(o.status)),groupCount:t.size}}function ga(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 ya=p(()=>{"use strict"});async function Vn(n,e,t){let r=await e.get(n);if(!r)throw new g(`SubjectView not found: ${n}`);if(!r.providerInstanceId)throw new h(`SubjectView '${n}' has no providerInstanceId \u2014 reconfigure the View to pick a provider instance`);if(r.subjectType==="ticket")return(await t.getTicketProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"ticket",...i}));if(r.subjectType==="pull_request")return(await t.getRepoProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"pull_request",...i}));if(r.subjectType==="documentation")return(await t.getDocumentationProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"documentation",...i}));throw new h(`Unsupported subjectType on view: ${r.subjectType}`)}var mo=p(()=>{"use strict";R()});import{Inject as we,Injectable as Il}from"@nestjs/common";import{randomUUID as ho}from"node:crypto";import{exec as jl}from"node:child_process";import{promisify as vl}from"node:util";async function go(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 wa(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 Tl(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 Gn(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function be(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Rl(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 ba(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 Sl,_l,ye,El,xl,se,Xn=p(()=>{"use strict";at();ct();tn();en();Hn();uo();Ue();ft();Ir();jr();vn();R();ca();da();la();ma();ya();mo();Sl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},_l=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ye=function(n,e){return function(t,r){e(t,r,n)}},El=vl(jl),xl=["user","organization","project"],se=class{workflows;jobs;batches;views;events;providers;notifications;knowledge;git;settings;childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,f){this.workflows=e,this.jobs=t,this.batches=r,this.views=o,this.events=i,this.providers=s,this.notifications=a,this.knowledge=u,this.git=c,this.settings=f,this.events.subscribe(m=>{let I=m;(I.type==="job_completed"||I.type==="job_failed")&&this.onChildTerminal(I.jobId)})}async start(e){let t=await this.createJob(e);return this.emit({type:"job_started",jobId:t.id,timestamp:new Date().toISOString()}),this.runJob(t.id)}async launch(e){let t=await this.requireWorkflow(e.workflowId);if(t.subjectHandling!=="per-subject"&&t.subjectHandling!=="collection")throw new h(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);ba(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:ho(),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=await this.workflows.get(e.workflowId);if(!t)throw new g(`Workflow not found: ${e.workflowId}`);if(!e.subjectContext&&t.subjectHandling!=="per-subject")throw new h(`Workflow Runner only supports subjectHandling 'per-subject' at start() without an explicit subjectContext (got '${t.subjectHandling}')`);ba(t.inputSchema,e.inputValues);let r=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),o=new Date().toISOString();return this.jobs.create({id:ho(),workflowId:t.id,status:"pending",...r?{subjectContext:r}:{},...e.selection?{selection:e.selection}:{},...e.batchId?{batchId:e.batchId}:{},...e.parentJobId?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf?{retryOf:e.retryOf}:{},context:{...e.inputValues},stepHistory:[],createdAt:o,updatedAt:o})}async runJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);let r=await this.requireWorkflow(t.workflowId);t.status==="pending"&&(t=await this.persistJob({...t,status:"planning",updatedAt:new Date().toISOString()}));let o=await this.executeStepSequence(t,r,r.steps,void 0,void 0,0);return o.outcome==="paused"||o.outcome==="failed"?o.job:this.completeJob(o.job,r)}async resume(e,t){let r=await this.jobs.get(e);if(!r)throw new g(`Job not found: ${e}`);if(r.status!=="waiting_for_human")throw new Te(`Job ${e} is not waiting for human input (status: ${r.status})`);let o=await this.requireWorkflow(r.workflowId),i=r.currentStepExecutionId;if(!i)throw new Error(`Job ${e} is waiting_for_human but has no currentStepExecutionId`);let s=ht(r.stepHistory,i);if(!s)throw new Error(`Paused execution ${i} not found on job ${e}`);if(s.type==="loop")return this.resumeAskHuman(r,o,s,t);if(s.type!=="interaction")throw new Error(`Paused execution ${i} has type '${s.type}'; expected interaction or loop`);let a=new Date().toISOString(),u=X(r.stepHistory,i,$=>({...$,status:"completed",completedAt:a,output:t})),c=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{response:t};r=await this.persistJob({...r,status:"planning",context:{...r.context,[s.stepDefinitionId]:t},stepHistory:u,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a}),this.emit({type:"human_answered",jobId:r.id,answers:c,timestamp:a});let f=Ut(r.stepHistory,i);if(!f)throw new Error(`Could not locate frame for execution ${i}`);let m=this.sequenceForFrameOnJob(r,o,f),I=f.index+1,S=await this.executeStepSequence(r,o,m,f.parentLoopExecutionId,f.iterationIndex,I);return S.outcome==="paused"||S.outcome==="failed"?S.job:f.parentLoopExecutionId!=null&&f.iterationIndex!=null?this.continueLoopAfterBody(S.job,o,f.parentLoopExecutionId,f.iterationIndex):this.completeJob(S.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);if(t.status!=="failed")throw new Te(`Job ${e} is not failed (status: ${t.status})`);let r=t.parentJobId!=null&&t.parentStepExecutionId!=null&&t.fanOutIndex!=null,o=t.batchId!=null&&t.fanOutIndex!=null;if(!r&&!o)throw new h(`Job ${e} is not a retryable sub_workflow child or batch member`);if(r){let a=await this.jobs.get(t.parentJobId);if(!a)throw new g(`Parent job not found: ${t.parentJobId}`);let u=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,inputValues:{},parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId,fanOutIndex:t.fanOutIndex,retryOf:t.id}),c=X(a.stepHistory,t.parentStepExecutionId,f=>({...f,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...f.childJobIds??[],u.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:c,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emit({type:"job_started",jobId:u.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:u.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(u.id),u}let i=await this.batches.get(t.batchId);if(!i)throw new g(`JobBatch not found: ${t.batchId}`);i.status!=="running"&&await this.batches.update(i.id,{status:"running",completedAt:null,notificationSent:!1});let s=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,selection:t.selection,batchId:t.batchId,fanOutIndex:t.fanOutIndex,inputValues:{},retryOf:t.id});return this.emit({type:"job_started",jobId:s.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:s.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(s.id),s}async executeStepSequence(e,t,r,o,i,s){let a=e;for(let u=s;u<r.length;u++){let c=r[u],f=new Date().toISOString(),m={id:ho(),stepDefinitionId:c.id,type:c.type,status:"running",startedAt:f},I=lo(a.stepHistory,m,o,i);a=await this.persistJob({...a,status:a.status==="pending"?"planning":a.status,currentStepId:c.id,currentStepExecutionId:m.id,stepHistory:I,updatedAt:f}),this.emit({type:"step_started",jobId:a.id,stepDefinitionId:c.id,timestamp:f});try{let S=await this.dispatchStep(a,t,c,m.id,o,i);if(a=S.job,S.outcome==="paused"||S.outcome==="failed")return S}catch(S){return{outcome:"failed",job:await this.failJob(a,t,m.id,c.id,S)}}}return o!=null&&i!=null&&(a=await this.persistJob({...a,stepHistory:pa(a.stepHistory,o,i),updatedAt:new Date().toISOString()})),{outcome:"completed",job:a}}async dispatchStep(e,t,r,o,i,s){switch(r.type){case"agent":return{outcome:"completed",job:await this.executeAgentStep(e,r,o)};case"interaction":return{outcome:"paused",job:await this.pauseForInteraction(e,t,r,o)};case"git":return{outcome:"completed",job:await this.executeGitStep(e,r,o)};case"provider_action":return{outcome:"completed",job:await this.executeProviderActionStep(e,r,o)};case"shell":return{outcome:"completed",job:await this.executeShellStep(e,r,o)};case"loop":return this.runLoopStep(e,t,r,o,i,s);case"sub_workflow":return this.runSubWorkflowStep(e,r,o);default:{let a=r;throw new h(`Step type '${a.type}' not yet supported by the Workflow Runner`)}}}async runLoopStep(e,t,r,o,i,s,a=0,u=r.maxIterations){let c=e,f=a;for(;;){if(f>=u)switch(r.onMaxIterations.action){case"fail":return c=await this.failExecution(c,t,o,r.id,`Loop '${r.id}' exceeded maxIterations (${u})`),{outcome:"failed",job:c};case"continue":return c=await this.finishExecution(c,o,r.id,{iterations:f,exitedOnMaxIterations:!0}),{outcome:"completed",job:c};case"ask_human":{let I={maxIterationsCheckpoint:!0,nextIteration:f,effectiveMaxIterations:u},S=new Date().toISOString(),$=X(c.stepHistory,o,E=>({...E,status:"pending",output:I}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:$,updatedAt:S}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:I,questions:[`Loop '${r.id}' reached maxIterations (${u}). Extend, continue, or cancel?`],timestamp:S}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} hit max iterations on loop '${r.id}'`,jobId:c.id}),{outcome:"paused",job:c}}default:{let I=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(I)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,f,0);if(c=m.job,m.outcome==="paused")return m;if(m.outcome==="failed")return c=await this.failExecution(c,t,o,r.id,"Loop body failed"),{outcome:"failed",job:c};if(wa(r.until,c.context))return c=await this.finishExecution(c,o,r.id,{iterations:f+1}),{outcome:"completed",job:c};f+=1}}async resumeAskHuman(e,t,r,o){let i=o,s=r.output;if(!s?.maxIterationsCheckpoint)throw new Error(`Loop execution ${r.id} is not at an ask_human checkpoint`);let a=Ft(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=Ut(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 $=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:X(e.stepHistory,r.id,E=>({...E,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:$.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:$.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody($,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter($,t,a.id)}let f=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+f,I=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:X(e.stepHistory,r.id,$=>({...$,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:I.id,answers:i,timestamp:c});let S=await this.runLoopStep(I,t,a,r.id,u?.parentLoopExecutionId,u?.iterationIndex,s.nextIteration,m);return S.outcome==="paused"||S.outcome==="failed"?S.job:u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(S.job,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(S.job,t,a.id)}async continueLoopAfterBody(e,t,r,o){let i=ht(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Ft(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=Ut(e.stepHistory,r),u=i.output?.effectiveMaxIterations??s.maxIterations,c=e;if(wa(s.until,c.context))c=await this.finishExecution(c,r,s.id,{iterations:o+1});else{let f=o+1,m=await this.runLoopStep(c,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,f,u);if(m.outcome==="paused"||m.outcome==="failed")return m.job;c=m.job}return a?.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(c,t,a.parentLoopExecutionId,a.iterationIndex):this.continueTopLevelAfter(c,t,s.id)}async continueTopLevelAfter(e,t,r){let o=t.steps.findIndex(s=>s.id===r),i=await this.executeStepSequence(e,t,t.steps,void 0,void 0,o+1);return i.outcome==="paused"||i.outcome==="failed"?i.job:this.completeJob(i.job,t)}sequenceForFrameOnJob(e,t,r){if(r.parentLoopExecutionId==null)return t.steps;let o=ht(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Ft(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="collection")throw new h(`sub_workflow steps require subjectContext.mode === 'collection' (job ${e.id})`);let o=e.subjectContext.subjects,i=[];for(let f=0;f<o.length;f++){let m=o[f],I=await this.createJob({workflowId:t.workflowId,subjectContext:{mode:"single",subject:m},inputValues:{},parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:f});i.push(I)}let s=i.map(f=>f.id),a=new Date().toISOString(),u=X(e.stepHistory,r,f=>({...f,status:"waiting_for_children",childJobIds:s})),c=await this.persistJob({...e,status:"waiting_for_children",currentStepId:t.id,currentStepExecutionId:r,stepHistory:u,updatedAt:a});for(let f of i)this.emit({type:"job_started",jobId:f.id,timestamp:a}),this.runJob(f.id);return{outcome:"paused",job:c}}async onChildTerminal(e){let t=await this.jobs.get(e);if(!t?.parentJobId||!t.parentStepExecutionId)return;let r=`${t.parentJobId}:${t.parentStepExecutionId}`;if(!this.childTerminalLocks.has(r)){this.childTerminalLocks.add(r);try{let o=(await this.jobs.list({parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId})).filter(E=>E.parentStepExecutionId===t.parentStepExecutionId),i=fo(o,E=>E.fanOutIndex);if(!i?.allTerminal)return;let{activeJobs:s}=i,a=await this.jobs.get(t.parentJobId);if(!a||a.status!=="waiting_for_children"&&a.status!=="failed")return;let u=await this.requireWorkflow(a.workflowId),c=t.parentStepExecutionId,f=ht(a.stepHistory,c);if(!f||f.type!=="sub_workflow")return;if(s.some(E=>E.status==="failed")){await this.failExecution(a,u,c,f.stepDefinitionId,"One or more child jobs failed");return}let I=s.slice().sort((E,Nc)=>(E.fanOutIndex??0)-(Nc.fanOutIndex??0)).map(E=>({fanOutIndex:E.fanOutIndex,jobId:E.id,output:E.context})),S=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[f.stepDefinitionId]:I},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:X(a.stepHistory,c,E=>({...E,status:"completed",completedAt:S,output:I})),completedAt:void 0,updatedAt:S}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:f.stepDefinitionId,timestamp:S});let $=await this.continueTopLevelAfter(a,u,f.stepDefinitionId)}finally{this.childTerminalLocks.delete(r)}}}async onBatchMemberTerminal(e){let t=await this.jobs.get(e);if(!t?.batchId)return;let r=t.batchId;if(!this.batchTerminalLocks.has(r)){this.batchTerminalLocks.add(r);try{let o=await this.batches.get(t.batchId);if(!o||o.status!=="running")return;let i=await this.jobs.list({batchId:o.id}),s=fo(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=ga(a),c=new Date().toISOString(),f=await this.batches.update(o.id,{status:u,completedAt:c});if(!f)return;if(this.emit({type:"batch_completed",batchId:f.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:c}),!f.notificationSent){let m=await this.requireWorkflow(f.workflowId),I=f.notificationOverride??m.notificationPolicy,S=u==="completed"?"on_complete":"on_fail";I.triggers.includes(S)&&await this.notifications.send({title:`Batch ${u}: ${m.name}`,body:`JobBatch ${f.id} finished with status '${u}' (${a.length} members)`,batchId:f.id}),await this.batches.update(f.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return Vn(e.viewId,this.views,this.providers);let t=[];for(let r of e.subjectIds)if(e.subjectType==="ticket"){let o=await this.getTicketById(r);t.push({subjectType:"ticket",...o})}else if(e.subjectType==="pull_request"){let o=await this.getPullRequestById(r);t.push({subjectType:"pull_request",...o})}else if(e.subjectType==="documentation"){let o=await this.getDocumentationById(r);t.push({subjectType:"documentation",...o})}else throw new h(`Unsupported subjectType: ${e.subjectType}`);return t}async executeAgentStep(e,t,r){let o=t.knowledgeScope?.length?t.knowledgeScope:xl,i=await this.resolveKnowledge(o),s=gt(e),a=Lt(t.objective,s),u=t.agentInstanceId??(await this.settings.get()).defaultAgentInstanceId;if(!u)throw new Error("No default agent instance configured (set EngineSettings.defaultAgentInstanceId)");let c=await this.providers.getAgentProvider(u).run({objective:a,outputFormat:t.outputFormat,knowledge:i,context:{...s,stepId:t.id},...e.worktreePath?{cwd:e.worktreePath}:{}}),f=fa(t.outputFormat,c.parsed);return this.finishExecution(e,r,t.id,f)}async executeGitStep(e,t,r){let o=mt(t.params,gt(e));switch(t.operation){case"create_worktree":{let i=await this.git.createWorktree(e.id,{repoPath:be(o,"repoPath"),baseBranch:be(o,"baseBranch"),branchName:be(o,"branchName"),...typeof o.worktreePath=="string"?{worktreePath:o.worktreePath}:{}});return this.finishExecution(e,r,t.id,i,{worktreePath:i.worktreePath,branch:i.branch})}case"create_branch":{let i=Gn(e),s=be(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=Gn(e),s=be(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Gn(e),s=await this.git.commit(i,{message:be(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Gn(e);return await this.git.push(i,{...typeof o.remote=="string"?{remote:o.remote}:{},...typeof o.branch=="string"?{branch:o.branch}:{}}),this.finishExecution(e,r,t.id,{remote:typeof o.remote=="string"?o.remote:"origin",branch:typeof o.branch=="string"?o.branch:e.branch})}default:{let i=t.operation;throw new Error(`Unknown git operation: ${i}`)}}}async executeProviderActionStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let o=this.resolveProviderActionSubject(e,t);if(t.extendedAction)return this.executeExtendedProviderAction(e,t,r,o);let i=mt(t.params??{},gt(e))??{},s=await this.dispatchPortableProviderAction(o,t.action,i);return this.finishExecution(e,r,t.id,s)}resolveProviderActionSubject(e,t){if(!t.target){let o=e.subjectContext;if(!o||o.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let i=o.subject;return{subjectType:i.subjectType,source:i.source,subjectId:i.id}}let r=Lt(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":return await u.postComment(s,be(r,"body")),{posted:!0};case"update_status":throw new Error(`Provider action '${t}' is not valid for subject type 'documentation'`);default:{let c=t;throw new Error(`Unknown provider action: ${c}`)}}}let a=o==="ticket"?this.providers.getTicketProvider(i):o==="pull_request"?this.providers.getRepoProvider(i):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${o}`);switch(t){case"get_subject":return a.get(s);case"get_comments":return a.getComments(s);case"post_comment":return await a.postComment(s,be(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,be(r,"status")),{status:be(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(!vs(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: ${lt(a)}`);let c=mt(i.params??{},gt(e))??{};jn(u,c);let f=await s.executeExtendedAction(i.actionId,{...c,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,f)}async executeShellStep(e,t,r){let o=Lt(t.command,gt(e)),i=e.worktreePath??process.cwd();try{let s=await El(o,{cwd:i,windowsHide:!0});return this.finishExecution(e,r,t.id,{exitCode:0,stdout:String(s.stdout??""),stderr:String(s.stderr??"")})}catch(s){let a=s,u=a.stderr??"",c=a.stdout??"",f=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${f}, cwd=${i}): ${u||c||a.message||o}`)}}async pauseForInteraction(e,t,r,o){let i=new Date().toISOString(),s=Tl(t,r.id),a=s!=null?e.context[s]:void 0,u=X(e.stepHistory,o,I=>({...I,status:"pending"})),c=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:u,updatedAt:i}),f=ua(r.interaction,a);return this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:r.interaction,data:a,questions:f,timestamp:i}),t.notificationPolicy.triggers.includes("on_needs_input")&&r.notify!==!1&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} is waiting for human input on step '${r.id}'`,jobId:c.id}),c}async finishExecution(e,t,r,o,i={}){let s=new Date().toISOString(),a=X(e.stepHistory,t,c=>({...c,status:"completed",completedAt:s,output:o})),u=await this.persistJob({...e,...i,context:{...e.context,[r]:o},stepHistory:a,updatedAt:s});return this.emit({type:"step_completed",jobId:u.id,stepDefinitionId:r,timestamp:s}),u}async failExecution(e,t,r,o,i){return this.failJob(e,t,r,o,new Error(i))}async completeJob(e,t){let r=new Date().toISOString(),o=await this.persistJob({...e,status:"completed",currentStepId:void 0,currentStepExecutionId:void 0,completedAt:r,updatedAt:r});return this.emit({type:"job_completed",jobId:o.id,timestamp:r}),await this.onBatchMemberTerminal(o.id),!o.batchId&&t.notificationPolicy.triggers.includes("on_complete")&&await this.notifications.send({title:`Job completed: ${t.name}`,body:`Job ${o.id} completed successfully`,jobId:o.id}),o}async failJob(e,t,r,o,i){let s=i instanceof Error?i.message:String(i),a=new Date().toISOString(),u=X(e.stepHistory,r,f=>({...f,status:"failed",completedAt:a,error:s})),c=await this.persistJob({...e,status:"failed",stepHistory:u,completedAt:a,updatedAt:a});return this.emit({type:"step_failed",jobId:c.id,stepDefinitionId:o,error:s,timestamp:a}),this.emit({type:"job_failed",jobId:c.id,error:s,timestamp:a}),await this.onBatchMemberTerminal(c.id),!c.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${c.id} failed on step '${o}': ${s}`,jobId:c.id}),c}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=Rl(e.appliesTo);if(!t)throw new Error(`Workflow '${e.id}' applies to '${r}' but no subjectId was provided`);if(r==="ticket")return{mode:"single",subject:{subjectType:"ticket",...await this.getTicketById(t)}};if(r==="pull_request")return{mode:"single",subject:{subjectType:"pull_request",...await this.getPullRequestById(t)}};if(r==="documentation")return{mode:"single",subject:{subjectType:"documentation",...await this.getDocumentationById(t)}};throw new Error(`Unsupported subjectType for workflow subject resolution: ${r}`)}async resolveKnowledge(e){let t=[];for(let r of e)t.push(...await this.knowledge.resolve(r));return t}async requireWorkflow(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async persistJob(e){let t=await this.jobs.update(e.id,{status:e.status,context:e.context,currentStepId:e.currentStepId,currentStepExecutionId:e.currentStepExecutionId,stepHistory:e.stepHistory,worktreePath:e.worktreePath,branch:e.branch,updatedAt:e.updatedAt,completedAt:e.completedAt});if(!t)throw new Error(`Failed to persist job ${e.id}`);return t}emit(e){this.events.emit(e)}async getTicketById(e){return go(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return go(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return go(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};se=Sl([Il(),ye(0,we(k)),ye(1,we(N)),ye(2,we(Z)),ye(3,we(Y)),ye(4,we(ie)),ye(5,we(C)),ye(6,we(Et)),ye(7,we(xt)),ye(8,we(Pe)),ye(9,we(x)),_l("design:paramtypes",[k,N,Z,Y,ie,C,Object,Object,Pe,Object])],se)});import{Module as Al}from"@nestjs/common";var Pl,yt,yo=p(()=>{"use strict";Ct();Jn();Kn();aa();Xn();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},yt=class{};yt=Pl([Al({imports:[ge,Ke,We,Wn],providers:[se],exports:[se]})],yt)});import{Catch as kl}from"@nestjs/common";var Ol,Qn,Sa=p(()=>{"use strict";R();Ol=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Qn=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message})}};Qn=Ol([kl(Ze)],Qn)});var _,ae=p(()=>{"use strict";R();_=class{schema;constructor(e){this.schema=e}transform(e){let t=this.schema.safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.join(".")||"(root)"}: ${o.message}`).join("; ");throw new h(`Validation failed: ${r}`)}return t.data}}});import{randomUUID as Nl}from"node:crypto";function Cl(){return Nl()}function wo(n){let e=n.id??Cl(),t=Ci(n.steps),r=_a(n.steps,t);return{...n,id:e,steps:r}}function _a(n,e){return n.map(t=>{let r=t.id;return r||(r=Oi(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:_a(t.steps,e)}:{...t,id:r}})}var Ia=p(()=>{"use strict";q()});function ja(n,e,t){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo==="none")throw new h(`Cannot bind a View to workflow '${e}' because appliesTo is 'none'`);if(!Vi(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function va(n,e){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo!=="none")throw new h(`WorkflowShortcut requires appliesTo 'none', got '${String(n.appliesTo)}'`);if(n.subjectHandling!=="per-subject")throw new h(`WorkflowShortcut requires subjectHandling 'per-subject', got '${n.subjectHandling}'`);return n}function bo(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var zn=p(()=>{"use strict";q();R()});import{Body as xa,Controller as ql,Delete as $l,Get as Ta,HttpCode as Dl,Inject as Ea,Param as So,Patch as Bl,Post as Ll,Query as Ul}from"@nestjs/common";var wt,L,Ve,Fl,Ae,Ra=p(()=>{"use strict";q();at();ct();R();ae();Ia();zn();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},L=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ve=function(n,e){return function(t,r){e(t,r,n)}},Fl=new Set(["completed","failed","cancelled"]),Ae=class{workflows;jobs;constructor(e,t){this.workflows=e,this.jobs=t}async list(e){if(e!=null&&e!==""&&e!=="per-subject"&&e!=="collection")throw new h(`Invalid subjectHandling filter: ${e}`);return this.workflows.list(e?{subjectHandling:e}:{})}async get(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async create(e){let t=wo(e),r=Nt.safeParse(t);if(!r.success){let o=r.error.issues.map(i=>`${i.path.join(".")||"(root)"}: ${i.message}`).join("; ");throw new h(`Validation failed: ${o}`)}return bo(r.data),this.workflows.create(r.data)}async update(e,t){let r=wo({...t,id:e}),o=Nt.safeParse(r);if(!o.success){let u=o.error.issues.map(c=>`${c.path.join(".")||"(root)"}: ${c.message}`).join("; ");throw new h(`Validation failed: ${u}`)}bo(o.data);let{id:i,...s}=o.data,a=await this.workflows.update(e,s);if(!a)throw new g(`Workflow not found: ${e}`);return a}async remove(e){if(!await this.workflows.get(e))throw new g(`Workflow not found: ${e}`);let o=(await this.jobs.list({workflowId:e})).filter(s=>!Fl.has(s.status));if(o.length>0){let s=o.length===1?"Job":"Jobs";throw new Te(`Cannot delete workflow ${e}: ${o.length} non-terminal ${s} still reference it`)}if(!await this.workflows.delete(e))throw new g(`Workflow not found: ${e}`)}};wt([Ta(),Ve(0,Ul("subjectHandling")),L("design:type",Function),L("design:paramtypes",[String]),L("design:returntype",Promise)],Ae.prototype,"list",null);wt([Ta(":id"),Ve(0,So("id")),L("design:type",Function),L("design:paramtypes",[String]),L("design:returntype",Promise)],Ae.prototype,"get",null);wt([Ll(),Ve(0,xa(new _(ut))),L("design:type",Function),L("design:paramtypes",[Object]),L("design:returntype",Promise)],Ae.prototype,"create",null);wt([Bl(":id"),Ve(0,So("id")),Ve(1,xa(new _(ut))),L("design:type",Function),L("design:paramtypes",[String,Object]),L("design:returntype",Promise)],Ae.prototype,"update",null);wt([$l(":id"),Dl(204),Ve(0,So("id")),L("design:type",Function),L("design:paramtypes",[String]),L("design:returntype",Promise)],Ae.prototype,"remove",null);Ae=wt([ql("workflows"),Ve(0,Ea(k)),Ve(1,Ea(N)),L("design:paramtypes",[k,N])],Ae)});import{Body as Io,Controller as Jl,Delete as Ml,Get as jo,HttpCode as Hl,Inject as _o,Param as Yn,Patch as Pa,Post as Kl,Query as Wl}from"@nestjs/common";var Ge,T,ce,ue,Aa=p(()=>{"use strict";q();en();at();R();ae();zn();ft();mo();Ge=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(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)},ce=function(n,e){return function(t,r){e(t,r,n)}},ue=class{views;workflows;providers;constructor(e,t,r){this.views=e,this.workflows=t,this.providers=r}async list(e){if(e!=null&&e!==""){let t=G.safeParse(e);if(!t.success)throw new h(`Invalid subjectType filter: ${e}`);return this.views.list({subjectType:t.data})}return this.views.list({})}async reorder(e){let t=[];for(let i of e.viewIds){let s=await this.views.get(i);if(!s)throw new h(`Unknown view id in reorder: ${i}`);t.push(s)}if(new Set(t.map(i=>i.subjectType)).size!==1)throw new h("All viewIds in a reorder request must share the same subjectType");return await this.views.reorder(e.viewIds)}async listSubjects(e){return Vn(e,this.views,this.providers)}async get(e){let t=await this.views.get(e);if(!t)throw new g(`SubjectView not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId,e.subjectType),this.views.create(e)}async update(e,t){let r=await this.views.get(e);if(!r)throw new g(`SubjectView not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId,t.subjectType??r.subjectType);let o=await this.views.update(e,t);if(!o)throw new g(`SubjectView not found: ${e}`);return o}async remove(e){if(!await this.views.delete(e))throw new g(`SubjectView not found: ${e}`)}async assertBinding(e,t){let r=await this.workflows.get(e);ja(r,e,t)}};Ge([jo(),ce(0,Wl("subjectType")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ue.prototype,"list",null);Ge([Pa("reorder"),ce(0,Io(new _(an))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],ue.prototype,"reorder",null);Ge([jo(":id/subjects"),ce(0,Yn("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ue.prototype,"listSubjects",null);Ge([jo(":id"),ce(0,Yn("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ue.prototype,"get",null);Ge([Kl(),ce(0,Io(new _(on))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],ue.prototype,"create",null);Ge([Pa(":id"),ce(0,Yn("id")),ce(1,Io(new _(sn))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],ue.prototype,"update",null);Ge([Ml(":id"),Hl(204),ce(0,Yn("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],ue.prototype,"remove",null);ue=Ge([Jl("views"),ce(0,_o(Y)),ce(1,_o(k)),ce(2,_o(C)),T("design:paramtypes",[Y,k,C])],ue)});import{Body as vo,Controller as Vl,Delete as Gl,Get as ka,HttpCode as Xl,Inject as Oa,Param as Eo,Patch as Na,Post as Ql}from"@nestjs/common";var et,P,Xe,Se,Ca=p(()=>{"use strict";q();Lr();at();R();ae();zn();et=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(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)},Xe=function(n,e){return function(t,r){e(t,r,n)}},Se=class{shortcuts;workflows;constructor(e,t){this.shortcuts=e,this.workflows=t}async list(){return this.shortcuts.list()}async reorder(e){for(let t of e.shortcutIds)if(!await this.shortcuts.get(t))throw new h(`Unknown shortcut id in reorder: ${t}`);return this.shortcuts.reorder(e.shortcutIds)}async get(e){let t=await this.shortcuts.get(e);if(!t)throw new g(`WorkflowShortcut not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId),this.shortcuts.create(e)}async update(e,t){let r=await this.shortcuts.get(e);if(!r)throw new g(`WorkflowShortcut not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId);let o=await this.shortcuts.update(e,t);if(!o)throw new g(`WorkflowShortcut not found: ${e}`);return o}async remove(e){if(!await this.shortcuts.delete(e))throw new g(`WorkflowShortcut not found: ${e}`)}async assertBinding(e){let t=await this.workflows.get(e);va(t,e)}};et([ka(),P("design:type",Function),P("design:paramtypes",[]),P("design:returntype",Promise)],Se.prototype,"list",null);et([Na("reorder"),Xe(0,vo(new _(ln))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],Se.prototype,"reorder",null);et([ka(":id"),Xe(0,Eo("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],Se.prototype,"get",null);et([Ql(),Xe(0,vo(new _(dn))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],Se.prototype,"create",null);et([Na(":id"),Xe(0,Eo("id")),Xe(1,vo(new _(pn))),P("design:type",Function),P("design:paramtypes",[String,Object]),P("design:returntype",Promise)],Se.prototype,"update",null);et([Gl(":id"),Xl(204),Xe(0,Eo("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],Se.prototype,"remove",null);Se=et([Vl("workflow-shortcuts"),Xe(0,Oa(xe)),Xe(1,Oa(k)),P("design:paramtypes",[xe,k])],Se)});function Zn(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 er(n,e,t){return n.slice(t,t+e)}var xo=p(()=>{"use strict"});import{z as ne}from"zod";var tr,nr,rr,To=p(()=>{"use strict";tr=ne.object({workflowId:ne.string().min(1),subjectId:ne.string().min(1).optional(),inputValues:ne.record(ne.string(),ne.unknown())}),nr=ne.object({response:ne.unknown()}),rr=ne.object({workflowId:ne.string().min(1),subjectIds:ne.array(ne.string().min(1))})});import{Body as Ro,Controller as zl,Get as Da,HttpCode as Yl,Inject as qa,Param as Po,Post as or,Query as Qe}from"@nestjs/common";import"zod";function $a(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var tt,A,U,Zl,_e,Ba=p(()=>{"use strict";Xn();ct();R();ae();xo();To();tt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},A=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},U=function(n,e){return function(t,r){e(t,r,n)}},Zl=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];_e=class{jobs;runner;constructor(e,t){this.jobs=e,this.runner=t}async list(e,t,r,o,i,s,a,u){if(t!=null&&t!==""&&!Zl.includes(t))throw new h(`Invalid status filter: ${t}`);let c=$a(i,"topLevelOnly"),f=$a(s,"terminal"),{limit:m,offset:I}=Zn(a,u),S=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...c===!0?{topLevelOnly:!0}:{},...f!==void 0?{terminal:f}:{}});return er(S,m,I)}async latestBySubject(e){return this.jobs.latestBySubject(e.workflowId,e.subjectIds)}async get(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);return t}async create(e){return this.runner.start({workflowId:e.workflowId,...e.subjectId?{subjectId:e.subjectId}:{},inputValues:e.inputValues})}async resume(e,t){return this.runner.resume(e,t.response)}async retry(e){return this.runner.retryFailedJob(e)}};tt([Da(),U(0,Qe("workflowId")),U(1,Qe("status")),U(2,Qe("batchId")),U(3,Qe("parentJobId")),U(4,Qe("topLevelOnly")),U(5,Qe("terminal")),U(6,Qe("limit")),U(7,Qe("offset")),A("design:type",Function),A("design:paramtypes",[String,String,String,String,String,String,String,String]),A("design:returntype",Promise)],_e.prototype,"list",null);tt([or("latest-by-subject"),Yl(200),U(0,Ro(new _(rr))),A("design:type",Function),A("design:paramtypes",[Object]),A("design:returntype",Promise)],_e.prototype,"latestBySubject",null);tt([Da(":id"),U(0,Po("id")),A("design:type",Function),A("design:paramtypes",[String]),A("design:returntype",Promise)],_e.prototype,"get",null);tt([or(),U(0,Ro(new _(tr))),A("design:type",Function),A("design:paramtypes",[Object]),A("design:returntype",Promise)],_e.prototype,"create",null);tt([or(":id/resume"),U(0,Po("id")),U(1,Ro(new _(nr))),A("design:type",Function),A("design:paramtypes",[String,Object]),A("design:returntype",Promise)],_e.prototype,"resume",null);tt([or(":id/retry"),U(0,Po("id")),A("design:type",Function),A("design:paramtypes",[String]),A("design:returntype",Promise)],_e.prototype,"retry",null);_e=tt([zl("jobs"),U(0,qa(N)),U(1,qa(se)),A("design:paramtypes",[N,se])],_e)});import{z as V}from"zod";var ir,sr,Ao=p(()=>{"use strict";q();ir=V.discriminatedUnion("mode",[V.object({mode:V.literal("view"),viewId:V.string().min(1)}),V.object({mode:V.literal("manual"),subjectType:G,subjectIds:V.array(V.string().min(1))})]),sr=V.object({workflowId:V.string().min(1),selection:ir,triggeredBy:V.enum(["schedule","view_bulk","multiselect"]),notificationOverride:kt.optional(),inputValues:V.record(V.string(),V.unknown())})});import{Body as ef,Controller as tf,Get as No,Inject as Oo,Param as La,Post as nf,Query as ko}from"@nestjs/common";import"zod";var Jt,Q,Oe,ze,Ua=p(()=>{"use strict";Xn();tn();ct();R();ae();xo();Ao();Jt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Q=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)}},ze=class{batches;jobs;runner;constructor(e,t,r){this.batches=e,this.jobs=t,this.runner=r}async list(e,t,r){let{limit:o,offset:i}=Zn(t,r),s=await this.batches.list(e?{workflowId:e}:{});return er(s,o,i)}async get(e){let t=await this.batches.get(e);if(!t)throw new g(`JobBatch not found: ${e}`);return t}async listJobs(e){if(!await this.batches.get(e))throw new g(`JobBatch not found: ${e}`);return this.jobs.list({batchId:e})}async launch(e){let t=await this.runner.launch({workflowId:e.workflowId,selection:e.selection,triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},inputValues:e.inputValues});return"resolvedSubjects"in t&&"jobIds"in t?{kind:"batch",batch:t}:{kind:"job",job:t}}};Jt([No(),Oe(0,ko("workflowId")),Oe(1,ko("limit")),Oe(2,ko("offset")),Q("design:type",Function),Q("design:paramtypes",[String,String,String]),Q("design:returntype",Promise)],ze.prototype,"list",null);Jt([No(":id"),Oe(0,La("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],ze.prototype,"get",null);Jt([No(":id/jobs"),Oe(0,La("id")),Q("design:type",Function),Q("design:paramtypes",[String]),Q("design:returntype",Promise)],ze.prototype,"listJobs",null);Jt([nf(),Oe(0,ef(new _(sr))),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],ze.prototype,"launch",null);ze=Jt([tf("batches"),Oe(0,Oo(Z)),Oe(1,Oo(N)),Oe(2,Oo(se)),Q("design:paramtypes",[Z,N,se])],ze)});import{Body as Fa,Controller as rf,Delete as of,Get as Ja,HttpCode as sf,Inject as af,Param as Co,Patch as cf,Post as uf,Query as df}from"@nestjs/common";var bt,F,nt,ke,Ma=p(()=>{"use strict";q();Dr();R();ae();bt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},F=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},nt=function(n,e){return function(t,r){e(t,r,n)}},ke=class{schedules;constructor(e){this.schedules=e}async list(e){if(e==null||e==="")return this.schedules.list();if(e!=="true"&&e!=="false")throw new h(`Invalid enabled filter: ${e}`);return this.schedules.list({enabled:e==="true"})}async get(e){let t=await this.schedules.get(e);if(!t)throw new g(`Schedule not found: ${e}`);return t}async create(e){return this.schedules.create(e)}async update(e,t){let r=await this.schedules.update(e,t);if(!r)throw new g(`Schedule not found: ${e}`);return r}async remove(e){if(!await this.schedules.delete(e))throw new g(`Schedule not found: ${e}`)}};bt([Ja(),nt(0,df("enabled")),F("design:type",Function),F("design:paramtypes",[String]),F("design:returntype",Promise)],ke.prototype,"list",null);bt([Ja(":id"),nt(0,Co("id")),F("design:type",Function),F("design:paramtypes",[String]),F("design:returntype",Promise)],ke.prototype,"get",null);bt([uf(),nt(0,Fa(new _(dt))),F("design:type",Function),F("design:paramtypes",[Object]),F("design:returntype",Promise)],ke.prototype,"create",null);bt([cf(":id"),nt(0,Co("id")),nt(1,Fa(new _(dt.partial().omit({id:!0})))),F("design:type",Function),F("design:paramtypes",[String,Object]),F("design:returntype",Promise)],ke.prototype,"update",null);bt([of(":id"),sf(204),nt(0,Co("id")),F("design:type",Function),F("design:paramtypes",[String]),F("design:returntype",Promise)],ke.prototype,"remove",null);ke=bt([rf("schedules"),nt(0,af(Ee)),F("design:paramtypes",[Ee])],ke)});import{Controller as pf,Inject as lf,Query as Ha,Sse as ff}from"@nestjs/common";import{Observable as Wa}from"rxjs";var Ka,ar,qo,Mt,Va=p(()=>{"use strict";Hn();Ka=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ar=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},qo=function(n,e){return function(t,r){e(t,r,n)}},Mt=class{events;constructor(e){this.events=e}stream(e,t){return new Wa(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()}})}};Ka([ff(),qo(0,Ha("jobId")),qo(1,Ha("batchId")),ar("design:type",Function),ar("design:paramtypes",[String,String]),ar("design:returntype",Wa)],Mt.prototype,"stream",null);Mt=Ka([pf("events"),qo(0,lf(ie)),ar("design:paramtypes",[ie])],Mt)});import{extendZodWithOpenApi as mf}from"@asteasolutions/zod-to-openapi";import{z as hf}from"zod";var Ga=p(()=>{"use strict";mf(hf)});import{z as Xa}from"zod";var cr,$o=p(()=>{"use strict";cr=Xa.object({value:Xa.string().min(1)})});import{z as d}from"zod";function Cf(n){let e=d.toJSONSchema(n),{$schema:t,...r}=e;return r}function za(n){let e=(t,r)=>n.registerComponent("schemas",t,Cf(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",Nt),WorkflowDefinitionInput:e("WorkflowDefinitionInput",ut),UpdateWorkflowBody:e("UpdateWorkflowBody",Tf),SubjectView:e("SubjectView",rn),CreateSubjectViewBody:e("CreateSubjectViewBody",on),ReorderViewsBody:e("ReorderViewsBody",an),UpdateViewBody:e("UpdateViewBody",Rf),WorkflowShortcut:e("WorkflowShortcut",un),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",dn),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",pn),ReorderShortcutsBody:e("ReorderShortcutsBody",ln),Schedule:e("Schedule",dt),UpdateScheduleBody:e("UpdateScheduleBody",Pf),EngineSettings:e("EngineSettings",mn),UpdateSettingsBody:e("UpdateSettingsBody",Of),SettingsPatchResponse:e("SettingsPatchResponse",Nf),ProviderInstanceConfig:e("ProviderInstanceConfig",fn),CreateProviderInstanceBody:e("CreateProviderInstanceBody",gn),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",yn),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",kf),SetSecretBody:e("SetSecretBody",cr),CreateJobBody:e("CreateJobBody",tr),ResumeJobBody:e("ResumeJobBody",nr),LatestBySubjectBody:e("LatestBySubjectBody",rr),LatestBySubjectResponse:e("LatestBySubjectResponse",Af),LaunchBody:e("LaunchBody",sr),Job:e("Job",Do),JobBatch:e("JobBatch",Qa),LaunchResponse:e("LaunchResponse",If),HealthResponse:e("HealthResponse",jf),ProviderStatus:e("ProviderStatus",vf),QueryTemplate:e("QueryTemplate",xi),ProviderActionDescriptor:e("ProviderActionDescriptor",Ti),PreviewModelsBody:e("PreviewModelsBody",wn),PreviewModel:e("PreviewModel",ds),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",nn),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",Ri),ErrorResponse:e("ErrorResponse",Ef),EngineEvent:e("EngineEvent",xf),Subject:e("Subject",ur)}}var gf,yf,wf,bf,ur,Sf,_f,Do,Qa,If,jf,vf,Ef,xf,Tf,Rf,Pf,Af,Of,kf,Nf,O,Bo,Lo=p(()=>{"use strict";Ga();q();To();Ao();$o();gf=d.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),yf=d.object({subjectType:d.literal("ticket"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),status:d.string(),assignee:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),wf=d.object({subjectType:d.literal("pull_request"),id:d.string(),source:d.string().min(1),title:d.string(),description:d.string().optional(),sourceBranch:d.string(),targetBranch:d.string(),author:d.string().optional(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),bf=d.object({subjectType:d.literal("documentation"),id:d.string(),source:d.string().min(1),title:d.string(),url:d.string().optional(),raw:d.record(d.string(),d.unknown()).optional()}),ur=d.discriminatedUnion("subjectType",[yf,wf,bf]),Sf=d.discriminatedUnion("mode",[d.object({mode:d.literal("single"),subject:ur}),d.object({mode:d.literal("collection"),subjects:d.array(ur)})]),_f=d.object({id:d.string(),stepDefinitionId:d.string(),type:d.string(),status:d.enum(["pending","running","waiting_for_children","completed","failed","skipped"]),startedAt:d.string().optional(),completedAt:d.string().optional(),output:d.unknown().optional(),error:d.string().optional(),childJobIds:d.array(d.string()).optional(),iterations:d.array(d.object({index:d.number().int(),stepExecutions:d.array(d.record(d.string(),d.unknown())),startedAt:d.string(),completedAt:d.string().optional()})).optional()}),Do=d.object({id:d.string(),workflowId:d.string(),status:gf,subjectContext:Sf.optional(),selection:ir.optional(),batchId:d.string().optional(),parentJobId:d.string().optional(),parentStepExecutionId:d.string().optional(),fanOutIndex:d.number().int().optional(),retryOf:d.string().optional(),context:d.record(d.string(),d.unknown()),worktreePath:d.string().optional(),branch:d.string().optional(),currentStepId:d.string().optional(),currentStepExecutionId:d.string().optional(),stepHistory:d.array(_f),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().optional()}),Qa=d.object({id:d.string(),workflowId:d.string(),selection:ir,resolvedSubjects:d.array(ur),jobIds:d.array(d.string()),status:d.enum(["running","completed","completed_with_issues","failed"]),triggeredBy:d.enum(["schedule","view_bulk","multiselect"]),scheduleId:d.string().optional(),notificationOverride:kt.optional(),notificationSent:d.boolean(),createdAt:d.string(),completedAt:d.string().optional()}),If=d.discriminatedUnion("kind",[d.object({kind:d.literal("job"),job:Do}),d.object({kind:d.literal("batch"),batch:Qa})]),jf=d.object({ok:d.boolean(),service:d.string(),timestamp:d.string()}),vf=d.object({providerId:d.string(),secretKey:d.string(),configured:d.boolean()}),Ef=d.object({error:d.string()}),xf=d.object({type:d.string(),timestamp:d.string()}).passthrough(),Tf=ut,Rf=sn,Pf=dt.partial().omit({id:!0}),Af=d.record(d.string(),Do.nullable()),Of=hn,kf=d.object({settings:mn,restartRequired:d.literal(!0)}),Nf=d.object({settings:mn,restartRequired:d.boolean()}),O=d.object({id:d.string().min(1)}),Bo=d.object({limit:d.string().optional().openapi({description:"Max items to return (default 50)"}),offset:d.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as j}from"zod";function y(n,e){return{description:e,content:{"application/json":{schema:n}}}}function H(n){return{type:"array",items:n}}function b(n,...e){let t={400:"Validation error",404:"Resource not found",409:"Conflict"};return Object.fromEntries(e.map(r=>[String(r),y(n.ErrorResponse,t[r]??"Error")]))}function Ya(n,e){n.registerPath({method:"get",path:"/health",tags:["Health"],summary:"Health check",responses:{200:y(e.HealthResponse,"Service is healthy")}}),n.registerPath({method:"get",path:"/workflows",tags:["Workflows"],summary:"List workflow definitions",request:{query:j.object({subjectHandling:j.enum(["per-subject","collection"]).optional()})},responses:{200:y(H(e.WorkflowDefinition),"Workflow definitions"),...b(e,400)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:O},responses:{200:y(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflows",tags:["Workflows"],summary:"Create a workflow definition",request:{body:{required:!0,content:{"application/json":{schema:e.WorkflowDefinitionInput}}}},responses:{201:y(e.WorkflowDefinition,"Created workflow definition"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:y(e.WorkflowDefinition,"Updated workflow definition"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflows/{id}",tags:["Workflows"],summary:"Delete a workflow definition",description:"Rejected with 409 if any non-terminal Job still references the workflow. Terminal Jobs (completed, failed, cancelled) do not block deletion.",request:{params:O},responses:{204:{description:"Workflow deleted"},...b(e,404,409)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:j.object({subjectType:G.optional()})},responses:{200:y(H(e.SubjectView),"Subject views"),...b(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:O},responses:{200:y(e.SubjectView,"Subject view"),...b(e,404)}}),n.registerPath({method:"get",path:"/views/{id}/subjects",tags:["Views"],summary:"Preview subjects matching a view",description:"Live provider query for the View's saved filter. Same resolution path as launch() for { mode: 'view' }. Does not create Jobs or snapshots.",request:{params:O},responses:{200:y(H(e.Subject),"Matching subjects"),...b(e,404,400)}}),n.registerPath({method:"patch",path:"/views/reorder",tags:["Views"],summary:"Reorder views within a subject type group",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderViewsBody}}}},responses:{200:y(H(e.SubjectView),"Reordered views for the subject type"),...b(e,400)}}),n.registerPath({method:"post",path:"/views",tags:["Views"],summary:"Create a subject view",request:{body:{required:!0,content:{"application/json":{schema:e.CreateSubjectViewBody}}}},responses:{201:y(e.SubjectView,"Created subject view"),...b(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:y(e.SubjectView,"Updated subject view"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/views/{id}",tags:["Views"],summary:"Delete a subject view",request:{params:O},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:Bo.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."})})},responses:{200:y(H(e.Job),"Jobs"),...b(e,400)}}),n.registerPath({method:"get",path:"/jobs/{id}",tags:["Jobs"],summary:"Get a job",request:{params:O},responses:{200:y(e.Job,"Job"),...b(e,404)}}),n.registerPath({method:"post",path:"/jobs",tags:["Jobs"],summary:"Start a single job",request:{body:{required:!0,content:{"application/json":{schema:e.CreateJobBody}}}},responses:{201:y(e.Job,"Started job"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/jobs/latest-by-subject",tags:["Jobs"],summary:"Latest job per subject for a workflow",request:{body:{required:!0,content:{"application/json":{schema:e.LatestBySubjectBody}}}},responses:{200:y(e.LatestBySubjectResponse,"Latest job keyed by subject id"),...b(e,400)}}),n.registerPath({method:"post",path:"/jobs/{id}/resume",tags:["Jobs"],summary:"Resume a job waiting for human input",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:y(e.Job,"Resumed job"),...b(e,400,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/retry",tags:["Jobs"],summary:"Retry a failed job",request:{params:O},responses:{200:y(e.Job,"Retry job"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:Bo.extend({workflowId:j.string().optional()})},responses:{200:y(H(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:O},responses:{200:y(e.JobBatch,"Job batch"),...b(e,404)}}),n.registerPath({method:"get",path:"/batches/{id}/jobs",tags:["Batches"],summary:"List jobs in a batch",request:{params:O},responses:{200:y(H(e.Job),"Jobs in the batch"),...b(e,404)}}),n.registerPath({method:"post",path:"/batches",tags:["Batches"],summary:"Launch a per-subject batch or collection run",description:"Resolves subject selection and starts a JobBatch for per-subject workflows (even for one subject) or a single Job for collection workflows.",request:{body:{required:!0,content:{"application/json":{schema:e.LaunchBody}}}},responses:{201:y(e.LaunchResponse,"Launch result"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:y(H(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:O},responses:{200:y(e.WorkflowShortcut,"Workflow shortcut"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"Create a workflow shortcut",request:{body:{required:!0,content:{"application/json":{schema:e.CreateWorkflowShortcutBody}}}},responses:{201:y(e.WorkflowShortcut,"Created workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/reorder",tags:["Workflow shortcuts"],summary:"Reorder workflow shortcuts",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderShortcutsBody}}}},responses:{200:y(H(e.WorkflowShortcut),"Reordered workflow shortcuts"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Update a workflow shortcut",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:y(e.WorkflowShortcut,"Updated workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Delete a workflow shortcut",request:{params:O},responses:{204:{description:"Workflow shortcut deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/schedules",tags:["Schedules"],summary:"List schedules",request:{query:j.object({enabled:j.enum(["true","false"]).optional()})},responses:{200:y(H(e.Schedule),"Schedules"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:O},responses:{200:y(e.Schedule,"Schedule"),...b(e,404)}}),n.registerPath({method:"post",path:"/schedules",tags:["Schedules"],summary:"Create a schedule",description:"CRUD only \u2014 creating or enabling a schedule does not cause it to fire yet.",request:{body:{required:!0,content:{"application/json":{schema:e.Schedule}}}},responses:{201:y(e.Schedule,"Created schedule"),...b(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:y(e.Schedule,"Updated schedule"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:O},responses:{204:{description:"Schedule deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/providers/status",tags:["Providers"],summary:"Provider secret configuration status",description:"Reports whether each known provider API key is set. Returns key *names* only \u2014 never secret values.",responses:{200:y(H(e.ProviderStatus),"Provider configuration status")}}),n.registerPath({method:"post",path:"/providers/preview-models",tags:["Providers"],summary:"Preview models available to an agent API key",description:"Lookup only \u2014 does not persist settings or secrets. Send apiKey to try a typed key before save, or instanceId to use the already-stored key (never echoed).",request:{body:{required:!0,content:{"application/json":{schema:e.PreviewModelsBody}}}},responses:{200:y(H(e.PreviewModel),"Models available to the key"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/providers/{providerId}/query-templates",tags:["Providers"],summary:"List query templates for a provider",description:"Named, pre-built query templates owned by the provider. Providers with none yet (e.g. documentation) return an empty list. The client never constructs `query` itself \u2014 it submits templateId + params to the resolve endpoint.",request:{params:j.object({providerId:j.string().min(1)})},responses:{200:y(H(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:y(H(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:y(e.ResolveQueryTemplateResponse,"Resolved query"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/settings",tags:["Settings"],summary:"Get engine settings",description:"Persisted provider configuration. Never includes secret values \u2014 those live in SecretStore.",responses:{200:y(e.EngineSettings,"Current engine settings")}}),n.registerPath({method:"patch",path:"/settings",tags:["Settings"],summary:"Update engine settings",description:"Partial merge. restartRequired is true when providerInstances is in the patch (instance bindings are boot-time). Changing defaultAgentInstanceId takes effect on the next agent step with no restart.",request:{body:{required:!0,content:{"application/json":{schema:e.UpdateSettingsBody}}}},responses:{200:y(e.SettingsPatchResponse,"Updated settings"),...b(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:y(H(e.ProviderInstanceConfig),"Configured provider instances")}}),n.registerPath({method:"post",path:"/provider-instances",tags:["Settings"],summary:"Create a provider instance",description:"Persists the instance. restartRequired is always true \u2014 bindings are boot-time. For agent instances, defaultAgent atomically replaces EngineSettings.defaultAgentInstanceId in the same write.",request:{body:{required:!0,content:{"application/json":{schema:e.CreateProviderInstanceBody}}}},responses:{201:y(e.ProviderInstanceMutationResponse,"Created instance settings"),...b(e,400,409)}}),n.registerPath({method:"get",path:"/provider-instances/{id}",tags:["Settings"],summary:"Get a provider instance",request:{params:j.object({id:j.string().min(1)})},responses:{200:y(e.ProviderInstanceConfig,"Provider instance"),...b(e,404)}}),n.registerPath({method:"patch",path:"/provider-instances/{id}",tags:["Settings"],summary:"Update a provider instance",request:{params:j.object({id:j.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.UpdateProviderInstanceBody}}}},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated instance settings"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/provider-instances/{id}",tags:["Settings"],summary:"Delete a provider instance",request:{params:j.object({id:j.string().min(1)})},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated settings after delete"),...b(e,404)}}),n.registerPath({method:"post",path:"/secrets/{key}",tags:["Settings"],summary:"Store a secret",description:"Writes to SecretStore. The response never includes the secret value.",request:{params: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 Za=p(()=>{"use strict";q();Lo()});import{OpenAPIRegistry as qf,OpenApiGeneratorV31 as $f}from"@asteasolutions/zod-to-openapi";function ec(){if(dr)return dr;let n=new qf,e=za(n);return Ya(n,e),dr=new $f(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"}]}),dr}var dr,tc=p(()=>{"use strict";Lo();Za()});import{Controller as Df,Get as Bf,Header as Lf}from"@nestjs/common";var nc,Uo,Ht,rc=p(()=>{"use strict";tc();nc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Uo=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ht=class{getOpenApiDocument(){return ec()}};nc([Bf("openapi.json"),Lf("Content-Type","application/json"),Uo("design:type",Function),Uo("design:paramtypes",[]),Uo("design:returntype",void 0)],Ht.prototype,"getOpenApiDocument",null);Ht=nc([Df()],Ht)});import{Controller as Uf,Get as Fo,Inject as pr,Param as lr,Post as oc,Body as ic,HttpCode as sc}from"@nestjs/common";var St,J,Ie,Ne,ac=p(()=>{"use strict";Wr();ro();oo();ao();q();ae();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},J=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ie=function(n,e){return function(t,r){e(t,r,n)}},Ne=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)}resolveQueryTemplate(e,t,r){return{query:this.queryTemplates.resolve(e,t,r.params)}}};St([Fo("status"),J("design:type",Function),J("design:paramtypes",[]),J("design:returntype",Promise)],Ne.prototype,"status",null);St([oc("preview-models"),sc(200),Ie(0,ic(new _(wn))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Ne.prototype,"previewAvailableModels",null);St([Fo(":providerId/query-templates"),Ie(0,lr("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Array)],Ne.prototype,"listQueryTemplates",null);St([Fo(":providerId/actions"),Ie(0,lr("providerId")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Array)],Ne.prototype,"listExtendedActions",null);St([oc(":providerId/query-templates/:templateId/resolve"),sc(200),Ie(0,lr("providerId")),Ie(1,lr("templateId")),Ie(2,ic(new _(nn))),J("design:type",Function),J("design:paramtypes",[String,String,Object]),J("design:returntype",Object)],Ne.prototype,"resolveQueryTemplate",null);Ne=St([Uf("providers"),Ie(0,pr(Fe)),Ie(1,pr(Je)),Ie(2,pr(Me)),Ie(3,pr(He)),J("design:paramtypes",[Fe,Je,Me,He])],Ne)});import{Body as Ff,Controller as Jf,Get as Mf,Inject as Hf,Patch as Kf}from"@nestjs/common";var Jo,rt,cc,_t,uc=p(()=>{"use strict";q();Ue();ae();Jo=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(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)},cc=function(n,e){return function(t,r){e(t,r,n)}},_t=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:gs(e)}}};Jo([Mf(),rt("design:type",Function),rt("design:paramtypes",[]),rt("design:returntype",Promise)],_t.prototype,"get",null);Jo([Kf(),cc(0,Ff(new _(hn))),rt("design:type",Function),rt("design:paramtypes",[Object]),rt("design:returntype",Promise)],_t.prototype,"update",null);_t=Jo([Jf("settings"),cc(0,Hf(x)),rt("design:paramtypes",[x])],_t)});function Mo(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return pt(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 dc(n){let{defaultAgent:e,...t}=n;return t}var pc=p(()=>{"use strict";q()});import{Body as lc,Controller as Wf,Delete as Vf,Get as fc,HttpCode as Gf,Inject as Xf,Param as Ho,Patch as Qf,Post as zf}from"@nestjs/common";var jt,M,It,Ce,mc=p(()=>{"use strict";q();Ue();R();ae();pc();jt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},M=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},It=function(n,e){return function(t,r){e(t,r,n)}},Ce=class{settings;constructor(e){this.settings=e}async list(){return(await this.settings.get()).providerInstances??[]}async get(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new g(`Provider instance not found: ${e}`);return t}async create(e){let t=dc(e),r=await this.settings.get(),o=[...r.providerInstances??[]];if(o.some(s=>s.id===t.id))throw new Te(`Provider instance already exists: ${t.id}`);return o.push(t),{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Mo({current:r.defaultAgentInstanceId,instance:t,defaultAgent:e.defaultAgent,isCreate:!0})}),restartRequired:!0}}async update(e,t){let r=await this.settings.get(),o=[...r.providerInstances??[]],i=o.findIndex(c=>c.id===e);if(i<0)throw new g(`Provider instance not found: ${e}`);let a={...o[i],...t.displayName!=null?{displayName:t.displayName}:{},...t.config!=null?{config:t.config}:{},...t.secretKey!=null?{secretKey:t.secretKey}:{}};return t.expiresOn!==void 0&&(t.expiresOn?a.expiresOn=t.expiresOn:delete a.expiresOn),o[i]=a,{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Mo({current:r.defaultAgentInstanceId,instance:a,defaultAgent:t.defaultAgent,isCreate:!1})}),restartRequired:!0}}async remove(e){let t=await this.settings.get(),r=(t.providerInstances??[]).filter(s=>s.id!==e);if(r.length===(t.providerInstances??[]).length)throw new g(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};jt([fc(),M("design:type",Function),M("design:paramtypes",[]),M("design:returntype",Promise)],Ce.prototype,"list",null);jt([fc(":id"),It(0,Ho("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],Ce.prototype,"get",null);jt([zf(),It(0,lc(new _(gn))),M("design:type",Function),M("design:paramtypes",[Object]),M("design:returntype",Promise)],Ce.prototype,"create",null);jt([Qf(":id"),It(0,Ho("id")),It(1,lc(new _(yn))),M("design:type",Function),M("design:paramtypes",[String,Object]),M("design:returntype",Promise)],Ce.prototype,"update",null);jt([Vf(":id"),Gf(200),It(0,Ho("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],Ce.prototype,"remove",null);Ce=jt([Wf("provider-instances"),It(0,Xf(x)),M("design:paramtypes",[x])],Ce)});import{Body as Yf,Controller as Zf,HttpCode as em,Inject as tm,Param as nm,Post as rm}from"@nestjs/common";var hc,fr,Ko,Kt,gc=p(()=>{"use strict";je();R();ae();$o();hc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},fr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ko=function(n,e){return function(t,r){e(t,r,n)}},Kt=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)}};hc([rm(":key"),em(204),Ko(0,nm("key")),Ko(1,Yf(new _(cr))),fr("design:type",Function),fr("design:paramtypes",[String,Object]),fr("design:returntype",Promise)],Kt.prototype,"set",null);Kt=hc([Zf("secrets"),Ko(0,tm(re)),fr("design:paramtypes",[Function])],Kt)});import{Module as im}from"@nestjs/common";import{APP_FILTER as sm}from"@nestjs/core";var om,mr,yc=p(()=>{"use strict";Ct();yo();Kn();Sa();Ra();Aa();Ca();Ba();Ua();Ma();Va();rc();ac();uc();mc();gc();Jn();Rr();om=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},mr=class{};mr=om([im({imports:[ge,yt,We,Ke,it],controllers:[Ae,ue,Se,_e,ze,ke,Mt,Ht,Ne,_t,Ce,Kt],providers:[{provide:sm,useClass:Qn}]})],mr)});import{Module as cm}from"@nestjs/common";var am,hr,wc=p(()=>{"use strict";Xo();Qo();zo();Jn();na();Kn();Ct();yo();yc();am=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},hr=class{};hr=am([cm({imports:[Wt,Vt,Ke,Mn,We,ge,yt,mr],controllers:[vt]})],hr)});import{apiReference as um}from"@scalar/nestjs-api-reference";function bc(n){n.use("/api/docs",um({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var Sc=p(()=>{"use strict"});import{createServer as dm}from"node:net";function _c(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function Wo(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await pm(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function pm(n){return new Promise(e=>{let t=dm();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var Ic=p(()=>{"use strict"});import{Catch as mm,HttpStatus as gr,NotFoundException as hm}from"@nestjs/common";import{existsSync as jc,statSync as gm}from"node:fs";import{extname as vc,join as Vo,normalize as ym,relative as wm,sep as bm}from"node:path";function Ec(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=Sm(e.path??"/");if(o){let i=Vo(n,o);if(_m(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(xc(e)){Tc(t,n,i=>{i&&!t.headersSent&&t.status(gr.NOT_FOUND).end()});return}t.status(gr.NOT_FOUND).end()}}function xc(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=vc(e);return!(t&&t!==".html")}function Tc(n,e,t){n.sendFile("index.html",{root:e},t)}function Sm(n){if(n==="/"||n==="")return"index.html";let e=ym(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!vc(e)?null:e}function _m(n,e){if(!jc(e))return!1;try{if(!gm(e).isFile())return!1}catch{return!1}let t=wm(n,e);return t!==""&&!t.startsWith(`..${bm}`)&&!t.startsWith("..")}function Rc(n){return Vo(n,"index.html")}var lm,fm,yr,Pc=p(()=>{"use strict";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},fm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},yr=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(xc(o)&&jc(Vo(this.staticRoot,"index.html"))){Tc(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(gr.NOT_FOUND).json({statusCode:gr.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)}};yr=lm([mm(hm),fm("design:paramtypes",[String])],yr)});import{existsSync as Im}from"node:fs";import{dirname as jm,join as wr}from"node:path";import{fileURLToPath as vm}from"node:url";function Ac(){let n=jm(vm(import.meta.url)),e=[wr(n,"../static"),wr(n,"../../static"),wr(n,"static")];for(let t of e)if(Im(wr(t,"index.html")))return t;return null}var Oc=p(()=>{"use strict"});var Pm={};import"reflect-metadata";import{existsSync as Em}from"node:fs";import{Logger as xm}from"@nestjs/common";import{NestFactory as Tm}from"@nestjs/core";async function Rm(){let n=await Tm.create(hr);n.enableCors(),n.setGlobalPrefix("api"),bc(n);let e=Ac(),t=e?Rc(e):null;e&&t&&Em(t)?(br.log(`Serving UI from ${e}`),n.use(Ec(e)),n.useGlobalFilters(new yr(e))):br.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 Wo(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?br.warn(`Port ${r} is in use; listening on ${o} instead`):br.log(`Listening on http://localhost:${o}`);return}catch(s){if(!_c(s))throw s;o=await Wo(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var br,kc=p(()=>{"use strict";wc();Sc();Ic();Pc();Oc();br=new xm("Bootstrap");Rm()});import{readFileSync as Am}from"node:fs";function Om(){let n=Am(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var Sr=process.argv.slice(2);Sr.includes("--version")||Sr.includes("-v")?console.log(Om()):Sr.includes("--help")||Sr.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(`
|
|
146
|
-
`)):await Promise.resolve().then(()=>(
|
|
19
|
+
`)}function Jt(n,e){return e==="free_text"?n:Fs(n)}function Fs(n){let e=[...n.matchAll(/```json\s*([\s\S]*?)```/gi)].map(o=>o[1].trim()),t=[...n.matchAll(/```\s*([\s\S]*?)```/g)].map(o=>o[1].trim()),r=[...e].reverse();r.length===0&&r.push(...[...t].reverse()),r.push(n.trim());for(let o of r)if(o)try{return JSON.parse(o)}catch{continue}throw new Error("No valid JSON block found in agent response")}var np,rp,op,ip,_n=d(()=>{"use strict";_e();np={user:"User preferences",organization:"Organization guidelines",project:"Project context"},rp=["user","organization","project"],op={questionnaire:'Respond with a single fenced JSON block matching this shape exactly: {"questions":[{"id":"<string>","prompt":"<string>"}]}. No other prose outside the fence.',confirmation:'Respond with a single fenced JSON block matching this shape exactly: {"approved":<boolean>}. No other prose outside the fence.',comment_suggestions:'Respond with a single fenced JSON block matching this shape exactly: {"suggestions":[{"body":"<string>"}]}. No other prose outside the fence.',free_text:"Respond in plain text. Do not wrap the answer in a JSON object."},ip={anthropic:"Anthropic",cursor:"Cursor"}});async function*ap(n){let{query:e}=await import("@anthropic-ai/claude-agent-sdk"),t=n.options;yield*e({prompt:n.prompt,options:{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,...t?.cwd?{cwd:t.cwd}:{},...t?.resume?{resume:t.resume}:{},...t?.model?{model:t.model}:{},...t?.env?{env:t.env}:{}}})}var sp,xn,Js=d(()=>{"use strict";_n();_e();_n();sp=st("anthropic"),xn=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ft(e),o={permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,env:{...process.env,ANTHROPIC_API_KEY:t}};e.cwd&&(o.cwd=e.cwd),e.sessionId&&(o.resume=e.sessionId),this.options.model&&(o.model=this.options.model);let i=this.options.queryFn??ap,s,a,u;for await(let c of i({prompt:r,options:o}))c.session_id&&(s=c.session_id),c.type==="result"&&(c.subtype==="success"&&typeof c.result=="string"?a=c.result:u=c.errors?.join("; ")||c.subtype||"Claude agent returned an error result");if(u)throw new Error(`Claude agent failed: ${u}`);if(a==null)throw new Error("Claude agent returned no result text");if(!s)throw new Error("Claude agent returned no session id");return{raw:a,parsed:Jt(a,e.outputFormat),sessionId:s}}async requireApiKey(){let e=this.options.secretKey?.trim()||sp,t=await this.secrets.get(e);if(!t)throw vn("anthropic",e);return t}}});function up(n,e,t){return{apiKey:n,...t?{model:{id:t}}:{},local:{...e?{cwd:e}:{},settingSources:[]}}}async function dp(){let{Agent:n}=await import("@cursor/sdk");return{create:e=>n.create({apiKey:e.apiKey,...e.model?{model:e.model}:{},local:{...e.local?.cwd?{cwd:e.local.cwd}:{},settingSources:[]}}),resume:(e,t)=>n.resume(e,{apiKey:t.apiKey,...t.model?{model:t.model}:{},local:{...t.local?.cwd?{cwd:t.local.cwd}:{},settingSources:[]}})}}var cp,En,Us=d(()=>{"use strict";_n();_e();cp=st("cursor"),En=class{secrets;options;constructor(e,t={}){this.secrets=e,this.options=t}async run(e){let t=await this.requireApiKey(),r=Ft(e),o=this.options.sdk??await dp(),i=up(t,e.cwd,this.options.model),s=e.sessionId?await o.resume(e.sessionId,i):await o.create(i);try{let u=await(await s.send(r)).wait();if(u.status!=="finished")throw new Error(u.error?.message||`Cursor agent ended with status '${u.status}'`);let c=u.result??"";return{raw:c,parsed:Jt(c,e.outputFormat),sessionId:s.agentId}}finally{await s[Symbol.asyncDispose]?.()}}async requireApiKey(){let e=this.options.secretKey?.trim()||cp,t=await this.secrets.get(e);if(!t)throw vn("cursor",e);return t}}});function Ms(n){return typeof n=="object"&&n!=null&&typeof n.listExtendedActions=="function"&&typeof n.executeExtendedAction=="function"}function Pn(n,e){let t=n.params.filter(r=>r.required).filter(r=>{let o=e[r.name];return o==null||typeof o=="string"&&o.trim()===""}).map(r=>r.name);if(t.length>0)throw new Error(`Extended action '${n.actionId}' is missing required params: ${t.join(", ")}`)}function mt(n){return n.length===0?"none":n.map(e=>e.actionId).join(", ")}var Rn=d(()=>{"use strict"});function Ut(n){return n==null?"":typeof n=="string"?n:Hs(n).replace(/\n+$/,"")}function An(n){return{version:1,type:"doc",content:n.split(`
|
|
20
|
+
`).map(t=>({type:"paragraph",content:t.length===0?[]:[{type:"text",text:t}]}))}}function Hs(n){if(n==null||typeof n!="object")return"";let e=n;if(e.type==="text")return e.text??"";if(e.type==="hardBreak")return`
|
|
21
|
+
`;let t=(e.content??[]).map(Hs).join("");return e.type==="paragraph"||e.type==="heading"||e.type==="blockquote"||e.type==="listItem"?`${t}
|
|
22
|
+
`:t}var eo=d(()=>{"use strict"});function mp(n,e){return e.startsWith("http://")||e.startsWith("https://")?e:`${n.replace(/\/$/,"")}${e.startsWith("/")?e:`/${e}`}`}function Ks(n){return{representation:"atlas_doc_format",value:JSON.stringify(An(n))}}function Vs(n){return Ut(hp(n))}function hp(n){if(n==null||typeof n!="object")return n;let e=n.atlas_doc_format;if(e!=null){if(typeof e=="object"&&e!==null&&"value"in e){let t=e.value;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}return e}}function Ws(n,e,t){return{id:String(n.id??""),source:t,title:String(n.title??""),url:gp(e,n),raw:n}}function gp(n,e){let t=n.replace(/\/$/,""),r=e._links?.webui?.trim();if(r)return r.startsWith("http://")||r.startsWith("https://")?r:r.startsWith("/wiki")?`${t}${r}`:`${t}/wiki${r.startsWith("/")?r:`/${r}`}`;let o=e.id!=null?String(e.id):"";return o?`${t}/wiki/pages/${encodeURIComponent(o)}`:t}function yp(n,e){return{id:String(n.id??""),subjectId:e,body:Vs(n.body),createdAt:n.version?.createdAt??n.createdAt??"",raw:n}}var pp,lp,fp,Ls,kn,Tn,to=d(()=>{"use strict";Rn();eo();pp="kno.confluence.apiToken",lp=50,fp=10,Ls=500,kn=[{actionId:"create_page",label:"Create Confluence page",params:[{name:"spaceKey",label:"Space key",type:"string",required:!0},{name:"title",label:"Title",type:"string",required:!0},{name:"content",label:"Content",type:"string",required:!0}]}],Tn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||pp}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}`);return Ws(r,t,this.instanceId)}async getContent(e){await this.requireConfig();let t=await this.request("GET",`/wiki/api/v2/pages/${encodeURIComponent(e)}?body-format=atlas_doc_format`);return Vs(t.body)}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){await this.requireConfig();let t=[],r=`/wiki/api/v2/pages/${encodeURIComponent(e)}/footer-comments?body-format=atlas_doc_format&limit=${lp}`,o=new Set;for(let i=0;i<fp&&t.length<Ls&&!(!r||o.has(r));i++){o.add(r);let s=await this.request("GET",r),a=Array.isArray(s.results)?s.results:[];for(let c of a){if(t.length>=Ls)break;t.push(yp(c,e))}let u=typeof s._links?.next=="string"?s._links.next:void 0;if(!u||a.length===0)break;r=u}return t}async postComment(e,t){await this.requireConfig(),await this.request("POST","/wiki/api/v2/footer-comments",{body:{pageId:e,body:Ks(t)}})}listExtendedActions(){return kn}async executeExtendedAction(e,t){if(e==="create_page")return this.createPage(t);throw new Error(`Provider 'confluence' has no extended action '${e}'. Available: ${mt(this.listExtendedActions())}`)}async createPage(e){let t=kn[0];Pn(t,e);let r=String(e.spaceKey).trim(),o=String(e.title).trim(),i=String(e.content),{baseUrl:s}=await this.requireConfig(),a=await this.resolveSpaceId(r),u=await this.request("POST","/wiki/api/v2/pages",{body:{spaceId:a,status:"current",title:o,body:Ks(i)}});return Ws(u,s,this.instanceId)}async resolveSpaceId(e){let t=await this.request("GET",`/wiki/api/v2/spaces?keys=${encodeURIComponent(e)}`),r=Array.isArray(t.results)?t.results:[],o=r.find(s=>(s.key??"").toLowerCase()===e.toLowerCase())??r[0],i=o?.id!=null?String(o.id):"";if(!i)throw new Error(`Confluence space '${e}' was not found`);return i}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Confluence instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=mp(o,t),u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Confluence ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as wp}from"node:crypto";var bp,On,Gs=d(()=>{"use strict";bp=new Set(["github_wiki","gitlab_wiki","azure_wiki","web"]),On=class{pages;contentById;comments;instanceId;type;constructor(e=[],t){this.pages=new Map,this.contentById=new Map,this.comments=new Map,this.instanceId=t?.instanceId,this.type=t?.type;for(let r of e){let{content:o,...i}=r;this.pages.set(i.id,structuredClone(i)),o!==void 0&&this.contentById.set(i.id,o)}}async get(e){let t=this.pages.get(e);if(!t)throw new Error(`Documentation page not found: ${e}`);return this.withSource(structuredClone(t))}async getContent(e){await this.get(e);let t=this.contentById.get(e);if(t===void 0)throw new Error(`Documentation content not found: ${e}`);return t}async query(e){let t=e.pageIds;if(!Array.isArray(t))throw new Error("Documentation query requires { pageIds: string[] }");let r=[];for(let o of t)r.push(await this.get(String(o)));return r}async getComments(e){let t=await this.get(e);return this.assertCommentsSupported(t),structuredClone(this.comments.get(e)??[])}async postComment(e,t){let r=await this.get(e);this.assertCommentsSupported(r);let o=this.comments.get(e)??[];o.push({id:wp(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,o)}assertCommentsSupported(e){let t=this.type??e.source;if(bp.has(t))throw new Error(`Comments are not supported for documentation source '${t}'`)}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function no(){return Ip.replace(/\/$/,"")}function Mt(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' (e.g. 'kno-engine#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1);if(!/^\d+$/.test(o))throw new Error(`Bitbucket pull request id must be '{repoSlug}#{prNumber}' with a numeric PR number, got '${n}'`);return{repoSlug:r,prNumber:o}}function jp(n,e){return`${n}#${e}`}function vp(n){let e=n.repoSlug;if(typeof e!="string"||e.trim().length===0)throw new Error("Bitbucket query requires filter.repoSlug or filter.role \u2014 repo-scoped listing needs repoSlug; workspace-wide listing needs role (author|reviewer)");return e.trim()}function _p(n){if(typeof n.repoSlug=="string"&&n.repoSlug.trim().length>0||!Xs(n.role))return;let e=String(n.role).trim().toLowerCase();if(e!=="author"&&e!=="reviewer")throw new Error(`Bitbucket query filter.role must be 'author' or 'reviewer', got '${String(n.role)}'`);return e}function zs(n){if(!Xs(n))return;let e=String(n).trim().toUpperCase();if(e!=="OPEN"&&e!=="MERGED"&&e!=="DECLINED")throw new Error(`Bitbucket query filter.state must be OPEN, MERGED, or DECLINED, got '${String(n)}'`);return e}function xp(n){if(typeof n.q=="string"&&n.q.trim().length>0)return n.q;let e=zs(n.state);if(e)return`state="${e}"`}function Ep(n){let e=n.destination?.repository?.name;if(typeof e=="string"&&e.trim().length>0)return e.trim();let t=n.destination?.repository?.full_name;if(typeof t=="string"&&t.includes("/"))return t.slice(t.lastIndexOf("/")+1);throw new Error("Bitbucket workspace pull request is missing destination.repository slug")}function Pp(n){let e=n.trim().toLowerCase();if(e==="approved")return"approve";if(e==="declined"||e==="rejected")return"decline";if(e==="merged")return"merge";throw new Error(`No Bitbucket action for status '${n}'. Accepted: approved, declined/rejected, merged`)}function Xs(n){return n!=null&&n!==""}function io(...n){for(let e of n)if(typeof e=="string"&&e.trim().length>0)return e.trim()}function qn(n,e,t){let r=String(n.id??""),o=typeof n.description=="string"?n.description:"";return{id:jp(e,r),source:t,title:String(n.title??""),...o?{description:o}:{},sourceBranch:String(n.source?.branch?.name??""),targetBranch:String(n.destination?.branch?.name??""),...n.author?.display_name?{author:n.author.display_name}:{},...n.links?.html?.href?{url:n.links.html.href}:{},raw:n}}function Rp(n,e){let t=n.user?.display_name??n.author?.display_name;return{id:String(n.id??""),subjectId:e,body:n.content?.raw??"",...t?{author:t}:{},createdAt:n.created_on??"",raw:n}}var Sp,Ip,ro,Qs,oo,so,$n,ao=d(()=>{"use strict";Rn();Sp="kno.bitbucket.apiToken",Ip="https://api.bitbucket.org/2.0";ro=50,Qs=10,oo=500,so=[{actionId:"add_reviewer",label:"Add reviewer",params:[{name:"username",label:"Reviewer username",type:"string",required:!0}]}],$n=class{secrets;fetchFn;instanceId;email;workspace;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.email=t.email?.trim()||void 0,this.workspace=t.workspace?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Sp}async get(e){let{repoSlug:t,prNumber:r}=Mt(e),{workspace:o}=await this.requireConfig(),i=await this.request("GET",this.prPath(o,t,r));return qn(i,t,this.instanceId)}async query(e){let t=_p(e);if(t)return this.queryWorkspacePullRequests(t,e);let r=vp(e),{workspace:o}=await this.requireConfig(),i=xp(e),s=new URLSearchParams({pagelen:String(ro)});i&&s.set("q",i);let a=`${no()}/repositories/${encodeURIComponent(o)}/${encodeURIComponent(r)}/pullrequests?${s.toString()}`;return this.collectPullRequests(a,r)}async queryWorkspacePullRequests(e,t){let{workspace:r}=await this.requireConfig(),o=await this.selectedUser(),i=new URLSearchParams({pagelen:String(ro)}),s=zs(t.state);s&&i.set("state",s),e==="reviewer"&&i.set("role","REVIEWER");let a=`${no()}/workspaces/${encodeURIComponent(r)}/pullrequests/${encodeURIComponent(o)}?${i.toString()}`;return this.collectPullRequests(a)}selectedUserCache;async selectedUser(){let{email:e}=await this.requireConfig();if(this.selectedUserCache?.email===e)return this.selectedUserCache.id;let t=await this.request("GET","/user"),r=io(t.uuid,t.account_id,t.username);if(!r)throw new Error("Bitbucket GET /user did not return uuid, account_id, or username \u2014 cannot list workspace pull requests");return this.selectedUserCache={email:e,id:r},r}async collectPullRequests(e,t){let r=[],o=new Set,i=e;for(let s=0;s<Qs&&r.length<oo&&!(!i||o.has(i));s++){o.add(i);let a=await this.request("GET",i),u=Array.isArray(a.values)?a.values:[];for(let f of u){if(r.length>=oo)break;r.push(qn(f,t??Ep(f),this.instanceId))}let c=typeof a.next=="string"&&a.next.length>0?a.next:void 0;if(!c||u.length===0)break;i=c}return r}async getComments(e){let{repoSlug:t,prNumber:r}=Mt(e),{workspace:o}=await this.requireConfig(),i=[],s=new Set,a=`${this.prPath(o,t,r)}/comments?pagelen=${ro}`;for(let u=0;u<Qs&&i.length<oo&&!(!a||s.has(a));u++){s.add(a);let c=await this.request("GET",a),f=Array.isArray(c.values)?c.values:[];for(let j of f)i.push(Rp(j,e));let m=typeof c.next=="string"&&c.next.length>0?c.next:void 0;if(!m||f.length===0)break;a=m}return i}async postComment(e,t){let{repoSlug:r,prNumber:o}=Mt(e),{workspace:i}=await this.requireConfig();await this.request("POST",`${this.prPath(i,r,o)}/comments`,{body:{content:{raw:t}}})}async updateStatus(e,t){let{repoSlug:r,prNumber:o}=Mt(e),{workspace:i}=await this.requireConfig(),s=Pp(t);await this.request("POST",`${this.prPath(i,r,o)}/${s}`)}listExtendedActions(){return so}async executeExtendedAction(e,t){if(e==="add_reviewer")return this.addReviewer(t);throw new Error(`Provider 'bitbucket' has no extended action '${e}'. Available: ${mt(this.listExtendedActions())}`)}async addReviewer(e){let t=typeof e.subjectId=="string"?e.subjectId.trim():"";if(!t)throw new Error("Bitbucket action 'add_reviewer' requires params.subjectId");let r=typeof e.username=="string"?e.username.trim():"";if(!r)throw new Error("Bitbucket action 'add_reviewer' requires params.username");let{repoSlug:o,prNumber:i}=Mt(t),{workspace:s}=await this.requireConfig(),a=await this.request("GET",this.prPath(s,o,i)),u=await this.request("GET",`/users/${encodeURIComponent(r)}`),c=io(u.uuid),f=io(u.account_id);if(!c&&!f)throw new Error(`Bitbucket user '${r}' has no uuid or account_id`);let m=Array.isArray(a.reviewers)?a.reviewers:[];if(m.some(E=>c!=null&&E.uuid===c||f!=null&&E.account_id===f))return qn(a,o,this.instanceId);let S=[...m.map(E=>E.uuid?{uuid:E.uuid}:{account_id:E.account_id}),c?{uuid:c}:{account_id:f}],D=await this.request("PUT",this.prPath(s,o,i),{body:{title:a.title??"",reviewers:S}});return qn(D,o,this.instanceId)}prPath(e,t,r){return`/repositories/${encodeURIComponent(e)}/${encodeURIComponent(t)}/pullrequests/${encodeURIComponent(r)}`}async requireConfig(){let e=this.email,t=this.workspace,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.email"),t||o.push("config.workspace"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Bitbucket instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set email and workspace on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{email:e,workspace:t,token:r}}async request(e,t,r={}){let{email:o,token:i}=await this.requireConfig(),s=t.startsWith("http://")||t.startsWith("https://")?t:`${no()}${t.startsWith("/")?t:`/${t}`}`,a={Authorization:`Basic ${Buffer.from(`${o}:${i}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(a["Content-Type"]="application/json");let u=await this.fetchFn(s,{method:e,headers:a,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!u.ok){let f=await u.text().catch(()=>"");throw new Error(`Bitbucket ${e} ${t} failed (${u.status}): ${f||u.statusText}`)}if(u.status===204)return;let c=await u.text();if(c)return JSON.parse(c)}}});import{randomUUID as Ap}from"node:crypto";function kp(n,e){return Object.entries(e).every(([t,r])=>t==="status"?n.raw?.status===r:n[t]===r)}var Cn,Zs=d(()=>{"use strict";Cn=class{pullRequests;comments;instanceId;constructor(e=[],t){this.pullRequests=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.pullRequests.get(e);if(!t)throw new Error(`Pull request not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.pullRequests.values()].filter(t=>kp(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:Ap(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.pullRequests.get(e);if(!r)throw new Error(`Pull request not found: ${e}`);r.raw={...r.raw??{},status:t}}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function co(n){return n.pull_request!=null}function Dn(n){let e=n.trim(),t=e.lastIndexOf("#");if(t<=0||t===e.length-1)throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);let r=e.slice(0,t),o=e.slice(t+1),{owner:i,name:s}=Ys(r);if(!/^\d+$/.test(o))throw new Error(`GitHub issue id must be '{owner}/{repo}#{issueNumber}' (e.g. 'acme/kno#42'), got '${n}'`);return{owner:i,repo:s,issueNumber:o}}function Cp(n,e,t){return`${n}/${e}#${t}`}function Ys(n){let e=n.trim(),t=e.indexOf("/");if(t<=0||t===e.length-1||e.indexOf("/",t+1)!==-1)throw new Error(`GitHub repo must be '{owner}/{name}', got '${n}'`);return{owner:e.slice(0,t),name:e.slice(t+1)}}function Dp(n){let e=n.role;if(e==="assignee"||e==="creator")return e}function Bp(n,e){return n==="creator"?`author:${e}`:`assignee:${e}`}function Np(n){let e=n.trim().toLowerCase();if(e==="open")return{state:"open"};if(e==="closed"||e==="done"||e==="completed")return{state:"closed",state_reason:"completed"};if(e==="not_planned"||e==="wontfix")return{state:"closed",state_reason:"not_planned"};throw new Error(`No GitHub Issues mapping for status '${n}'. Accepted: ${$p.join(", ")}`)}function Fp(n){let e=n.repository?.full_name;if(typeof e=="string"&&e.includes("/"))return e;let t=n.repository_url;if(typeof t=="string"){let r="/repos/",o=t.lastIndexOf(r);if(o>=0){let i=t.slice(o+r.length);if(i.includes("/"))return i}}throw new Error("GitHub search result is missing repository full_name")}function uo(n,e,t){let r=String(n.number??""),[o,i]=t.split("/"),s=typeof n.body=="string"?n.body:"";return{id:Cp(o??"",i??"",r),source:e,title:String(n.title??""),...s?{description:s}:{},status:String(n.state??""),...n.assignee?.login?{assignee:n.assignee.login}:{},...n.html_url?{url:n.html_url}:{},raw:n}}function Jp(n,e){return{id:String(n.id??""),subjectId:e,body:n.body??"",...n.user?.login?{author:n.user.login}:{},createdAt:n.created_at??""}}function Bn(n){return n!=null&&n!==""}var Tp,Op,qp,$p,Nn,ea=d(()=>{"use strict";Tp="2026-03-10",Op="https://api.github.com",qp="kno.github.apiToken",$p=["open","closed/done/completed","not_planned/wontfix"],Nn=class{secrets;fetchFn;instanceId;username;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.username=t.username?.trim()||void 0,this.secretKey=t.secretKey?.trim()||qp}async get(e){let{owner:t,repo:r,issueNumber:o}=Dn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`);if(co(i))throw new Error(`Ticket not found: ${e}`);return uo(i,this.instanceId,`${t}/${r}`)}async query(e){let t=typeof e.repo=="string"?e.repo.trim():"";if(t)return this.queryRepoIssues(t,e);let r=Dp(e);if(r)return this.querySearch(r,e);throw new Error("GitHub Issues query requires filter.repo ('owner/name') or filter.role ('assignee' | 'creator')")}async getComments(e){let{owner:t,repo:r,issueNumber:o}=Dn(e),i=await this.request("GET",`/repos/${encodeURIComponent(t)}/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}/comments`);return(Array.isArray(i)?i:[]).map(a=>Jp(a,e))}async postComment(e,t){let{owner:r,repo:o,issueNumber:i}=Dn(e);await this.request("POST",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}/comments`,{body:{body:t}})}async updateStatus(e,t){let{owner:r,repo:o,issueNumber:i}=Dn(e);await this.request("PATCH",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues/${encodeURIComponent(i)}`,{body:Np(t)})}async queryRepoIssues(e,t){let{owner:r,name:o}=Ys(e),i=[],s=new URLSearchParams;s.set("per_page",String(100)),Bn(t.state)&&s.set("state",String(t.state)),Bn(t.labels)&&s.set("labels",String(t.labels)),Bn(t.assignee)&&s.set("assignee",String(t.assignee));for(let a=1;a<=10&&i.length<500;a++){s.set("page",String(a));let u=await this.request("GET",`/repos/${encodeURIComponent(r)}/${encodeURIComponent(o)}/issues?${s.toString()}`),c=Array.isArray(u)?u:[];if(c.length===0)break;for(let f of c)if(!co(f)){if(i.length>=500)break;i.push(uo(f,this.instanceId,`${r}/${o}`))}if(c.length<100)break}return i}async querySearch(e,t){let r=this.requireUsername(),o=[Bp(e,r),"is:issue"];Bn(t.state)&&o.push(`is:${String(t.state).trim().toLowerCase()}`);let i=o.join(" "),s=[];for(let a=1;a<=10&&s.length<500;a++){let u=new URLSearchParams({q:i,per_page:String(100),page:String(a)}),c=await this.request("GET",`/search/issues?${u.toString()}`),f=Array.isArray(c.items)?c.items:[];if(f.length===0)break;for(let m of f)if(!co(m)){if(s.length>=500)break;s.push(uo(m,this.instanceId,Fp(m)))}if(f.length<100)break}return s}requireUsername(){if(!this.username)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing config.username`);return this.username}async requireToken(){let e=await this.secrets.get(this.secretKey);if(!e)throw new Error(`GitHub Issues instance '${this.instanceId}' is not configured \u2014 missing SecretStore '${this.secretKey}'. Store the token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`);return e}async request(e,t,r={}){let o=await this.requireToken(),i=`${Op}${t}`,s={Authorization:`Bearer ${o}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":Tp};r.body!==void 0&&(s["Content-Type"]="application/json");let a=await this.fetchFn(i,{method:e,headers:s,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`GitHub ${e} ${t} failed (${a.status}): ${c||a.statusText}`)}if(a.status===204)return;let u=await a.text();if(u)return JSON.parse(u)}}});var Ye,g,h,et,R=d(()=>{"use strict";Ye=class extends Error{constructor(e){super(e),this.name=this.constructor.name}},g=class extends Ye{httpStatus=404},h=class extends Ye{httpStatus=400},et=class extends Ye{httpStatus=409}});function Lp(n){if(typeof n.jql=="string"&&n.jql.trim().length>0)return n.jql;let e=[];if(Jn(n.project)&&e.push(`project = ${Un(n.project)}`),Jn(n.status)&&e.push(`status = ${Un(n.status)}`),Jn(n.assignee)&&e.push(`assignee = ${Un(n.assignee)}`),Jn(n.sprintId)){let t=n.sprintId;e.push(typeof t=="number"||/^\d+$/.test(String(t))?`sprint = ${Number(t)}`:`sprint = ${Un(t)}`)}if(e.length===0)throw new h("Jira query requires jql or at least one of project, status, assignee, sprintId");return e.join(" AND ")}function Jn(n){return n!=null&&n!==""}function Un(n){return`"${String(n).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function ta(n,e,t){let r=String(n.key??n.id??""),o=n.fields??{},i=Ut(o.description);return{id:r,source:t,title:String(o.summary??""),...i?{description:i}:{},status:String(o.status?.name??""),...o.assignee?.displayName?{assignee:String(o.assignee.displayName)}:{},url:`${e.replace(/\/$/,"")}/browse/${r}`,raw:n}}var Up,Mp,Hp,Fn,Mn,na=d(()=>{"use strict";R();eo();Up="kno.jira.apiToken",Mp=50,Hp=10,Fn=500,Mn=class{secrets;fetchFn;instanceId;baseUrl;email;secretKey;constructor(e,t,r=fetch){this.secrets=e,this.fetchFn=r,this.instanceId=t.instanceId,this.baseUrl=t.baseUrl?.trim()||void 0,this.email=t.email?.trim()||void 0,this.secretKey=t.secretKey?.trim()||Up}async get(e){let{baseUrl:t}=await this.requireConfig(),r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}`);return ta(r,t,this.instanceId)}async query(e){let{baseUrl:t}=await this.requireConfig(),r=Lp(e),o=[],i,s=new Set;for(let a=0;a<Hp&&o.length<Fn;a++){let u={jql:r,maxResults:Math.min(Mp,Fn-o.length),fields:["summary","description","status","assignee"]};i&&(u.nextPageToken=i);let c=await this.request("POST","/rest/api/3/search/jql",{body:u}),f=Array.isArray(c.issues)?c.issues:[];for(let j of f){if(o.length>=Fn)break;o.push(ta(j,t,this.instanceId))}let m=typeof c.nextPageToken=="string"?c.nextPageToken:void 0;if(c.isLast===!0||!m||f.length===0||m===i||s.has(m))break;s.add(m),i=m}return o}async getComments(e){let t=[],r=0,o=100,i=Fn;for(;t.length<i;){let s=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/comment?startAt=${r}&maxResults=${o}`),a=Array.isArray(s.comments)?s.comments:[];for(let u of a)t.push({id:String(u.id??""),subjectId:e,body:Ut(u.body),...u.author?.displayName?{author:u.author.displayName}:{},createdAt:u.created??"",raw:u});if(r+=a.length,a.length===0||typeof s.total=="number"&&r>=s.total||a.length<o)break}return t}async postComment(e,t){await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/comment`,{body:{body:An(t)}})}async updateStatus(e,t){let r=await this.request("GET",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`),o=Array.isArray(r.transitions)?r.transitions:[],i=t.trim().toLowerCase(),s=o.find(a=>(a.to?.name??"").trim().toLowerCase()===i);if(!s?.id){let a=o.map(c=>c.to?.name).filter(c=>typeof c=="string"&&c.length>0),u=a.length>0?a.join(", "):"(none)";throw new Error(`No Jira transition to status '${t}' from the current state. Available: ${u}`)}await this.request("POST",`/rest/api/3/issue/${encodeURIComponent(e)}/transitions`,{body:{transition:{id:s.id}}})}async requireConfig(){let e=this.baseUrl,t=this.email,r=await this.secrets.get(this.secretKey);if(!e||!t||!r){let o=[];throw e||o.push("config.baseUrl"),t||o.push("config.email"),r||o.push(`SecretStore '${this.secretKey}'`),new Error(`Jira instance '${this.instanceId}' is not configured \u2014 missing ${o.join(", ")}. Set baseUrl and email on the provider instance, and store the API token with: POST /api/secrets/${this.secretKey} or npm --workspace apps/engine run set-secret -- ${this.secretKey} <value>`)}return{baseUrl:e,email:t,token:r}}async request(e,t,r={}){let{baseUrl:o,email:i,token:s}=await this.requireConfig(),a=`${o.replace(/\/$/,"")}${t}`,u={Authorization:`Basic ${Buffer.from(`${i}:${s}`).toString("base64")}`,Accept:"application/json"};r.body!==void 0&&(u["Content-Type"]="application/json");let c=await this.fetchFn(a,{method:e,headers:u,...r.body!==void 0?{body:JSON.stringify(r.body)}:{}});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Jira ${e} ${t} failed (${c.status}): ${m||c.statusText}`)}if(c.status===204)return;let f=await c.text();if(f)return JSON.parse(f)}}});import{randomUUID as Kp}from"node:crypto";function Wp(n,e){return Object.entries(e).every(([t,r])=>n[t]===r)}var Hn,ra=d(()=>{"use strict";Hn=class{tickets;comments;instanceId;constructor(e=[],t){this.tickets=new Map(e.map(r=>[r.id,structuredClone(r)])),this.comments=new Map,this.instanceId=t}async get(e){let t=this.tickets.get(e);if(!t)throw new Error(`Ticket not found: ${e}`);return this.withSource(structuredClone(t))}async query(e){return[...this.tickets.values()].filter(t=>Wp(t,e)).map(t=>this.withSource(structuredClone(t)))}async getComments(e){return await this.get(e),structuredClone(this.comments.get(e)??[])}async postComment(e,t){await this.get(e);let r=this.comments.get(e)??[];r.push({id:Kp(),subjectId:e,body:t,createdAt:new Date().toISOString()}),this.comments.set(e,r)}async updateStatus(e,t){let r=this.tickets.get(e);if(!r)throw new Error(`Ticket not found: ${e}`);r.status=t}withSource(e){return this.instanceId?{...e,source:this.instanceId}:e}}});function Pe(n,e){let t=n[e];return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function Ln(n){return new Error(`This workflow requires provider instance '${n}', which isn't configured`)}function Vp(n){return n==="jira"||n==="github"?"ticket":n==="bitbucket"?"pull_request":n==="confluence"?"documentation":"any"}var ib,$,ht=d(()=>{"use strict";A();Js();Us();to();Gs();ao();Zs();ea();na();ra();ib=Symbol("PROVIDER_REGISTRY");$=class n{tickets=new Map;repos=new Map;documentation=new Map;agents=new Map;instances=[];constructor(){}static fromSettings(e,t){let r=new n;return r.load(e,t),r}static fromMaps(e){let t=new n;for(let[r,o]of Object.entries(e.tickets??{}))t.tickets.set(r,o);for(let[r,o]of Object.entries(e.repos??{}))t.repos.set(r,o);for(let[r,o]of Object.entries(e.documentation??{}))t.documentation.set(r,o);for(let[r,o]of Object.entries(e.agents??{}))t.agents.set(r,o);return t.instances.push(...e.instances??[]),t}load(e,t){let r=new Set;for(let o of e){if(r.has(o.id))throw new Error(`Duplicate provider instance id '${o.id}'`);r.add(o.id),this.instances.push(o),this.instantiate(o,t)}}instantiate(e,t){if(ft(e)){let o=Pe(e.config,"model");if(e.type==="claude"){this.agents.set(e.id,new xn(t,{secretKey:e.secretKey,model:o}));return}this.agents.set(e.id,new En(t,{secretKey:e.secretKey,model:o}));return}if(!Ze(e))throw new Error(`Unknown provider instance kind on '${e.id}'`);let r=Vp(e.type);if(r!=="any"&&e.subjectType!==r)throw new Error(`Provider instance '${e.id}' type '${e.type}' cannot serve subjectType '${e.subjectType}'`);if(e.type==="jira"){this.tickets.set(e.id,new Mn(t,{instanceId:e.id,baseUrl:Pe(e.config,"baseUrl"),email:Pe(e.config,"email"),secretKey:e.secretKey}));return}if(e.type==="github"){this.tickets.set(e.id,new Nn(t,{instanceId:e.id,username:Pe(e.config,"username"),secretKey:e.secretKey}));return}if(e.type==="bitbucket"){this.repos.set(e.id,new $n(t,{instanceId:e.id,email:Pe(e.config,"email"),workspace:Pe(e.config,"workspace"),secretKey:e.secretKey}));return}if(e.type==="confluence"){this.documentation.set(e.id,new Tn(t,{instanceId:e.id,baseUrl:Pe(e.config,"baseUrl"),email:Pe(e.config,"email"),secretKey:e.secretKey}));return}if(e.subjectType==="ticket"){this.tickets.set(e.id,new Hn([],e.id));return}if(e.subjectType==="pull_request"){this.repos.set(e.id,new Cn([],e.id));return}this.documentation.set(e.id,new On([],{instanceId:e.id,type:Pe(e.config,"type")}))}getTicketProvider(e){let t=this.tickets.get(e);if(!t)throw Ln(e);return t}getRepoProvider(e){let t=this.repos.get(e);if(!t)throw Ln(e);return t}getDocumentationProvider(e){let t=this.documentation.get(e);if(!t)throw Ln(e);return t}getAgentProvider(e){let t=this.agents.get(e);if(!t)throw Ln(e);return t}getInstance(e){return this.instances.find(t=>t.id===e)}listInstances(e){return e==null?[...this.instances]:this.instances.filter(t=>Ze(t)&&t.subjectType===e)}ticketInstanceIds(){return[...this.tickets.keys()]}repoInstanceIds(){return[...this.repos.keys()]}documentationInstanceIds(){return[...this.documentation.keys()]}}});function ia(n,e){switch(n){case"my-open-prs":return{role:"author",state:"OPEN"};case"reviewing":return{role:"reviewer",state:"OPEN"};case"repo-open-prs":{let t=typeof e.repoSlug=="string"?e.repoSlug.trim():"";if(!t)throw new h("Bitbucket template 'repo-open-prs' requires params.repoSlug");return{repoSlug:t,state:"OPEN"}}default:throw new g(`Unknown Bitbucket query template: ${n}`)}}var oa,sa=d(()=>{"use strict";R();oa=[{id:"my-open-prs",label:"My open pull requests",params:[]},{id:"reviewing",label:"Pull requests I'm reviewing",params:[]},{id:"repo-open-prs",label:"Open pull requests in a repository",params:[{name:"repoSlug",label:"Repository",type:"string",required:!0}]}]});function ca(n,e){switch(n){case"my-open-issues":return{role:"assignee",state:"open"};case"created-by-me":return{role:"creator",state:"open"};case"repo-open-issues":{let t=typeof e.repo=="string"?e.repo.trim():"";if(!t)throw new h("GitHub template 'repo-open-issues' requires params.repo");return{repo:t,state:"open"}}default:throw new g(`Unknown GitHub query template: ${n}`)}}var aa,ua=d(()=>{"use strict";R();aa=[{id:"my-open-issues",label:"My open issues",params:[]},{id:"created-by-me",label:"Issues I created",params:[]},{id:"repo-open-issues",label:"Open issues in a repository",params:[{name:"repo",label:"Repository (owner/name)",type:"string",required:!0}]}]});function ma(n,e){switch(n){case"my-open-tickets":return{jql:"assignee = currentUser() AND statusCategory != Done"};case"created-by-me":return{jql:"reporter = currentUser() AND statusCategory != Done"};case"project-open-tickets":return{jql:`project = ${la(pa(n,e))} AND statusCategory != Done`};case"current-sprint-tickets":return{jql:`project = ${la(pa(n,e))} AND sprint in openSprints() AND statusCategory != Done`};default:throw new g(`Unknown Jira query template: ${n}`)}}function pa(n,e){let t=typeof e.project=="string"?e.project.trim():"";if(!t)throw new h(`Jira template '${n}' requires params.project`);return t}function la(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}var da,fa,ha=d(()=>{"use strict";R();da={name:"project",label:"Project key",type:"string",required:!0},fa=[{id:"my-open-tickets",label:"My open tickets",params:[]},{id:"created-by-me",label:"Tickets I created",params:[]},{id:"project-open-tickets",label:"Open tickets in a project",params:[da]},{id:"current-sprint-tickets",label:"Tickets in the current sprint",params:[da]}]});import{Inject as ya,Injectable as zp}from"@nestjs/common";var Gp,Qp,ga,wa,Ue,po=d(()=>{"use strict";A();R();ge();ht();sa();ua();ha();Gp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Qp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ga=function(n,e){return function(t,r){e(t,r,n)}},wa={bitbucket:{list:()=>oa,resolve:ia},github:{list:()=>aa,resolve:ca},jira:{list:()=>fa,resolve:ma}},Ue=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let t=await this.providerType(e);return t?wa[t]?.list()??[]:[]}async resolve(e,t,r){let o=await this.providerType(e),i=o?wa[o]:void 0;if(!i)throw new g(`No query templates for provider instance '${e}'`);let s=i.list().find(a=>a.id===t);if(!s)throw new g(`Unknown query template '${t}' for provider instance '${e}'`);for(let a of s.params){if(!a.required)continue;let u=r[a.name];if(u==null||typeof u=="string"&&u.trim()==="")throw new h(`Template '${t}' requires params.${a.name}`)}return i.resolve(t,r)}async providerType(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);if(!(!r||!Ze(r)))return r.type}};Ue=Gp([zp(),ga(0,ya(x)),ga(1,ya($)),Qp("design:paramtypes",[x,$])],Ue)});import{Inject as Sa,Injectable as Yp}from"@nestjs/common";var Xp,Zp,ba,el,Me,lo=d(()=>{"use strict";A();ge();to();ao();ht();Xp=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Zp=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ba=function(n,e){return function(t,r){e(t,r,n)}},el={bitbucket:()=>so,confluence:()=>kn},Me=class{settings;registry;constructor(e,t){this.settings=e,this.registry=t}async list(e){let r=(await this.settings.get()).providerInstances?.find(o=>o.id===e)??this.registry.getInstance(e);return!r||!Ze(r)?[]:el[r.type]?.()??[]}};Me=Xp([Yp(),ba(0,Sa(x)),ba(1,Sa($)),Zp("design:paramtypes",[x,$])],Me)});async function Ia(n){let e=n.fetchFn??fetch;return n.type==="claude"?ol(n.apiKey,e):il(n.apiKey,e)}async function ol(n,e){let t=await e(tl,{method:"GET",headers:{"x-api-key":n,"anthropic-version":rl}});if(!t.ok)throw ja("Claude",t.status);let r=await t.json();return(Array.isArray(r.data)?r.data:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.display_name=="string"&&s.display_name.trim()?s.display_name:a;return[{id:a,displayName:u}]})}async function il(n,e){let t=await e(nl,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`${n}:`).toString("base64")}`}});if(!t.ok)throw ja("Cursor",t.status);let r=await t.json();return(Array.isArray(r.items)?r.items:[]).flatMap(i=>{if(!i||typeof i!="object")return[];let s=i,a=typeof s.id=="string"?s.id:"";if(!a)return[];let u=typeof s.displayName=="string"&&s.displayName.trim()?s.displayName:a;return[{id:a,displayName:u}]})}function ja(n,e){let t=new Error(`${n} rejected the API key (HTTP ${e}). Check the key and try again.`);return t.name="PreviewModelsAuthError",t}var tl,nl,rl,va=d(()=>{"use strict";tl="https://api.anthropic.com/v1/models",nl="https://api.cursor.com/v1/models",rl="2023-06-01"});import{Inject as mo,Injectable as cl}from"@nestjs/common";var sl,al,fo,Kn,He,ho=d(()=>{"use strict";A();ge();_e();R();va();sl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},al=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},fo=function(n,e){return function(t,r){e(t,r,n)}},Kn="PREVIEW_MODELS_FETCH",He=class{settings;secrets;fetchFn;constructor(e,t,r){this.settings=e,this.secrets=t,this.fetchFn=r}async preview(e){let t=e.apiKey?.trim();if(t)return this.lookup(e.type,t);let r=e.instanceId?.trim();if(!r)throw new h("Provide apiKey or instanceId to preview models");let o=(await this.settings.get()).providerInstances?.find(s=>s.id===r);if(!o)throw new g(`Provider instance not found: ${r}`);if(!ft(o)||o.type!==e.type)throw new h(`Provider instance '${r}' is not a ${e.type} agent`);let i=await this.secrets.get(o.secretKey);if(!i)throw new h(`No API key stored for instance '${r}'. Enter a key to fetch models.`);return this.lookup(e.type,i)}async lookup(e,t){try{return await Ia({type:e,apiKey:t,fetchFn:this.fetchFn})}catch(r){throw r instanceof Error&&r.name==="PreviewModelsAuthError"?new h(r.message):new h(r instanceof Error?r.message:"Failed to fetch available models")}}};He=sl([cl(),fo(0,mo(x)),fo(1,mo(oe)),fo(2,mo(Kn)),al("design:paramtypes",[x,Function,Function])],He)});import{Module as dl}from"@nestjs/common";import{fileURLToPath as pl}from"node:url";import{dirname as ll,join as fl}from"node:path";var ul,ml,Le,Wn=d(()=>{"use strict";Er();si();Pr();ci();Or();_e();Nt();ge();Yr();ht();po();lo();ho();ul=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},ml=fl(ll(pl(import.meta.url)),"../../../knowledge"),Le=class{};Le=ul([dl({imports:[at,ye],providers:[{provide:$,useFactory:async(n,e)=>{let t=await n.get();return $.fromSettings(t.providerInstances??[],e)},inject:[x,oe]},{provide:Pt,useClass:Zt},{provide:Rt,useFactory:()=>new Yt(ml)},Je,Ue,Me,{provide:Kn,useValue:(n,e)=>fetch(n,e)},He],exports:[$,Pt,Rt,Je,Ue,Me,He,Kn]})],Le)});import{Module as gl}from"@nestjs/common";var hl,Vn,_a=d(()=>{"use strict";hl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Vn=class{};Vn=hl([gl({})],Vn)});import{Injectable as wl}from"@nestjs/common";var yl,se,Gn=d(()=>{"use strict";yl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},se=class{listeners=new Set;emit(e){for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};se=yl([wl()],se)});import{Global as Sl,Module as Il}from"@nestjs/common";var bl,Ke,Qn=d(()=>{"use strict";Gn();bl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ke=class{};Ke=bl([Sl(),Il({providers:[se],exports:[se]})],Ke)});import{Injectable as _l}from"@nestjs/common";import{execFile as xl}from"node:child_process";import{mkdirSync as xa}from"node:fs";import{join as go}from"node:path";import{promisify as El}from"node:util";function Ea(n){return n==null?"":typeof n=="string"?n:n.toString("utf8")}function Pa(n){return go(n,"worktrees")}var jl,vl,Pl,Re,yo=d(()=>{"use strict";jl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},vl=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Pl=El(xl),Re=class{worktreesRoot;constructor(e){this.worktreesRoot=e,xa(this.worktreesRoot,{recursive:!0})}async createWorktree(e,t){let r=t.worktreePath??go(this.worktreesRoot,e);return xa(go(r,".."),{recursive:!0}),await this.git(t.repoPath,["worktree","add","-b",t.branchName,r,t.baseBranch]),{worktreePath:r,branch:t.branchName}}async checkout(e,t){await this.git(e,["checkout",t.branch])}async createBranch(e,t){t.baseBranch?await this.git(e,["checkout","-b",t.branchName,t.baseBranch]):await this.git(e,["checkout","-b",t.branchName])}async commit(e,t){return t.addAll!==!1&&await this.git(e,["add","-A"]),await this.git(e,["commit","-m",t.message]),{sha:(await this.git(e,["rev-parse","HEAD"])).stdout.trim()}}async push(e,t={}){let r=t.remote??"origin";t.branch?await this.git(e,["push",r,t.branch]):await this.git(e,["push",r,"HEAD"])}async git(e,t){try{let r=await Pl("git",t,{cwd:e,encoding:"utf8",windowsHide:!0});return{stdout:r.stdout??"",stderr:r.stderr??""}}catch(r){let o=r,i=Ea(o.stderr),s=Ea(o.stdout),a=i||s||o.message||"unknown git error";throw new Error(`git ${t.join(" ")} failed (cwd=${e}, code=${String(o.code??"?")}): ${a}`)}}};Re=jl([_l(),vl("design:paramtypes",[String])],Re)});import{Module as Al}from"@nestjs/common";import{mkdirSync as kl}from"node:fs";var Rl,Ra,zn,Aa=d(()=>{"use strict";en();yo();Rl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Ra=kt();kl(Ra,{recursive:!0});zn=class{};zn=Rl([Al({providers:[{provide:Re,useFactory:()=>new Re(Pa(Ra))}],exports:[Re]})],zn)});function Ht(n,e){return n.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(t,r)=>{let o=Tl(e,r.trim());return o==null?"":typeof o=="string"?o:JSON.stringify(o)})}function Tl(n,e){let t=e.split(".").filter(Boolean),r=n;for(let o of t){if(r==null||typeof r!="object")return;r=r[o]}return r}function gt(n,e){return typeof n=="string"?Ht(n,e):Array.isArray(n)?n.map(t=>gt(t,e)):n&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([t,r])=>[t,gt(r,e)])):n}var ka=d(()=>{"use strict"});function Ta(n,e){switch(n){case"questionnaire":return wo(e);case"confirmation":return Ol(e);case"conversation":return ql(e);default:return n}}function wo(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n.questions;return Array.isArray(e)?e.map(t=>typeof t=="string"?t.trim():t&&typeof t=="object"&&"prompt"in t?String(t.prompt).trim():"").filter(Boolean):[]}function Ol(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","summary","question"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"approved"in e&&!("questions"in e)?[]:wo(n)}function ql(n){if(typeof n=="string"&&n.trim())return[n.trim()];if(!n||typeof n!="object")return[];let e=n;for(let t of["prompt","message","text"]){let r=e[t];if(typeof r=="string"&&r.trim())return[r.trim()]}return"suggestions"in e?[]:"questions"in e?wo(n):[]}var Oa=d(()=>{"use strict"});function yt(n,e){for(let t of n){if(t.id===e)return t;if(t.iterations)for(let r of t.iterations){let o=yt(r.stepExecutions,e);if(o)return o}}}function Lt(n,e,t,r){for(let o=0;o<n.length;o++){let i=n[o];if(i.id===e)return{execution:i,siblings:n,index:o,parentLoopExecutionId:t,iterationIndex:r};if(i.iterations)for(let s of i.iterations){let a=Lt(s.stepExecutions,e,i.id,s.index);if(a)return a}}}function Q(n,e,t){return n.map(r=>r.id===e?t(r):r.iterations?{...r,iterations:r.iterations.map(o=>({...o,stepExecutions:Q(o.stepExecutions,e,t)}))}:r)}function bo(n,e,t,r){return t==null?[...n,e]:n.map(o=>{if(o.id===t){let i=[...o.iterations??[]],s=i.find(a=>a.index===r);if(s){let a={...s,stepExecutions:[...s.stepExecutions,e]},u=i.findIndex(c=>c.index===r);i[u]=a}else{let a={index:r,stepExecutions:[e],startedAt:e.startedAt??new Date().toISOString()};i.push(a),i.sort((u,c)=>u.index-c.index)}return{...o,iterations:i}}return o.iterations?{...o,iterations:o.iterations.map(i=>({...i,stepExecutions:bo(i.stepExecutions,e,t,r)}))}:o})}function Kt(n,e){for(let t of n){if(t.id===e)return t;if(t.type==="loop"){let r=Kt(t.steps,e);if(r)return r}}}function qa(n,e,t){return Q(n,e,r=>{let o=(r.iterations??[]).map(i=>{if(i.index!==t)return i;let s=i.stepExecutions.every(a=>a.completedAt)?i.stepExecutions.map(a=>a.completedAt).reduce((a,u)=>a>u?a:u):void 0;return{...i,...s?{completedAt:s}:{}}});return{...r,iterations:o}})}var $a=d(()=>{"use strict"});import{z as ne}from"zod";function Ca(n,e){let t=Nl[n].safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.length?o.path.join("."):"(root)"}: ${o.message}`).join("; ");throw new Error(`Agent output failed validation for format '${n}': ${r}`)}return t.data}var $l,Cl,Dl,Bl,Nl,Da=d(()=>{"use strict";$l=ne.object({questions:ne.array(ne.object({id:ne.string(),prompt:ne.string()}))}),Cl=ne.object({approved:ne.boolean()}),Dl=ne.object({suggestions:ne.array(ne.object({body:ne.string()}))}),Bl=ne.string(),Nl={questionnaire:$l,confirmation:Cl,comment_suggestions:Dl,free_text:Bl}});function Ba(n){return n==="completed"||n==="failed"||n==="cancelled"}function So(n,e){let t=new Map;for(let o of n){let i=e(o);if(i==null)continue;let s=t.get(i)??[];s.push(o),t.set(i,s)}if(t.size===0)return null;let r=[];for(let o of t.values()){let i=new Set(o.map(a=>a.retryOf).filter(a=>a!=null)),s=o.find(a=>!i.has(a.id));if(!s)return null;r.push(s)}return{activeJobs:r,allTerminal:r.every(o=>Ba(o.status)),groupCount:t.size}}function Na(n){let e=n.every(r=>r.status==="completed"),t=n.every(r=>r.status==="failed"||r.status==="cancelled");return e?"completed":t?"failed":"completed_with_issues"}var Fa=d(()=>{"use strict"});async function Xn(n,e,t){let r=await e.get(n);if(!r)throw new g(`SubjectView not found: ${n}`);if(!r.providerInstanceId)throw new h(`SubjectView '${n}' has no providerInstanceId \u2014 reconfigure the View to pick a provider instance`);if(r.subjectType==="ticket")return(await t.getTicketProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"ticket",...i}));if(r.subjectType==="pull_request")return(await t.getRepoProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"pull_request",...i}));if(r.subjectType==="documentation")return(await t.getDocumentationProvider(r.providerInstanceId).query(r.query)).map(i=>({subjectType:"documentation",...i}));throw new h(`Unsupported subjectType on view: ${r.subjectType}`)}var Io=d(()=>{"use strict";R()});import{Inject as be,Injectable as Ul,Logger as Ml}from"@nestjs/common";import{randomUUID as jo}from"node:crypto";import{exec as Hl}from"node:child_process";import{promisify as Ll}from"node:util";async function vo(n,e,t){if(n.length===0)throw new Error(t);let r;for(let o of n)try{return await e(o)}catch(i){r=i}throw r instanceof Error?r:new Error(t)}function Ja(n,e){let t=e[n.stepId];if(t==null||typeof t!="object")return n.type==="field_empty";let r=t[n.field];return n.type==="field_empty"?r==null?!0:typeof r=="string"||Array.isArray(r)?r.length===0:!1:r===n.value}function Vl(n,e){let t=o=>{let i=[];for(let s of o)i.push(s),s.type==="loop"&&i.push(...t(s.steps));return i},r=o=>{let i=o.findIndex(s=>s.id===e);if(i>=0){for(let s=i-1;s>=0;s--)if(o[s].type==="agent")return o[s].id;return}for(let s of o)if(s.type==="loop"){let a=r(s.steps);if(a!==void 0||s.steps.some(u=>u.id===e))return a}};return r(n.steps)}function wt(n){let e={...n.context};return n.subjectContext?.mode==="single"&&(e.subject=n.subjectContext.subject),n.worktreePath&&(e.worktreePath=n.worktreePath),n.branch&&(e.branch=n.branch),e}function Zn(n){if(!n.worktreePath)throw new Error(`Job ${n.id} has no worktreePath; run create_worktree first`);return n.worktreePath}function Se(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new Error(`Missing required string param '${e}'`);return t}function Gl(n){if(n==="none")throw new Error("normalizeAppliesTo called with none");if(Array.isArray(n)){if(n.length!==1)throw new Error(`Workflow Runner requires appliesTo to be a single SubjectType (got ${JSON.stringify(n)})`);return n[0]}return n}function Ua(n,e){for(let t of n)if(t.required&&(e[t.name]===void 0||e[t.name]===null))throw new h(`Missing required input: ${t.name}`)}var Fl,Jl,we,_o,Kl,Wl,ae,Yn=d(()=>{"use strict";ut();Dt();sn();on();Gn();yo();ge();ht();Er();Pr();Rn();R();ka();Oa();$a();Da();Fa();Io();Fl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Jl=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},we=function(n,e){return function(t,r){e(t,r,n)}},Kl=Ll(Hl),Wl=["user","organization","project"],ae=_o=class{workflows;jobs;batches;views;events;providers;notifications;knowledge;git;settings;logger=new Ml(_o.name);childTerminalLocks=new Set;batchTerminalLocks=new Set;constructor(e,t,r,o,i,s,a,u,c,f){this.workflows=e,this.jobs=t,this.batches=r,this.views=o,this.events=i,this.providers=s,this.notifications=a,this.knowledge=u,this.git=c,this.settings=f,this.events.subscribe(m=>{let j=m;(j.type==="job_completed"||j.type==="job_failed")&&this.onChildTerminal(j.jobId)})}async start(e){let t=await this.createJob(e);return this.emit({type:"job_started",jobId:t.id,timestamp:new Date().toISOString()}),this.runJob(t.id)}async launch(e){let t=await this.requireWorkflow(e.workflowId);if(t.subjectHandling!=="per-subject"&&t.subjectHandling!=="collection")throw new h(`Unsupported subjectHandling: ${String(t.subjectHandling)}`);Ua(t.inputSchema,e.inputValues);let r=await this.resolveSelection(e.selection);if(t.subjectHandling==="collection"){let a=await this.createJob({workflowId:t.id,subjectContext:{mode:"collection",subjects:r},selection:e.selection,inputValues:e.inputValues});return this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),this.runJob(a.id)}let o=new Date().toISOString(),i=await this.batches.create({id:jo(),workflowId:t.id,selection:e.selection,resolvedSubjects:r,status:"running",triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},notificationSent:!1,createdAt:o}),s=[];for(let a=0;a<r.length;a++){let u=r[a],c=await this.createJob({workflowId:t.id,subjectContext:{mode:"single",subject:u},selection:e.selection,batchId:i.id,fanOutIndex:a,inputValues:e.inputValues});s.push(c)}for(let a of s)this.emit({type:"job_started",jobId:a.id,timestamp:new Date().toISOString()}),await this.runJob(a.id);return await this.batches.get(i.id)}async createJob(e){let t=e.workflowSnapshot?structuredClone(e.workflowSnapshot):await this.workflows.get(e.workflowId);if(!t)throw new g(`Workflow not found: ${e.workflowId}`);if(!e.subjectContext&&t.subjectHandling!=="per-subject")throw new h(`Workflow Runner only supports subjectHandling 'per-subject' at start() without an explicit subjectContext (got '${t.subjectHandling}')`);Ua(t.inputSchema,e.inputValues);let r=e.subjectContext??await this.resolveSubjectContext(t,e.subjectId),o=new Date().toISOString();return this.jobs.create({id:jo(),workflowId:t.id,status:"pending",...r?{subjectContext:r}:{},...e.selection?{selection:e.selection}:{},...e.batchId?{batchId:e.batchId}:{},...e.parentJobId?{parentJobId:e.parentJobId}:{},...e.parentStepExecutionId?{parentStepExecutionId:e.parentStepExecutionId}:{},...e.fanOutIndex!=null?{fanOutIndex:e.fanOutIndex}:{},...e.retryOf?{retryOf:e.retryOf}:{},workflowSnapshot:structuredClone(t),context:{...e.inputValues},stepHistory:[],createdAt:o,updatedAt:o})}async runJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);let r=await this.workflowForJob(t);t.status==="pending"&&(t=await this.persistJob({...t,status:"planning",updatedAt:new Date().toISOString()}));let o=await this.executeStepSequence(t,r,r.steps,void 0,void 0,0);return o.outcome==="paused"||o.outcome==="failed"?o.job:this.completeJob(o.job,r)}async resume(e,t){let r=await this.jobs.get(e);if(!r)throw new g(`Job not found: ${e}`);if(r.status!=="waiting_for_human")throw new et(`Job ${e} is not waiting for human input (status: ${r.status})`);let o=await this.workflowForJob(r),i=r.currentStepExecutionId;if(!i)throw new Error(`Job ${e} is waiting_for_human but has no currentStepExecutionId`);let s=yt(r.stepHistory,i);if(!s)throw new Error(`Paused execution ${i} not found on job ${e}`);if(s.type==="loop")return this.resumeAskHuman(r,o,s,t);if(s.type!=="interaction")throw new Error(`Paused execution ${i} has type '${s.type}'; expected interaction or loop`);let a=new Date().toISOString(),u=Q(r.stepHistory,i,D=>({...D,status:"completed",completedAt:a,output:t})),c=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{response:t};r=await this.persistJob({...r,status:"planning",context:{...r.context,[s.stepDefinitionId]:t},stepHistory:u,currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:a}),this.emit({type:"human_answered",jobId:r.id,answers:c,timestamp:a});let f=Lt(r.stepHistory,i);if(!f)throw new Error(`Could not locate frame for execution ${i}`);let m=this.sequenceForFrameOnJob(r,o,f),j=f.index+1,S=await this.executeStepSequence(r,o,m,f.parentLoopExecutionId,f.iterationIndex,j);return S.outcome==="paused"||S.outcome==="failed"?S.job:f.parentLoopExecutionId!=null&&f.iterationIndex!=null?this.continueLoopAfterBody(S.job,o,f.parentLoopExecutionId,f.iterationIndex):this.completeJob(S.job,o)}async retryFailedJob(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);if(t.status!=="failed")throw new et(`Job ${e} is not failed (status: ${t.status})`);let r=t.parentJobId!=null&&t.parentStepExecutionId!=null&&t.fanOutIndex!=null,o=t.batchId!=null&&t.fanOutIndex!=null;if(!r&&!o)throw new h(`Job ${e} is not a retryable sub_workflow child or batch member`);if(r){let a=await this.jobs.get(t.parentJobId);if(!a)throw new g(`Parent job not found: ${t.parentJobId}`);let u=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,inputValues:{},parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId,fanOutIndex:t.fanOutIndex,retryOf:t.id,workflowSnapshot:t.workflowSnapshot}),c=Q(a.stepHistory,t.parentStepExecutionId,f=>({...f,status:"waiting_for_children",error:void 0,completedAt:void 0,childJobIds:[...f.childJobIds??[],u.id]}));return a=await this.persistJob({...a,status:"waiting_for_children",stepHistory:c,completedAt:void 0,updatedAt:new Date().toISOString()}),this.emit({type:"job_started",jobId:u.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:u.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(u.id),u}let i=await this.batches.get(t.batchId);if(!i)throw new g(`JobBatch not found: ${t.batchId}`);i.status!=="running"&&await this.batches.update(i.id,{status:"running",completedAt:null,notificationSent:!1});let s=await this.createJob({workflowId:t.workflowId,subjectContext:t.subjectContext,selection:t.selection,batchId:t.batchId,fanOutIndex:t.fanOutIndex,inputValues:{},retryOf:t.id,workflowSnapshot:t.workflowSnapshot});return this.emit({type:"job_started",jobId:s.id,timestamp:new Date().toISOString()}),this.emit({type:"job_retried",jobId:s.id,retryOf:t.id,timestamp:new Date().toISOString()}),this.runJob(s.id),s}async executeStepSequence(e,t,r,o,i,s){let a=e;for(let u=s;u<r.length;u++){let c=r[u],f=new Date().toISOString(),m={id:jo(),stepDefinitionId:c.id,type:c.type,status:"running",startedAt:f},j=bo(a.stepHistory,m,o,i);a=await this.persistJob({...a,status:a.status==="pending"?"planning":a.status,currentStepId:c.id,currentStepExecutionId:m.id,stepHistory:j,updatedAt:f}),this.emit({type:"step_started",jobId:a.id,stepDefinitionId:c.id,timestamp:f});try{let S=await this.dispatchStep(a,t,c,m.id,o,i);if(a=S.job,S.outcome==="paused"||S.outcome==="failed")return S}catch(S){return{outcome:"failed",job:await this.failJob(a,t,m.id,c.id,S)}}}return o!=null&&i!=null&&(a=await this.persistJob({...a,stepHistory:qa(a.stepHistory,o,i),updatedAt:new Date().toISOString()})),{outcome:"completed",job:a}}async dispatchStep(e,t,r,o,i,s){switch(r.type){case"agent":return{outcome:"completed",job:await this.executeAgentStep(e,r,o)};case"interaction":return{outcome:"paused",job:await this.pauseForInteraction(e,t,r,o)};case"git":return{outcome:"completed",job:await this.executeGitStep(e,r,o)};case"provider_action":return{outcome:"completed",job:await this.executeProviderActionStep(e,r,o)};case"shell":return{outcome:"completed",job:await this.executeShellStep(e,r,o)};case"loop":return this.runLoopStep(e,t,r,o,i,s);case"sub_workflow":return this.runSubWorkflowStep(e,r,o);default:{let a=r;throw new h(`Step type '${a.type}' not yet supported by the Workflow Runner`)}}}async runLoopStep(e,t,r,o,i,s,a=0,u=r.maxIterations){let c=e,f=a;for(;;){if(f>=u)switch(r.onMaxIterations.action){case"fail":return c=await this.failExecution(c,t,o,r.id,`Loop '${r.id}' exceeded maxIterations (${u})`),{outcome:"failed",job:c};case"continue":return c=await this.finishExecution(c,o,r.id,{iterations:f,exitedOnMaxIterations:!0}),{outcome:"completed",job:c};case"ask_human":{let j={maxIterationsCheckpoint:!0,nextIteration:f,effectiveMaxIterations:u},S=new Date().toISOString(),D=Q(c.stepHistory,o,E=>({...E,status:"pending",output:j}));return c=await this.persistJob({...c,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:D,updatedAt:S}),this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:"confirmation",data:j,questions:[`Loop '${r.id}' reached maxIterations (${u}). Extend, continue, or cancel?`],timestamp:S}),t.notificationPolicy.triggers.includes("on_needs_input")&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} hit max iterations on loop '${r.id}'`,jobId:c.id}),{outcome:"paused",job:c}}default:{let j=r.onMaxIterations;throw new Error(`Unknown onMaxIterations action: ${JSON.stringify(j)}`)}}let m=await this.executeStepSequence(c,t,r.steps,o,f,0);if(c=m.job,m.outcome==="paused")return m;if(m.outcome==="failed")return c=await this.failExecution(c,t,o,r.id,"Loop body failed"),{outcome:"failed",job:c};if(Ja(r.until,c.context))return c=await this.finishExecution(c,o,r.id,{iterations:f+1}),{outcome:"completed",job:c};f+=1}}async resumeAskHuman(e,t,r,o){let i=o,s=r.output;if(!s?.maxIterationsCheckpoint)throw new Error(`Loop execution ${r.id} is not at an ask_human checkpoint`);let a=Kt(t.steps,r.stepDefinitionId);if(!a||a.type!=="loop")throw new Error(`Loop step definition '${r.stepDefinitionId}' not found`);let u=Lt(e.stepHistory,r.id),c=new Date().toISOString();if(i.action==="cancel")return await this.failExecution({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,updatedAt:c},t,r.id,a.id,"Loop cancelled by human at maxIterations checkpoint");if(i.action==="continue"){let D=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(e.stepHistory,r.id,E=>({...E,status:"completed",completedAt:c,output:{iterations:s.nextIteration,exitedOnMaxIterations:!0,humanAction:"continue"}})),updatedAt:c});return this.emit({type:"human_answered",jobId:D.id,answers:i,timestamp:c}),this.emit({type:"step_completed",jobId:D.id,stepDefinitionId:a.id,timestamp:c}),u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(D,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(D,t,a.id)}let f=typeof i.additionalIterations=="number"?i.additionalIterations:0,m=s.effectiveMaxIterations+f,j=await this.persistJob({...e,status:"planning",currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(e.stepHistory,r.id,D=>({...D,status:"running",output:void 0})),updatedAt:c});this.emit({type:"human_answered",jobId:j.id,answers:i,timestamp:c});let S=await this.runLoopStep(j,t,a,r.id,u?.parentLoopExecutionId,u?.iterationIndex,s.nextIteration,m);return S.outcome==="paused"||S.outcome==="failed"?S.job:u?.parentLoopExecutionId!=null&&u.iterationIndex!=null?this.continueLoopAfterBody(S.job,t,u.parentLoopExecutionId,u.iterationIndex):this.continueTopLevelAfter(S.job,t,a.id)}async continueLoopAfterBody(e,t,r,o){let i=yt(e.stepHistory,r);if(!i)throw new Error(`Loop execution ${r} not found`);let s=Kt(t.steps,i.stepDefinitionId);if(!s||s.type!=="loop")throw new Error(`Loop step '${i.stepDefinitionId}' not found`);let a=Lt(e.stepHistory,r),u=i.output?.effectiveMaxIterations??s.maxIterations,c=e;if(Ja(s.until,c.context))c=await this.finishExecution(c,r,s.id,{iterations:o+1});else{let f=o+1,m=await this.runLoopStep(c,t,s,r,a?.parentLoopExecutionId,a?.iterationIndex,f,u);if(m.outcome==="paused"||m.outcome==="failed")return m.job;c=m.job}return a?.parentLoopExecutionId!=null&&a.iterationIndex!=null?this.continueLoopAfterBody(c,t,a.parentLoopExecutionId,a.iterationIndex):this.continueTopLevelAfter(c,t,s.id)}async continueTopLevelAfter(e,t,r){let o=t.steps.findIndex(s=>s.id===r),i=await this.executeStepSequence(e,t,t.steps,void 0,void 0,o+1);return i.outcome==="paused"||i.outcome==="failed"?i.job:this.completeJob(i.job,t)}sequenceForFrameOnJob(e,t,r){if(r.parentLoopExecutionId==null)return t.steps;let o=yt(e.stepHistory,r.parentLoopExecutionId);if(!o)throw new Error(`Parent loop execution ${r.parentLoopExecutionId} not found`);let i=Kt(t.steps,o.stepDefinitionId);if(!i||i.type!=="loop")throw new Error(`Parent loop step '${o.stepDefinitionId}' not found`);return i.steps}async runSubWorkflowStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="collection")throw new h(`sub_workflow steps require subjectContext.mode === 'collection' (job ${e.id})`);let o=e.subjectContext.subjects,i=[];for(let f=0;f<o.length;f++){let m=o[f],j=await this.createJob({workflowId:t.workflowId,subjectContext:{mode:"single",subject:m},inputValues:{},parentJobId:e.id,parentStepExecutionId:r,fanOutIndex:f});i.push(j)}let s=i.map(f=>f.id),a=new Date().toISOString(),u=Q(e.stepHistory,r,f=>({...f,status:"waiting_for_children",childJobIds:s})),c=await this.persistJob({...e,status:"waiting_for_children",currentStepId:t.id,currentStepExecutionId:r,stepHistory:u,updatedAt:a});for(let f of i)this.emit({type:"job_started",jobId:f.id,timestamp:a}),this.runJob(f.id);return{outcome:"paused",job:c}}async onChildTerminal(e){let t=await this.jobs.get(e);if(!t?.parentJobId||!t.parentStepExecutionId)return;let r=`${t.parentJobId}:${t.parentStepExecutionId}`;if(!this.childTerminalLocks.has(r)){this.childTerminalLocks.add(r);try{let o=(await this.jobs.list({parentJobId:t.parentJobId,parentStepExecutionId:t.parentStepExecutionId})).filter(E=>E.parentStepExecutionId===t.parentStepExecutionId),i=So(o,E=>E.fanOutIndex);if(!i?.allTerminal)return;let{activeJobs:s}=i,a=await this.jobs.get(t.parentJobId);if(!a||a.status!=="waiting_for_children"&&a.status!=="failed")return;let u=await this.workflowForJob(a),c=t.parentStepExecutionId,f=yt(a.stepHistory,c);if(!f||f.type!=="sub_workflow")return;if(s.some(E=>E.status==="failed")){await this.failExecution(a,u,c,f.stepDefinitionId,"One or more child jobs failed");return}let j=s.slice().sort((E,eu)=>(E.fanOutIndex??0)-(eu.fanOutIndex??0)).map(E=>({fanOutIndex:E.fanOutIndex,jobId:E.id,output:E.context})),S=new Date().toISOString();a=await this.persistJob({...a,status:"planning",context:{...a.context,[f.stepDefinitionId]:j},currentStepId:void 0,currentStepExecutionId:void 0,stepHistory:Q(a.stepHistory,c,E=>({...E,status:"completed",completedAt:S,output:j})),completedAt:void 0,updatedAt:S}),this.emit({type:"step_completed",jobId:a.id,stepDefinitionId:f.stepDefinitionId,timestamp:S});let D=await this.continueTopLevelAfter(a,u,f.stepDefinitionId)}finally{this.childTerminalLocks.delete(r)}}}async onBatchMemberTerminal(e){let t=await this.jobs.get(e);if(!t?.batchId)return;let r=t.batchId;if(!this.batchTerminalLocks.has(r)){this.batchTerminalLocks.add(r);try{let o=await this.batches.get(t.batchId);if(!o||o.status!=="running")return;let i=await this.jobs.list({batchId:o.id}),s=So(i,m=>m.fanOutIndex);if(!s||s.groupCount!==o.resolvedSubjects.length||!s.allTerminal)return;let{activeJobs:a}=s,u=Na(a),c=new Date().toISOString(),f=await this.batches.update(o.id,{status:u,completedAt:c});if(!f)return;if(this.emit({type:"batch_completed",batchId:f.id,summary:a.map(m=>({jobId:m.id,status:m.status})),timestamp:c}),!f.notificationSent){let m=await this.workflowForJob(t),j=f.notificationOverride??m.notificationPolicy,S=u==="completed"?"on_complete":"on_fail";j.triggers.includes(S)&&await this.notifications.send({title:`Batch ${u}: ${m.name}`,body:`JobBatch ${f.id} finished with status '${u}' (${a.length} members)`,batchId:f.id}),await this.batches.update(f.id,{notificationSent:!0})}}finally{this.batchTerminalLocks.delete(r)}}}async resolveSelection(e){if(e.mode==="view")return Xn(e.viewId,this.views,this.providers);let t=[];for(let r of e.subjectIds)if(e.subjectType==="ticket"){let o=await this.getTicketById(r);t.push({subjectType:"ticket",...o})}else if(e.subjectType==="pull_request"){let o=await this.getPullRequestById(r);t.push({subjectType:"pull_request",...o})}else if(e.subjectType==="documentation"){let o=await this.getDocumentationById(r);t.push({subjectType:"documentation",...o})}else throw new h(`Unsupported subjectType: ${e.subjectType}`);return t}async executeAgentStep(e,t,r){let o=t.knowledgeScope?.length?t.knowledgeScope:Wl,i=await this.resolveKnowledge(o),s=wt(e),a=Ht(t.objective,s),u=t.agentInstanceId??(await this.settings.get()).defaultAgentInstanceId;if(!u)throw new Error("No default agent instance configured (set EngineSettings.defaultAgentInstanceId)");let c=await this.providers.getAgentProvider(u).run({objective:a,outputFormat:t.outputFormat,knowledge:i,context:{...s,stepId:t.id},...e.worktreePath?{cwd:e.worktreePath}:{}}),f=Ca(t.outputFormat,c.parsed);return this.finishExecution(e,r,t.id,f)}async executeGitStep(e,t,r){let o=gt(t.params,wt(e));switch(t.operation){case"create_worktree":{let i=await this.git.createWorktree(e.id,{repoPath:Se(o,"repoPath"),baseBranch:Se(o,"baseBranch"),branchName:Se(o,"branchName"),...typeof o.worktreePath=="string"?{worktreePath:o.worktreePath}:{}});return this.finishExecution(e,r,t.id,i,{worktreePath:i.worktreePath,branch:i.branch})}case"create_branch":{let i=Zn(e),s=Se(o,"branchName");return await this.git.createBranch(i,{branchName:s,...typeof o.baseBranch=="string"?{baseBranch:o.baseBranch}:{}}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"checkout":{let i=Zn(e),s=Se(o,"branch");return await this.git.checkout(i,{branch:s}),this.finishExecution(e,r,t.id,{branch:s},{branch:s})}case"commit":{let i=Zn(e),s=await this.git.commit(i,{message:Se(o,"message"),addAll:o.addAll!==!1});return this.finishExecution(e,r,t.id,s)}case"push":{let i=Zn(e);return await this.git.push(i,{...typeof o.remote=="string"?{remote:o.remote}:{},...typeof o.branch=="string"?{branch:o.branch}:{}}),this.finishExecution(e,r,t.id,{remote:typeof o.remote=="string"?o.remote:"origin",branch:typeof o.branch=="string"?o.branch:e.branch})}default:{let i=t.operation;throw new Error(`Unknown git operation: ${i}`)}}}async executeProviderActionStep(e,t,r){if(!e.subjectContext||e.subjectContext.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let o=this.resolveProviderActionSubject(e,t);if(t.extendedAction)return this.executeExtendedProviderAction(e,t,r,o);let i=gt(t.params??{},wt(e))??{},s=await this.dispatchPortableProviderAction(o,t.action,i);return this.finishExecution(e,r,t.id,s)}resolveProviderActionSubject(e,t){if(!t.target){let o=e.subjectContext;if(!o||o.mode!=="single")throw new h(`provider_action steps require subjectContext.mode === 'single' (job ${e.id})`);let i=o.subject;return{subjectType:i.subjectType,source:i.source,subjectId:i.id}}let r=Ht(t.target.subjectId,wt(e)).trim();if(!r)throw new Error(`provider_action '${t.id}' target.subjectId interpolated to an empty id`);return{subjectType:t.target.subjectType,source:t.target.source,subjectId:r}}async dispatchPortableProviderAction(e,t,r){let{subjectType:o,source:i,subjectId:s}=e;if(o==="documentation"){let u=this.providers.getDocumentationProvider(i);switch(t){case"get_subject":return u.get(s);case"get_content":return u.getContent(s);case"get_comments":return u.getComments(s);case"post_comment":return await u.postComment(s,Se(r,"body")),{posted:!0};case"update_status":throw new Error(`Provider action '${t}' is not valid for subject type 'documentation'`);default:{let c=t;throw new Error(`Unknown provider action: ${c}`)}}}let a=o==="ticket"?this.providers.getTicketProvider(i):o==="pull_request"?this.providers.getRepoProvider(i):null;if(!a)throw new Error(`Unsupported subjectType for provider_action: ${o}`);switch(t){case"get_subject":return a.get(s);case"get_comments":return a.getComments(s);case"post_comment":return await a.postComment(s,Se(r,"body")),{posted:!0};case"update_status":return await a.updateStatus(s,Se(r,"status")),{status:Se(r,"status")};case"get_content":throw new Error(`Provider action 'get_content' is not valid for subject type '${o}'`);default:{let u=t;throw new Error(`Unknown provider action: ${u}`)}}}async executeExtendedProviderAction(e,t,r,o){let i=t.extendedAction,s=o.subjectType==="documentation"?this.providers.getDocumentationProvider(i.providerId):o.subjectType==="ticket"?this.providers.getTicketProvider(i.providerId):o.subjectType==="pull_request"?this.providers.getRepoProvider(i.providerId):null;if(!s)throw new Error(`Unsupported subjectType for provider_action: ${o.subjectType}`);if(!Ms(s))throw new Error(`Provider instance '${i.providerId}' does not support extended actions. Available: none`);let a=await s.listExtendedActions(),u=a.find(m=>m.actionId===i.actionId);if(!u)throw new Error(`Provider '${i.providerId}' has no extended action '${i.actionId}'. Available: ${mt(a)}`);let c=gt(i.params??{},wt(e))??{};Pn(u,c);let f=await s.executeExtendedAction(i.actionId,{...c,subjectId:o.subjectId});return this.finishExecution(e,r,t.id,f)}async executeShellStep(e,t,r){let o=Ht(t.command,wt(e)),i=e.worktreePath??process.cwd();try{let s=await Kl(o,{cwd:i,windowsHide:!0});return this.finishExecution(e,r,t.id,{exitCode:0,stdout:String(s.stdout??""),stderr:String(s.stderr??"")})}catch(s){let a=s,u=a.stderr??"",c=a.stdout??"",f=typeof a.code=="number"?a.code:Number.parseInt(String(a.code??"1"),10)||1;throw new Error(`shell command failed (exit ${f}, cwd=${i}): ${u||c||a.message||o}`)}}async pauseForInteraction(e,t,r,o){let i=new Date().toISOString(),s=Vl(t,r.id),a=s!=null?e.context[s]:void 0,u=Q(e.stepHistory,o,j=>({...j,status:"pending"})),c=await this.persistJob({...e,status:"waiting_for_human",currentStepId:r.id,currentStepExecutionId:o,stepHistory:u,updatedAt:i}),f=Ta(r.interaction,a);return this.emit({type:"waiting_for_human",jobId:c.id,stepDefinitionId:r.id,interaction:r.interaction,data:a,questions:f,timestamp:i}),t.notificationPolicy.triggers.includes("on_needs_input")&&r.notify!==!1&&await this.notifications.send({title:`Input needed: ${t.name}`,body:`Job ${c.id} is waiting for human input on step '${r.id}'`,jobId:c.id}),c}async finishExecution(e,t,r,o,i={}){let s=new Date().toISOString(),a=Q(e.stepHistory,t,c=>({...c,status:"completed",completedAt:s,output:o})),u=await this.persistJob({...e,...i,context:{...e.context,[r]:o},stepHistory:a,updatedAt:s});return this.emit({type:"step_completed",jobId:u.id,stepDefinitionId:r,timestamp:s}),u}async failExecution(e,t,r,o,i){return this.failJob(e,t,r,o,new Error(i))}async completeJob(e,t){let r=new Date().toISOString(),o=await this.persistJob({...e,status:"completed",currentStepId:void 0,currentStepExecutionId:void 0,completedAt:r,updatedAt:r});return this.emit({type:"job_completed",jobId:o.id,timestamp:r}),await this.onBatchMemberTerminal(o.id),!o.batchId&&t.notificationPolicy.triggers.includes("on_complete")&&await this.notifications.send({title:`Job completed: ${t.name}`,body:`Job ${o.id} completed successfully`,jobId:o.id}),o}async failJob(e,t,r,o,i){let s=i instanceof Error?i.message:String(i),a=new Date().toISOString(),u=Q(e.stepHistory,r,f=>({...f,status:"failed",completedAt:a,error:s})),c=await this.persistJob({...e,status:"failed",stepHistory:u,completedAt:a,updatedAt:a});return this.emit({type:"step_failed",jobId:c.id,stepDefinitionId:o,error:s,timestamp:a}),this.emit({type:"job_failed",jobId:c.id,error:s,timestamp:a}),await this.onBatchMemberTerminal(c.id),!c.batchId&&t.notificationPolicy.triggers.includes("on_fail")&&await this.notifications.send({title:`Job failed: ${t.name}`,body:`Job ${c.id} failed on step '${o}': ${s}`,jobId:c.id}),c}async resolveSubjectContext(e,t){if(e.appliesTo==="none")return;let r=Gl(e.appliesTo);if(!t)throw new Error(`Workflow '${e.id}' applies to '${r}' but no subjectId was provided`);if(r==="ticket")return{mode:"single",subject:{subjectType:"ticket",...await this.getTicketById(t)}};if(r==="pull_request")return{mode:"single",subject:{subjectType:"pull_request",...await this.getPullRequestById(t)}};if(r==="documentation")return{mode:"single",subject:{subjectType:"documentation",...await this.getDocumentationById(t)}};throw new Error(`Unsupported subjectType for workflow subject resolution: ${r}`)}async resolveKnowledge(e){let t=[];for(let r of e)t.push(...await this.knowledge.resolve(r));return t}async workflowForJob(e){return e.workflowSnapshot?e.workflowSnapshot:(this.logger.warn(`Job ${e.id} has no workflowSnapshot; falling back to live WorkflowDefinition ${e.workflowId}`),this.requireWorkflow(e.workflowId))}async requireWorkflow(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async persistJob(e){let t=await this.jobs.update(e.id,{status:e.status,context:e.context,currentStepId:e.currentStepId,currentStepExecutionId:e.currentStepExecutionId,stepHistory:e.stepHistory,worktreePath:e.worktreePath,branch:e.branch,updatedAt:e.updatedAt,completedAt:e.completedAt});if(!t)throw new Error(`Failed to persist job ${e.id}`);return t}emit(e){this.events.emit(e)}async getTicketById(e){return vo(this.providers.ticketInstanceIds(),t=>this.providers.getTicketProvider(t).get(e),`Ticket not found: ${e}`)}async getPullRequestById(e){return vo(this.providers.repoInstanceIds(),t=>this.providers.getRepoProvider(t).get(e),`Pull request not found: ${e}`)}async getDocumentationById(e){return vo(this.providers.documentationInstanceIds(),t=>this.providers.getDocumentationProvider(t).get(e),`Documentation page not found: ${e}`)}};ae=_o=Fl([Ul(),we(0,be(q)),we(1,be(H)),we(2,be(ee)),we(3,be(Y)),we(4,be(se)),we(5,be($)),we(6,be(Pt)),we(7,be(Rt)),we(8,be(Re)),we(9,be(x)),Jl("design:paramtypes",[q,H,ee,Y,se,$,Object,Object,Re,Object])],ae)});import{Module as zl}from"@nestjs/common";var Ql,bt,xo=d(()=>{"use strict";Nt();Wn();Qn();Aa();Yn();Ql=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},bt=class{};bt=Ql([zl({imports:[ye,Le,Ke,zn],providers:[ae],exports:[ae]})],bt)});import{Catch as Zl}from"@nestjs/common";var Xl,er,Ma=d(()=>{"use strict";R();Xl=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},er=class{catch(e,t){t.switchToHttp().getResponse().status(e.httpStatus).json({error:e.message})}};er=Xl([Zl(Ye)],er)});var I,ce=d(()=>{"use strict";R();I=class{schema;constructor(e){this.schema=e}transform(e){let t=this.schema.safeParse(e);if(!t.success){let r=t.error.issues.map(o=>`${o.path.join(".")||"(root)"}: ${o.message}`).join("; ");throw new h(`Validation failed: ${r}`)}return t.data}}});import{randomUUID as Yl}from"node:crypto";function ef(){return Yl()}function Eo(n){let e=n.id??ef(),t=Zi(n.steps),r=Ha(n.steps,t);return{...n,id:e,steps:r}}function Ha(n,e){return n.map(t=>{let r=t.id;return r||(r=Qi(t.name,e),e.add(r)),t.type==="loop"?{...t,id:r,steps:Ha(t.steps,e)}:{...t,id:r}})}var La=d(()=>{"use strict";A()});function Ka(n,e,t){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo==="none")throw new h(`Cannot bind a View to workflow '${e}' because appliesTo is 'none'`);if(!ps(n.appliesTo,t))throw new h(`subjectType '${t}' is not included in workflow '${e}' appliesTo`);return n}function Wa(n,e){if(!n)throw new g(`Workflow not found: ${e}`);if(n.appliesTo!=="none")throw new h(`WorkflowShortcut requires appliesTo 'none', got '${String(n.appliesTo)}'`);if(n.subjectHandling!=="per-subject")throw new h(`WorkflowShortcut requires subjectHandling 'per-subject', got '${n.subjectHandling}'`);return n}function Po(n){if(n.appliesTo==="none"&&n.subjectHandling==="collection")throw new h("Workflows with appliesTo 'none' must use subjectHandling 'per-subject'")}var tr=d(()=>{"use strict";A();R()});import{Body as Va,Controller as tf,Delete as nf,Get as Ga,HttpCode as rf,Inject as of,Param as Ro,Patch as sf,Post as af,Query as cf}from"@nestjs/common";var St,N,tt,Ae,Qa=d(()=>{"use strict";A();ut();R();ce();La();tr();St=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},N=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},tt=function(n,e){return function(t,r){e(t,r,n)}},Ae=class{workflows;constructor(e){this.workflows=e}async list(e){if(e!=null&&e!==""&&e!=="per-subject"&&e!=="collection")throw new h(`Invalid subjectHandling filter: ${e}`);return this.workflows.list(e?{subjectHandling:e}:{})}async get(e){let t=await this.workflows.get(e);if(!t)throw new g(`Workflow not found: ${e}`);return t}async create(e){let t=Eo(e),r=dt.safeParse(t);if(!r.success){let o=r.error.issues.map(i=>`${i.path.join(".")||"(root)"}: ${i.message}`).join("; ");throw new h(`Validation failed: ${o}`)}return Po(r.data),this.workflows.create(r.data)}async update(e,t){let r=Eo({...t,id:e}),o=dt.safeParse(r);if(!o.success){let u=o.error.issues.map(c=>`${c.path.join(".")||"(root)"}: ${c.message}`).join("; ");throw new h(`Validation failed: ${u}`)}Po(o.data);let{id:i,...s}=o.data,a=await this.workflows.update(e,s);if(!a)throw new g(`Workflow not found: ${e}`);return a}async remove(e){if(!await this.workflows.get(e))throw new g(`Workflow not found: ${e}`);if(!await this.workflows.delete(e))throw new g(`Workflow not found: ${e}`)}};St([Ga(),tt(0,cf("subjectHandling")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"list",null);St([Ga(":id"),tt(0,Ro("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"get",null);St([af(),tt(0,Va(new I(pt))),N("design:type",Function),N("design:paramtypes",[Object]),N("design:returntype",Promise)],Ae.prototype,"create",null);St([sf(":id"),tt(0,Ro("id")),tt(1,Va(new I(pt))),N("design:type",Function),N("design:paramtypes",[String,Object]),N("design:returntype",Promise)],Ae.prototype,"update",null);St([nf(":id"),rf(204),tt(0,Ro("id")),N("design:type",Function),N("design:paramtypes",[String]),N("design:returntype",Promise)],Ae.prototype,"remove",null);Ae=St([tf("workflows"),tt(0,of(q)),N("design:paramtypes",[q])],Ae)});import{Body as ko,Controller as uf,Delete as df,Get as To,HttpCode as pf,Inject as Ao,Param as nr,Patch as za,Post as lf,Query as ff}from"@nestjs/common";var We,P,ue,de,Xa=d(()=>{"use strict";A();on();ut();R();ce();tr();ht();Io();We=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},P=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ue=function(n,e){return function(t,r){e(t,r,n)}},de=class{views;workflows;providers;constructor(e,t,r){this.views=e,this.workflows=t,this.providers=r}async list(e){if(e!=null&&e!==""){let t=G.safeParse(e);if(!t.success)throw new h(`Invalid subjectType filter: ${e}`);return this.views.list({subjectType:t.data})}return this.views.list({})}async reorder(e){let t=[];for(let i of e.viewIds){let s=await this.views.get(i);if(!s)throw new h(`Unknown view id in reorder: ${i}`);t.push(s)}if(new Set(t.map(i=>i.subjectType)).size!==1)throw new h("All viewIds in a reorder request must share the same subjectType");return await this.views.reorder(e.viewIds)}async listSubjects(e){return Xn(e,this.views,this.providers)}async get(e){let t=await this.views.get(e);if(!t)throw new g(`SubjectView not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId,e.subjectType),this.views.create(e)}async update(e,t){let r=await this.views.get(e);if(!r)throw new g(`SubjectView not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId,t.subjectType??r.subjectType);let o=await this.views.update(e,t);if(!o)throw new g(`SubjectView not found: ${e}`);return o}async remove(e){if(!await this.views.delete(e))throw new g(`SubjectView not found: ${e}`)}async assertBinding(e,t){let r=await this.workflows.get(e);Ka(r,e,t)}};We([To(),ue(0,ff("subjectType")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"list",null);We([za("reorder"),ue(0,ko(new I(pn))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],de.prototype,"reorder",null);We([To(":id/subjects"),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"listSubjects",null);We([To(":id"),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"get",null);We([lf(),ue(0,ko(new I(un))),P("design:type",Function),P("design:paramtypes",[Object]),P("design:returntype",Promise)],de.prototype,"create",null);We([za(":id"),ue(0,nr("id")),ue(1,ko(new I(dn))),P("design:type",Function),P("design:paramtypes",[String,Object]),P("design:returntype",Promise)],de.prototype,"update",null);We([df(":id"),pf(204),ue(0,nr("id")),P("design:type",Function),P("design:paramtypes",[String]),P("design:returntype",Promise)],de.prototype,"remove",null);de=We([uf("views"),ue(0,Ao(Y)),ue(1,Ao(q)),ue(2,Ao($)),P("design:paramtypes",[Y,q,$])],de)});import{Body as Oo,Controller as mf,Delete as hf,Get as Ya,HttpCode as gf,Inject as Za,Param as qo,Patch as ec,Post as yf}from"@nestjs/common";var nt,k,Ve,Ie,tc=d(()=>{"use strict";A();Vr();ut();R();ce();tr();nt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},k=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ve=function(n,e){return function(t,r){e(t,r,n)}},Ie=class{shortcuts;workflows;constructor(e,t){this.shortcuts=e,this.workflows=t}async list(){return this.shortcuts.list()}async reorder(e){for(let t of e.shortcutIds)if(!await this.shortcuts.get(t))throw new h(`Unknown shortcut id in reorder: ${t}`);return this.shortcuts.reorder(e.shortcutIds)}async get(e){let t=await this.shortcuts.get(e);if(!t)throw new g(`WorkflowShortcut not found: ${e}`);return t}async create(e){return await this.assertBinding(e.workflowId),this.shortcuts.create(e)}async update(e,t){let r=await this.shortcuts.get(e);if(!r)throw new g(`WorkflowShortcut not found: ${e}`);await this.assertBinding(t.workflowId??r.workflowId);let o=await this.shortcuts.update(e,t);if(!o)throw new g(`WorkflowShortcut not found: ${e}`);return o}async remove(e){if(!await this.shortcuts.delete(e))throw new g(`WorkflowShortcut not found: ${e}`)}async assertBinding(e){let t=await this.workflows.get(e);Wa(t,e)}};nt([Ya(),k("design:type",Function),k("design:paramtypes",[]),k("design:returntype",Promise)],Ie.prototype,"list",null);nt([ec("reorder"),Ve(0,Oo(new I(gn))),k("design:type",Function),k("design:paramtypes",[Object]),k("design:returntype",Promise)],Ie.prototype,"reorder",null);nt([Ya(":id"),Ve(0,qo("id")),k("design:type",Function),k("design:paramtypes",[String]),k("design:returntype",Promise)],Ie.prototype,"get",null);nt([yf(),Ve(0,Oo(new I(mn))),k("design:type",Function),k("design:paramtypes",[Object]),k("design:returntype",Promise)],Ie.prototype,"create",null);nt([ec(":id"),Ve(0,qo("id")),Ve(1,Oo(new I(hn))),k("design:type",Function),k("design:paramtypes",[String,Object]),k("design:returntype",Promise)],Ie.prototype,"update",null);nt([hf(":id"),gf(204),Ve(0,qo("id")),k("design:type",Function),k("design:paramtypes",[String]),k("design:returntype",Promise)],Ie.prototype,"remove",null);Ie=nt([mf("workflow-shortcuts"),Ve(0,Za(Ee)),Ve(1,Za(q)),k("design:paramtypes",[Ee,q])],Ie)});function rr(n,e,t=50){let r=n!=null&&n!==""?Number(n):t,o=e!=null&&e!==""?Number(e):0;return!Number.isFinite(r)||r<1?{limit:t,offset:Math.max(0,o||0)}:!Number.isFinite(o)||o<0?{limit:r,offset:0}:{limit:Math.floor(r),offset:Math.floor(o)}}function or(n,e,t){return n.slice(t,t+e)}var $o=d(()=>{"use strict"});import{z as re}from"zod";var ir,sr,ar,Co=d(()=>{"use strict";ir=re.object({workflowId:re.string().min(1),subjectId:re.string().min(1).optional(),inputValues:re.record(re.string(),re.unknown())}),sr=re.object({response:re.unknown()}),ar=re.object({workflowId:re.string().min(1),subjectIds:re.array(re.string().min(1))})});import{Body as Do,Controller as wf,Get as oc,HttpCode as bf,Inject as nc,Param as Bo,Post as cr,Query as Ge}from"@nestjs/common";import"zod";function rc(n,e){if(!(n==null||n==="")){if(n==="true")return!0;if(n==="false")return!1;throw new h(`Invalid ${e} filter: ${n}`)}}var rt,T,F,Sf,je,ic=d(()=>{"use strict";Yn();Dt();R();ce();$o();Co();rt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},T=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},F=function(n,e){return function(t,r){e(t,r,n)}},Sf=["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"];je=class{jobs;runner;constructor(e,t){this.jobs=e,this.runner=t}async list(e,t,r,o,i,s,a,u){if(t!=null&&t!==""&&!Sf.includes(t))throw new h(`Invalid status filter: ${t}`);let c=rc(i,"topLevelOnly"),f=rc(s,"terminal"),{limit:m,offset:j}=rr(a,u),S=await this.jobs.list({...e?{workflowId:e}:{},...t?{status:t}:{},...r?{batchId:r}:{},...o?{parentJobId:o}:{},...c===!0?{topLevelOnly:!0}:{},...f!==void 0?{terminal:f}:{}});return or(S,m,j)}async latestBySubject(e){return this.jobs.latestBySubject(e.workflowId,e.subjectIds)}async get(e){let t=await this.jobs.get(e);if(!t)throw new g(`Job not found: ${e}`);return t}async create(e){return this.runner.start({workflowId:e.workflowId,...e.subjectId?{subjectId:e.subjectId}:{},inputValues:e.inputValues})}async resume(e,t){return this.runner.resume(e,t.response)}async retry(e){return this.runner.retryFailedJob(e)}};rt([oc(),F(0,Ge("workflowId")),F(1,Ge("status")),F(2,Ge("batchId")),F(3,Ge("parentJobId")),F(4,Ge("topLevelOnly")),F(5,Ge("terminal")),F(6,Ge("limit")),F(7,Ge("offset")),T("design:type",Function),T("design:paramtypes",[String,String,String,String,String,String,String,String]),T("design:returntype",Promise)],je.prototype,"list",null);rt([cr("latest-by-subject"),bf(200),F(0,Do(new I(ar))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],je.prototype,"latestBySubject",null);rt([oc(":id"),F(0,Bo("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],je.prototype,"get",null);rt([cr(),F(0,Do(new I(ir))),T("design:type",Function),T("design:paramtypes",[Object]),T("design:returntype",Promise)],je.prototype,"create",null);rt([cr(":id/resume"),F(0,Bo("id")),F(1,Do(new I(sr))),T("design:type",Function),T("design:paramtypes",[String,Object]),T("design:returntype",Promise)],je.prototype,"resume",null);rt([cr(":id/retry"),F(0,Bo("id")),T("design:type",Function),T("design:paramtypes",[String]),T("design:returntype",Promise)],je.prototype,"retry",null);je=rt([wf("jobs"),F(0,nc(H)),F(1,nc(ae)),T("design:paramtypes",[H,ae])],je)});import{z as V}from"zod";var ur,dr,No=d(()=>{"use strict";A();ur=V.discriminatedUnion("mode",[V.object({mode:V.literal("view"),viewId:V.string().min(1)}),V.object({mode:V.literal("manual"),subjectType:G,subjectIds:V.array(V.string().min(1))})]),dr=V.object({workflowId:V.string().min(1),selection:ur,triggeredBy:V.enum(["schedule","view_bulk","multiselect"]),notificationOverride:Bt.optional(),inputValues:V.record(V.string(),V.unknown())})});import{Body as If,Controller as jf,Get as Uo,Inject as Fo,Param as sc,Post as vf,Query as Jo}from"@nestjs/common";import"zod";var Wt,z,ke,Qe,ac=d(()=>{"use strict";Yn();sn();Dt();R();ce();$o();No();Wt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},z=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ke=function(n,e){return function(t,r){e(t,r,n)}},Qe=class{batches;jobs;runner;constructor(e,t,r){this.batches=e,this.jobs=t,this.runner=r}async list(e,t,r){let{limit:o,offset:i}=rr(t,r),s=await this.batches.list(e?{workflowId:e}:{});return or(s,o,i)}async get(e){let t=await this.batches.get(e);if(!t)throw new g(`JobBatch not found: ${e}`);return t}async listJobs(e){if(!await this.batches.get(e))throw new g(`JobBatch not found: ${e}`);return this.jobs.list({batchId:e})}async launch(e){let t=await this.runner.launch({workflowId:e.workflowId,selection:e.selection,triggeredBy:e.triggeredBy,...e.notificationOverride?{notificationOverride:e.notificationOverride}:{},inputValues:e.inputValues});return"resolvedSubjects"in t&&"jobIds"in t?{kind:"batch",batch:t}:{kind:"job",job:t}}};Wt([Uo(),ke(0,Jo("workflowId")),ke(1,Jo("limit")),ke(2,Jo("offset")),z("design:type",Function),z("design:paramtypes",[String,String,String]),z("design:returntype",Promise)],Qe.prototype,"list",null);Wt([Uo(":id"),ke(0,sc("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],Qe.prototype,"get",null);Wt([Uo(":id/jobs"),ke(0,sc("id")),z("design:type",Function),z("design:paramtypes",[String]),z("design:returntype",Promise)],Qe.prototype,"listJobs",null);Wt([vf(),ke(0,If(new I(dr))),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",Promise)],Qe.prototype,"launch",null);Qe=Wt([jf("batches"),ke(0,Fo(ee)),ke(1,Fo(H)),ke(2,Fo(ae)),z("design:paramtypes",[ee,H,ae])],Qe)});import{Body as cc,Controller as _f,Delete as xf,Get as uc,HttpCode as Ef,Inject as Pf,Param as Mo,Patch as Rf,Post as Af,Query as kf}from"@nestjs/common";var It,J,ot,Te,dc=d(()=>{"use strict";A();Kr();R();ce();It=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},J=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ot=function(n,e){return function(t,r){e(t,r,n)}},Te=class{schedules;constructor(e){this.schedules=e}async list(e){if(e==null||e==="")return this.schedules.list();if(e!=="true"&&e!=="false")throw new h(`Invalid enabled filter: ${e}`);return this.schedules.list({enabled:e==="true"})}async get(e){let t=await this.schedules.get(e);if(!t)throw new g(`Schedule not found: ${e}`);return t}async create(e){return this.schedules.create(e)}async update(e,t){let r=await this.schedules.update(e,t);if(!r)throw new g(`Schedule not found: ${e}`);return r}async remove(e){if(!await this.schedules.delete(e))throw new g(`Schedule not found: ${e}`)}};It([uc(),ot(0,kf("enabled")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"list",null);It([uc(":id"),ot(0,Mo("id")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"get",null);It([Af(),ot(0,cc(new I(lt))),J("design:type",Function),J("design:paramtypes",[Object]),J("design:returntype",Promise)],Te.prototype,"create",null);It([Rf(":id"),ot(0,Mo("id")),ot(1,cc(new I(lt.partial().omit({id:!0})))),J("design:type",Function),J("design:paramtypes",[String,Object]),J("design:returntype",Promise)],Te.prototype,"update",null);It([xf(":id"),Ef(204),ot(0,Mo("id")),J("design:type",Function),J("design:paramtypes",[String]),J("design:returntype",Promise)],Te.prototype,"remove",null);Te=It([_f("schedules"),ot(0,Pf(xe)),J("design:paramtypes",[xe])],Te)});import{Controller as Tf,Inject as Of,Query as pc,Sse as qf}from"@nestjs/common";import{Observable as fc}from"rxjs";var lc,pr,Ho,Vt,mc=d(()=>{"use strict";Gn();lc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},pr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ho=function(n,e){return function(t,r){e(t,r,n)}},Vt=class{events;constructor(e){this.events=e}stream(e,t){return new fc(r=>{let o=this.events.subscribe(i=>{let s=i;e!=null&&e!==""&&(!("jobId"in s)||s.jobId!==e)||t!=null&&t!==""&&(!("batchId"in s)||s.batchId!==t)||r.next({data:s})});return()=>{o()}})}};lc([qf(),Ho(0,pc("jobId")),Ho(1,pc("batchId")),pr("design:type",Function),pr("design:paramtypes",[String,String]),pr("design:returntype",fc)],Vt.prototype,"stream",null);Vt=lc([Tf("events"),Ho(0,Of(se)),pr("design:paramtypes",[se])],Vt)});import{extendZodWithOpenApi as $f}from"@asteasolutions/zod-to-openapi";import{z as Cf}from"zod";var hc=d(()=>{"use strict";$f(Cf)});import{z as gc}from"zod";var lr,Lo=d(()=>{"use strict";lr=gc.object({value:gc.string().min(1)})});import{z as p}from"zod";function em(n){let e=p.toJSONSchema(n),{$schema:t,...r}=e;return r}function wc(n){let e=(t,r)=>n.registerComponent("schemas",t,em(r)).ref;return{WorkflowDefinition:e("WorkflowDefinition",dt),WorkflowDefinitionInput:e("WorkflowDefinitionInput",pt),UpdateWorkflowBody:e("UpdateWorkflowBody",Vf),SubjectView:e("SubjectView",cn),CreateSubjectViewBody:e("CreateSubjectViewBody",un),ReorderViewsBody:e("ReorderViewsBody",pn),UpdateViewBody:e("UpdateViewBody",Gf),WorkflowShortcut:e("WorkflowShortcut",fn),CreateWorkflowShortcutBody:e("CreateWorkflowShortcutBody",mn),UpdateWorkflowShortcutBody:e("UpdateWorkflowShortcutBody",hn),ReorderShortcutsBody:e("ReorderShortcutsBody",gn),Schedule:e("Schedule",lt),UpdateScheduleBody:e("UpdateScheduleBody",Qf),EngineSettings:e("EngineSettings",wn),UpdateSettingsBody:e("UpdateSettingsBody",Xf),SettingsPatchResponse:e("SettingsPatchResponse",Yf),ProviderInstanceConfig:e("ProviderInstanceConfig",yn),CreateProviderInstanceBody:e("CreateProviderInstanceBody",Sn),UpdateProviderInstanceBody:e("UpdateProviderInstanceBody",In),ProviderInstanceMutationResponse:e("ProviderInstanceMutationResponse",Zf),SetSecretBody:e("SetSecretBody",lr),CreateJobBody:e("CreateJobBody",ir),ResumeJobBody:e("ResumeJobBody",sr),LatestBySubjectBody:e("LatestBySubjectBody",ar),LatestBySubjectResponse:e("LatestBySubjectResponse",zf),LaunchBody:e("LaunchBody",dr),Job:e("Job",Ko),JobBatch:e("JobBatch",yc),LaunchResponse:e("LaunchResponse",Mf),HealthResponse:e("HealthResponse",Hf),ProviderStatus:e("ProviderStatus",Lf),QueryTemplate:e("QueryTemplate",Li),ProviderActionDescriptor:e("ProviderActionDescriptor",Ki),PreviewModelsBody:e("PreviewModelsBody",jn),PreviewModel:e("PreviewModel",Rs),ResolveQueryTemplateBody:e("ResolveQueryTemplateBody",an),ResolveQueryTemplateResponse:e("ResolveQueryTemplateResponse",Wi),ErrorResponse:e("ErrorResponse",Kf),EngineEvent:e("EngineEvent",Wf),Subject:e("Subject",fr)}}var Df,Bf,Nf,Ff,fr,Jf,Uf,Ko,yc,Mf,Hf,Lf,Kf,Wf,Vf,Gf,Qf,zf,Xf,Zf,Yf,O,Wo,Vo=d(()=>{"use strict";hc();A();Co();No();Lo();Df=p.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]),Bf=p.object({subjectType:p.literal("ticket"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),status:p.string(),assignee:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Nf=p.object({subjectType:p.literal("pull_request"),id:p.string(),source:p.string().min(1),title:p.string(),description:p.string().optional(),sourceBranch:p.string(),targetBranch:p.string(),author:p.string().optional(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),Ff=p.object({subjectType:p.literal("documentation"),id:p.string(),source:p.string().min(1),title:p.string(),url:p.string().optional(),raw:p.record(p.string(),p.unknown()).optional()}),fr=p.discriminatedUnion("subjectType",[Bf,Nf,Ff]),Jf=p.discriminatedUnion("mode",[p.object({mode:p.literal("single"),subject:fr}),p.object({mode:p.literal("collection"),subjects:p.array(fr)})]),Uf=p.object({id:p.string(),stepDefinitionId:p.string(),type:p.string(),status:p.enum(["pending","running","waiting_for_children","completed","failed","skipped"]),startedAt:p.string().optional(),completedAt:p.string().optional(),output:p.unknown().optional(),error:p.string().optional(),childJobIds:p.array(p.string()).optional(),iterations:p.array(p.object({index:p.number().int(),stepExecutions:p.array(p.record(p.string(),p.unknown())),startedAt:p.string(),completedAt:p.string().optional()})).optional()}),Ko=p.object({id:p.string(),workflowId:p.string(),status:Df,subjectContext:Jf.optional(),selection:ur.optional(),batchId:p.string().optional(),parentJobId:p.string().optional(),parentStepExecutionId:p.string().optional(),fanOutIndex:p.number().int().optional(),retryOf:p.string().optional(),workflowSnapshot:dt.optional(),context:p.record(p.string(),p.unknown()),worktreePath:p.string().optional(),branch:p.string().optional(),currentStepId:p.string().optional(),currentStepExecutionId:p.string().optional(),stepHistory:p.array(Uf),createdAt:p.string(),updatedAt:p.string(),completedAt:p.string().optional()}),yc=p.object({id:p.string(),workflowId:p.string(),selection:ur,resolvedSubjects:p.array(fr),jobIds:p.array(p.string()),status:p.enum(["running","completed","completed_with_issues","failed"]),triggeredBy:p.enum(["schedule","view_bulk","multiselect"]),scheduleId:p.string().optional(),notificationOverride:Bt.optional(),notificationSent:p.boolean(),createdAt:p.string(),completedAt:p.string().optional()}),Mf=p.discriminatedUnion("kind",[p.object({kind:p.literal("job"),job:Ko}),p.object({kind:p.literal("batch"),batch:yc})]),Hf=p.object({ok:p.boolean(),service:p.string(),timestamp:p.string()}),Lf=p.object({providerId:p.string(),secretKey:p.string(),configured:p.boolean()}),Kf=p.object({error:p.string()}),Wf=p.object({type:p.string(),timestamp:p.string()}).passthrough(),Vf=pt,Gf=dn,Qf=lt.partial().omit({id:!0}),zf=p.record(p.string(),Ko.nullable()),Xf=bn,Zf=p.object({settings:wn,restartRequired:p.literal(!0)}),Yf=p.object({settings:wn,restartRequired:p.boolean()}),O=p.object({id:p.string().min(1)}),Wo=p.object({limit:p.string().optional().openapi({description:"Max items to return (default 50)"}),offset:p.string().optional().openapi({description:"Number of items to skip (default 0)"})})});import{z as v}from"zod";function y(n,e){return{description:e,content:{"application/json":{schema:n}}}}function L(n){return{type:"array",items:n}}function b(n,...e){let t={400:"Validation error",404:"Resource not found",409:"Conflict"};return Object.fromEntries(e.map(r=>[String(r),y(n.ErrorResponse,t[r]??"Error")]))}function bc(n,e){n.registerPath({method:"get",path:"/health",tags:["Health"],summary:"Health check",responses:{200:y(e.HealthResponse,"Service is healthy")}}),n.registerPath({method:"get",path:"/workflows",tags:["Workflows"],summary:"List workflow definitions",request:{query:v.object({subjectHandling:v.enum(["per-subject","collection"]).optional()})},responses:{200:y(L(e.WorkflowDefinition),"Workflow definitions"),...b(e,400)}}),n.registerPath({method:"get",path:"/workflows/{id}",tags:["Workflows"],summary:"Get a workflow definition",request:{params:O},responses:{200:y(e.WorkflowDefinition,"Workflow definition"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflows",tags:["Workflows"],summary:"Create a workflow definition",request:{body:{required:!0,content:{"application/json":{schema:e.WorkflowDefinitionInput}}}},responses:{201:y(e.WorkflowDefinition,"Created workflow definition"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflows/{id}",tags:["Workflows"],summary:"Update a workflow definition",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowBody}}}},responses:{200:y(e.WorkflowDefinition,"Updated workflow definition"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflows/{id}",tags:["Workflows"],summary:"Delete a workflow definition",description:"Deletes the live workflow definition. Running Jobs keep executing from the snapshot captured at Job creation.",request:{params:O},responses:{204:{description:"Workflow deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/views",tags:["Views"],summary:"List subject views",request:{query:v.object({subjectType:G.optional()})},responses:{200:y(L(e.SubjectView),"Subject views"),...b(e,400)}}),n.registerPath({method:"get",path:"/views/{id}",tags:["Views"],summary:"Get a subject view",request:{params:O},responses:{200:y(e.SubjectView,"Subject view"),...b(e,404)}}),n.registerPath({method:"get",path:"/views/{id}/subjects",tags:["Views"],summary:"Preview subjects matching a view",description:"Live provider query for the View's saved filter. Same resolution path as launch() for { mode: 'view' }. Does not create Jobs or snapshots.",request:{params:O},responses:{200:y(L(e.Subject),"Matching subjects"),...b(e,404,400)}}),n.registerPath({method:"patch",path:"/views/reorder",tags:["Views"],summary:"Reorder views within a subject type group",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderViewsBody}}}},responses:{200:y(L(e.SubjectView),"Reordered views for the subject type"),...b(e,400)}}),n.registerPath({method:"post",path:"/views",tags:["Views"],summary:"Create a subject view",request:{body:{required:!0,content:{"application/json":{schema:e.CreateSubjectViewBody}}}},responses:{201:y(e.SubjectView,"Created subject view"),...b(e,400)}}),n.registerPath({method:"patch",path:"/views/{id}",tags:["Views"],summary:"Update a subject view",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateViewBody}}}},responses:{200:y(e.SubjectView,"Updated subject view"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/views/{id}",tags:["Views"],summary:"Delete a subject view",request:{params:O},responses:{204:{description:"Subject view deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/jobs",tags:["Jobs"],summary:"List jobs",request:{query:Wo.extend({workflowId:v.string().optional(),status:v.enum(["pending","planning","waiting_for_human","waiting_for_children","implementing","testing","completed","failed","cancelled"]).optional(),batchId:v.string().optional(),parentJobId:v.string().optional(),topLevelOnly:v.enum(["true","false"]).optional().openapi({description:"When true, exclude jobs that belong to a batch or a parent (sub_workflow) job"}),terminal:v.enum(["true","false"]).optional().openapi({description:"When true, only completed/failed/cancelled jobs. When false, only in-progress jobs. Omitted: no terminality filter."})})},responses:{200:y(L(e.Job),"Jobs"),...b(e,400)}}),n.registerPath({method:"get",path:"/jobs/{id}",tags:["Jobs"],summary:"Get a job",request:{params:O},responses:{200:y(e.Job,"Job"),...b(e,404)}}),n.registerPath({method:"post",path:"/jobs",tags:["Jobs"],summary:"Start a single job",request:{body:{required:!0,content:{"application/json":{schema:e.CreateJobBody}}}},responses:{201:y(e.Job,"Started job"),...b(e,400,404)}}),n.registerPath({method:"post",path:"/jobs/latest-by-subject",tags:["Jobs"],summary:"Latest job per subject for a workflow",request:{body:{required:!0,content:{"application/json":{schema:e.LatestBySubjectBody}}}},responses:{200:y(e.LatestBySubjectResponse,"Latest job keyed by subject id"),...b(e,400)}}),n.registerPath({method:"post",path:"/jobs/{id}/resume",tags:["Jobs"],summary:"Resume a job waiting for human input",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.ResumeJobBody}}}},responses:{200:y(e.Job,"Resumed job"),...b(e,400,404,409)}}),n.registerPath({method:"post",path:"/jobs/{id}/retry",tags:["Jobs"],summary:"Retry a failed job",request:{params:O},responses:{200:y(e.Job,"Retry job"),...b(e,404,409)}}),n.registerPath({method:"get",path:"/batches",tags:["Batches"],summary:"List job batches",request:{query:Wo.extend({workflowId:v.string().optional()})},responses:{200:y(L(e.JobBatch),"Job batches")}}),n.registerPath({method:"get",path:"/batches/{id}",tags:["Batches"],summary:"Get a job batch",request:{params:O},responses:{200:y(e.JobBatch,"Job batch"),...b(e,404)}}),n.registerPath({method:"get",path:"/batches/{id}/jobs",tags:["Batches"],summary:"List jobs in a batch",request:{params:O},responses:{200:y(L(e.Job),"Jobs in the batch"),...b(e,404)}}),n.registerPath({method:"post",path:"/batches",tags:["Batches"],summary:"Launch a per-subject batch or collection run",description:"Resolves subject selection and starts a JobBatch for per-subject workflows (even for one subject) or a single Job for collection workflows.",request:{body:{required:!0,content:{"application/json":{schema:e.LaunchBody}}}},responses:{201:y(e.LaunchResponse,"Launch result"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"List workflow shortcuts",responses:{200:y(L(e.WorkflowShortcut),"Workflow shortcuts")}}),n.registerPath({method:"get",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Get a workflow shortcut",request:{params:O},responses:{200:y(e.WorkflowShortcut,"Workflow shortcut"),...b(e,404)}}),n.registerPath({method:"post",path:"/workflow-shortcuts",tags:["Workflow shortcuts"],summary:"Create a workflow shortcut",request:{body:{required:!0,content:{"application/json":{schema:e.CreateWorkflowShortcutBody}}}},responses:{201:y(e.WorkflowShortcut,"Created workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/reorder",tags:["Workflow shortcuts"],summary:"Reorder workflow shortcuts",request:{body:{required:!0,content:{"application/json":{schema:e.ReorderShortcutsBody}}}},responses:{200:y(L(e.WorkflowShortcut),"Reordered workflow shortcuts"),...b(e,400)}}),n.registerPath({method:"patch",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Update a workflow shortcut",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateWorkflowShortcutBody}}}},responses:{200:y(e.WorkflowShortcut,"Updated workflow shortcut"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/workflow-shortcuts/{id}",tags:["Workflow shortcuts"],summary:"Delete a workflow shortcut",request:{params:O},responses:{204:{description:"Workflow shortcut deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/schedules",tags:["Schedules"],summary:"List schedules",request:{query:v.object({enabled:v.enum(["true","false"]).optional()})},responses:{200:y(L(e.Schedule),"Schedules"),...b(e,400)}}),n.registerPath({method:"get",path:"/schedules/{id}",tags:["Schedules"],summary:"Get a schedule",request:{params:O},responses:{200:y(e.Schedule,"Schedule"),...b(e,404)}}),n.registerPath({method:"post",path:"/schedules",tags:["Schedules"],summary:"Create a schedule",description:"CRUD only \u2014 creating or enabling a schedule does not cause it to fire yet.",request:{body:{required:!0,content:{"application/json":{schema:e.Schedule}}}},responses:{201:y(e.Schedule,"Created schedule"),...b(e,400)}}),n.registerPath({method:"patch",path:"/schedules/{id}",tags:["Schedules"],summary:"Update a schedule",request:{params:O,body:{required:!0,content:{"application/json":{schema:e.UpdateScheduleBody}}}},responses:{200:y(e.Schedule,"Updated schedule"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/schedules/{id}",tags:["Schedules"],summary:"Delete a schedule",request:{params:O},responses:{204:{description:"Schedule deleted"},...b(e,404)}}),n.registerPath({method:"get",path:"/providers/status",tags:["Providers"],summary:"Provider secret configuration status",description:"Reports whether each known provider API key is set. Returns key *names* only \u2014 never secret values.",responses:{200:y(L(e.ProviderStatus),"Provider configuration status")}}),n.registerPath({method:"post",path:"/providers/preview-models",tags:["Providers"],summary:"Preview models available to an agent API key",description:"Lookup only \u2014 does not persist settings or secrets. Send apiKey to try a typed key before save, or instanceId to use the already-stored key (never echoed).",request:{body:{required:!0,content:{"application/json":{schema:e.PreviewModelsBody}}}},responses:{200:y(L(e.PreviewModel),"Models available to the key"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/providers/{providerId}/query-templates",tags:["Providers"],summary:"List query templates for a provider",description:"Named, pre-built query templates owned by the provider. Providers with none yet (e.g. documentation) return an empty list. The client never constructs `query` itself \u2014 it submits templateId + params to the resolve endpoint.",request:{params:v.object({providerId:v.string().min(1)})},responses:{200:y(L(e.QueryTemplate),"Query templates")}}),n.registerPath({method:"get",path:"/providers/{providerId}/actions",tags:["Providers"],summary:"List extended actions for a provider",description:"Opt-in capabilities beyond the portable five ProviderAction operations. Providers that do not implement ExtendedActionProvider return an empty list \u2014 that is a normal, expected case, not an error.",request:{params:v.object({providerId:v.string().min(1)})},responses:{200:y(L(e.ProviderActionDescriptor),"Extended actions")}}),n.registerPath({method:"post",path:"/providers/{providerId}/query-templates/{templateId}/resolve",tags:["Providers"],summary:"Resolve a query template to a concrete query",description:"Provider-specific query-shape knowledge stays server-side. Returns the `query` object to store on a SubjectView, along with template provenance the client attaches separately.",request:{params:v.object({providerId:v.string().min(1),templateId:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.ResolveQueryTemplateBody}}}},responses:{200:y(e.ResolveQueryTemplateResponse,"Resolved query"),...b(e,400,404)}}),n.registerPath({method:"get",path:"/settings",tags:["Settings"],summary:"Get engine settings",description:"Persisted provider configuration. Never includes secret values \u2014 those live in SecretStore.",responses:{200:y(e.EngineSettings,"Current engine settings")}}),n.registerPath({method:"patch",path:"/settings",tags:["Settings"],summary:"Update engine settings",description:"Partial merge. restartRequired is true when providerInstances is in the patch (instance bindings are boot-time). Changing defaultAgentInstanceId takes effect on the next agent step with no restart.",request:{body:{required:!0,content:{"application/json":{schema:e.UpdateSettingsBody}}}},responses:{200:y(e.SettingsPatchResponse,"Updated settings"),...b(e,400)}}),n.registerPath({method:"get",path:"/provider-instances",tags:["Settings"],summary:"List provider instances",responses:{200:y(L(e.ProviderInstanceConfig),"Configured provider instances")}}),n.registerPath({method:"post",path:"/provider-instances",tags:["Settings"],summary:"Create a provider instance",description:"Persists the instance. restartRequired is always true \u2014 bindings are boot-time. For agent instances, defaultAgent atomically replaces EngineSettings.defaultAgentInstanceId in the same write.",request:{body:{required:!0,content:{"application/json":{schema:e.CreateProviderInstanceBody}}}},responses:{201:y(e.ProviderInstanceMutationResponse,"Created instance settings"),...b(e,400,409)}}),n.registerPath({method:"get",path:"/provider-instances/{id}",tags:["Settings"],summary:"Get a provider instance",request:{params:v.object({id:v.string().min(1)})},responses:{200:y(e.ProviderInstanceConfig,"Provider instance"),...b(e,404)}}),n.registerPath({method:"patch",path:"/provider-instances/{id}",tags:["Settings"],summary:"Update a provider instance",request:{params:v.object({id:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.UpdateProviderInstanceBody}}}},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated instance settings"),...b(e,400,404)}}),n.registerPath({method:"delete",path:"/provider-instances/{id}",tags:["Settings"],summary:"Delete a provider instance",request:{params:v.object({id:v.string().min(1)})},responses:{200:y(e.ProviderInstanceMutationResponse,"Updated settings after delete"),...b(e,404)}}),n.registerPath({method:"post",path:"/secrets/{key}",tags:["Settings"],summary:"Store a secret",description:"Writes to SecretStore. The response never includes the secret value.",request:{params:v.object({key:v.string().min(1)}),body:{required:!0,content:{"application/json":{schema:e.SetSecretBody}}}},responses:{204:{description:"Secret stored"},...b(e,400)}}),n.registerPath({method:"get",path:"/events",tags:["Events"],summary:"Subscribe to engine events (SSE)",description:"Server-Sent Events stream. Each event `data` field is a JSON EngineEvent. Optionally filter by jobId and/or batchId.",request:{query:v.object({jobId:v.string().optional(),batchId:v.string().optional()})},responses:{200:{description:"SSE stream of engine events",content:{"text/event-stream":{schema:e.EngineEvent}}}}})}var Sc=d(()=>{"use strict";A();Vo()});import{OpenAPIRegistry as tm,OpenApiGeneratorV31 as nm}from"@asteasolutions/zod-to-openapi";function Ic(){if(mr)return mr;let n=new tm,e=wc(n);return bc(n,e),mr=new nm(n.definitions).generateDocument({openapi:"3.1.0",info:{title:"Knoflows Engine API",version:"0.1.0",description:"REST API for workflow definitions, jobs, batches, schedules, views, and live events."},servers:[{url:"/api"}]}),mr}var mr,jc=d(()=>{"use strict";Vo();Sc()});import{Controller as rm,Get as om,Header as im}from"@nestjs/common";var vc,Go,Gt,_c=d(()=>{"use strict";jc();vc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},Go=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Gt=class{getOpenApiDocument(){return Ic()}};vc([om("openapi.json"),im("Content-Type","application/json"),Go("design:type",Function),Go("design:paramtypes",[]),Go("design:returntype",void 0)],Gt.prototype,"getOpenApiDocument",null);Gt=vc([rm()],Gt)});import{Controller as sm,Get as Qo,Inject as hr,Param as gr,Post as xc,Body as Ec,HttpCode as Pc}from"@nestjs/common";var jt,U,ve,Oe,Rc=d(()=>{"use strict";Yr();po();lo();ho();A();ce();jt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},U=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ve=function(n,e){return function(t,r){e(t,r,n)}},Oe=class{providerStatus;queryTemplates;extendedActions;previewModels;constructor(e,t,r,o){this.providerStatus=e,this.queryTemplates=t,this.extendedActions=r,this.previewModels=o}async status(){return this.providerStatus.list()}previewAvailableModels(e){return this.previewModels.preview(e)}listQueryTemplates(e){return this.queryTemplates.list(e)}listExtendedActions(e){return this.extendedActions.list(e)}async resolveQueryTemplate(e,t,r){return{query:await this.queryTemplates.resolve(e,t,r.params)}}};jt([Qo("status"),U("design:type",Function),U("design:paramtypes",[]),U("design:returntype",Promise)],Oe.prototype,"status",null);jt([xc("preview-models"),Pc(200),ve(0,Ec(new I(jn))),U("design:type",Function),U("design:paramtypes",[Object]),U("design:returntype",Promise)],Oe.prototype,"previewAvailableModels",null);jt([Qo(":providerId/query-templates"),ve(0,gr("providerId")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Oe.prototype,"listQueryTemplates",null);jt([Qo(":providerId/actions"),ve(0,gr("providerId")),U("design:type",Function),U("design:paramtypes",[String]),U("design:returntype",Promise)],Oe.prototype,"listExtendedActions",null);jt([xc(":providerId/query-templates/:templateId/resolve"),Pc(200),ve(0,gr("providerId")),ve(1,gr("templateId")),ve(2,Ec(new I(an))),U("design:type",Function),U("design:paramtypes",[String,String,Object]),U("design:returntype",Promise)],Oe.prototype,"resolveQueryTemplate",null);Oe=jt([sm("providers"),ve(0,hr(Je)),ve(1,hr(Ue)),ve(2,hr(Me)),ve(3,hr(He)),U("design:paramtypes",[Je,Ue,Me,He])],Oe)});import{Body as am,Controller as cm,Get as um,Inject as dm,Patch as pm}from"@nestjs/common";var zo,it,Ac,vt,kc=d(()=>{"use strict";A();ge();ce();zo=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},it=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ac=function(n,e){return function(t,r){e(t,r,n)}},vt=class{settings;constructor(e){this.settings=e}get(){return this.settings.get()}async update(e){return{settings:await this.settings.update(e),restartRequired:$s(e)}}};zo([um(),it("design:type",Function),it("design:paramtypes",[]),it("design:returntype",Promise)],vt.prototype,"get",null);zo([pm(),Ac(0,am(new I(bn))),it("design:type",Function),it("design:paramtypes",[Object]),it("design:returntype",Promise)],vt.prototype,"update",null);vt=zo([cm("settings"),Ac(0,dm(x)),it("design:paramtypes",[x])],vt)});function Xo(n){let{current:e,instance:t,defaultAgent:r,isCreate:o}=n;return ft(t)?r===!0?t.id:r===!1?e===t.id?null:e??null:o&&!e?t.id:e??null:e===t.id?null:e??null}function Tc(n){let{defaultAgent:e,...t}=n;return t}var Oc=d(()=>{"use strict";A()});import{Body as qc,Controller as lm,Delete as fm,Get as $c,HttpCode as mm,Inject as hm,Param as Zo,Patch as gm,Post as ym}from"@nestjs/common";var xt,M,_t,qe,Cc=d(()=>{"use strict";A();ge();R();ce();Oc();xt=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},M=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},_t=function(n,e){return function(t,r){e(t,r,n)}},qe=class{settings;constructor(e){this.settings=e}async list(){return(await this.settings.get()).providerInstances??[]}async get(e){let t=(await this.settings.get()).providerInstances?.find(r=>r.id===e);if(!t)throw new g(`Provider instance not found: ${e}`);return t}async create(e){let t=Tc(e),r=await this.settings.get(),o=[...r.providerInstances??[]];if(o.some(s=>s.id===t.id))throw new et(`Provider instance already exists: ${t.id}`);return o.push(t),{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Xo({current:r.defaultAgentInstanceId,instance:t,defaultAgent:e.defaultAgent,isCreate:!0})}),restartRequired:!0}}async update(e,t){let r=await this.settings.get(),o=[...r.providerInstances??[]],i=o.findIndex(c=>c.id===e);if(i<0)throw new g(`Provider instance not found: ${e}`);let a={...o[i],...t.displayName!=null?{displayName:t.displayName}:{},...t.config!=null?{config:t.config}:{},...t.secretKey!=null?{secretKey:t.secretKey}:{}};return t.expiresOn!==void 0&&(t.expiresOn?a.expiresOn=t.expiresOn:delete a.expiresOn),o[i]=a,{settings:await this.settings.update({providerInstances:o,defaultAgentInstanceId:Xo({current:r.defaultAgentInstanceId,instance:a,defaultAgent:t.defaultAgent,isCreate:!1})}),restartRequired:!0}}async remove(e){let t=await this.settings.get(),r=(t.providerInstances??[]).filter(s=>s.id!==e);if(r.length===(t.providerInstances??[]).length)throw new g(`Provider instance not found: ${e}`);let o=t.defaultAgentInstanceId===e?null:t.defaultAgentInstanceId??null;return{settings:await this.settings.update({providerInstances:r,defaultAgentInstanceId:o}),restartRequired:!0}}};xt([$c(),M("design:type",Function),M("design:paramtypes",[]),M("design:returntype",Promise)],qe.prototype,"list",null);xt([$c(":id"),_t(0,Zo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],qe.prototype,"get",null);xt([ym(),_t(0,qc(new I(Sn))),M("design:type",Function),M("design:paramtypes",[Object]),M("design:returntype",Promise)],qe.prototype,"create",null);xt([gm(":id"),_t(0,Zo("id")),_t(1,qc(new I(In))),M("design:type",Function),M("design:paramtypes",[String,Object]),M("design:returntype",Promise)],qe.prototype,"update",null);xt([fm(":id"),mm(200),_t(0,Zo("id")),M("design:type",Function),M("design:paramtypes",[String]),M("design:returntype",Promise)],qe.prototype,"remove",null);qe=xt([lm("provider-instances"),_t(0,hm(x)),M("design:paramtypes",[x])],qe)});import{Body as wm,Controller as bm,HttpCode as Sm,Inject as Im,Param as jm,Post as vm}from"@nestjs/common";var Dc,yr,Yo,Qt,Bc=d(()=>{"use strict";_e();R();ce();Lo();Dc=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},yr=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Yo=function(n,e){return function(t,r){e(t,r,n)}},Qt=class{secrets;constructor(e){this.secrets=e}async set(e,t){let r=e.trim();if(!r)throw new h("Secret key must not be empty");await this.secrets.set(r,t.value)}};Dc([vm(":key"),Sm(204),Yo(0,jm("key")),Yo(1,wm(new I(lr))),yr("design:type",Function),yr("design:paramtypes",[String,Object]),yr("design:returntype",Promise)],Qt.prototype,"set",null);Qt=Dc([bm("secrets"),Yo(0,Im(oe)),yr("design:paramtypes",[Function])],Qt)});import{Module as xm}from"@nestjs/common";import{APP_FILTER as Em}from"@nestjs/core";var _m,wr,Nc=d(()=>{"use strict";Nt();xo();Qn();Ma();Qa();Xa();tc();ic();ac();dc();mc();_c();Rc();kc();Cc();Bc();Wn();Or();_m=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},wr=class{};wr=_m([xm({imports:[ye,bt,Ke,Le,at],controllers:[Ae,de,Ie,je,Qe,Te,Vt,Gt,Oe,vt,qe,Qt],providers:[{provide:Em,useClass:er}]})],wr)});import{Module as Rm}from"@nestjs/common";var Pm,br,Fc=d(()=>{"use strict";ri();oi();ii();Wn();_a();Qn();Nt();xo();Nc();Pm=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},br=class{};br=Pm([Rm({imports:[zt,Xt,Le,Vn,Ke,ye,bt,wr],controllers:[Et]})],br)});import{apiReference as Am}from"@scalar/nestjs-api-reference";function Jc(n){n.use("/api/docs",Am({url:"/api/openapi.json",pageTitle:"Knoflows Engine API"}))}var Uc=d(()=>{"use strict"});import{createServer as km}from"node:net";function Mc(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="EADDRINUSE"}async function ei(n,e=20){for(let t=0;t<e;t+=1){let r=n+t;if(await Tm(r))return r}throw new Error(`No free port found in ${n}\u2013${n+e-1}`)}function Tm(n){return new Promise(e=>{let t=km();t.once("error",()=>{e(!1)}),t.once("listening",()=>{t.close(()=>e(!0))}),t.listen(n)})}var Hc=d(()=>{"use strict"});import{Catch as $m,HttpStatus as Sr,NotFoundException as Cm}from"@nestjs/common";import{existsSync as Lc,statSync as Dm}from"node:fs";import{extname as Kc,join as ti,normalize as Bm,relative as Nm,sep as Fm}from"node:path";function Wc(n){return(e,t,r)=>{if(e.method!=="GET"&&e.method!=="HEAD"){r();return}if((e.path??"").startsWith("/api")){r();return}let o=Jm(e.path??"/");if(o){let i=ti(n,o);if(Um(n,i)){t.sendFile(o,{root:n},s=>{s&&r()});return}}if(Vc(e)){Gc(t,n,i=>{i&&!t.headersSent&&t.status(Sr.NOT_FOUND).end()});return}t.status(Sr.NOT_FOUND).end()}}function Vc(n){if(n.method!=="GET"&&n.method!=="HEAD")return!1;let e=n.path??"";if(e.startsWith("/api"))return!1;let t=Kc(e);return!(t&&t!==".html")}function Gc(n,e,t){n.sendFile("index.html",{root:e},t)}function Jm(n){if(n==="/"||n==="")return"index.html";let e=Bm(n.replace(/^\/+/,""));return!e||e==="."||e.startsWith("..")||!Kc(e)?null:e}function Um(n,e){if(!Lc(e))return!1;try{if(!Dm(e).isFile())return!1}catch{return!1}let t=Nm(n,e);return t!==""&&!t.startsWith(`..${Fm}`)&&!t.startsWith("..")}function Qc(n){return ti(n,"index.html")}var Om,qm,Ir,zc=d(()=>{"use strict";Om=function(n,e,t,r){var o=arguments.length,i=o<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(n,e,t,r);else for(var a=n.length-1;a>=0;a--)(s=n[a])&&(i=(o<3?s(i):o>3?s(e,t,i):s(e,t))||i);return o>3&&i&&Object.defineProperty(e,t,i),i},qm=function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Ir=class{staticRoot;constructor(e){this.staticRoot=e}catch(e,t){let r=t.switchToHttp(),o=r.getRequest(),i=r.getResponse();if(Vc(o)&&Lc(ti(this.staticRoot,"index.html"))){Gc(i,this.staticRoot,u=>{u&&!i.headersSent&&i.status(Sr.NOT_FOUND).json({statusCode:Sr.NOT_FOUND,message:"UI index.html could not be served"})});return}let s=e.getStatus(),a=e.getResponse();i.status(s).json(typeof a=="string"?{statusCode:s,message:a}:a)}};Ir=Om([$m(Cm),qm("design:paramtypes",[String])],Ir)});import{existsSync as Mm}from"node:fs";import{dirname as Hm,join as jr}from"node:path";import{fileURLToPath as Lm}from"node:url";function Xc(){let n=Hm(Lm(import.meta.url)),e=[jr(n,"../static"),jr(n,"../../static"),jr(n,"static")];for(let t of e)if(Mm(jr(t,"index.html")))return t;return null}var Zc=d(()=>{"use strict"});var Qm={};import"reflect-metadata";import{existsSync as Km}from"node:fs";import{Logger as Wm}from"@nestjs/common";import{NestFactory as Vm}from"@nestjs/core";async function Gm(){let n=await Vm.create(br);n.enableCors(),n.setGlobalPrefix("api"),Jc(n);let e=Xc(),t=e?Qc(e):null;e&&t&&Km(t)?(vr.log(`Serving UI from ${e}`),n.use(Wc(e)),n.useGlobalFilters(new Ir(e))):vr.warn("No UI found (static/index.html missing). GET / will 404; /api still works. Rebuild with `npm run build:release` before publishing.");let r=Number(process.env.PORT??3e3);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`Invalid PORT: ${process.env.PORT}`);let o=await ei(r);for(let i=0;i<5;i+=1)try{await n.listen(o),o!==r?vr.warn(`Port ${r} is in use; listening on ${o} instead`):vr.log(`Listening on http://localhost:${o}`);return}catch(s){if(!Mc(s))throw s;o=await ei(o+1)}throw new Error(`Could not bind a free port starting at ${r}`)}var vr,Yc=d(()=>{"use strict";Fc();Uc();Hc();zc();Zc();vr=new Wm("Bootstrap");Gm()});import{readFileSync as zm}from"node:fs";function Xm(){let n=zm(new URL("../package.json",import.meta.url),"utf8");return JSON.parse(n).version}var _r=process.argv.slice(2);_r.includes("--version")||_r.includes("-v")?console.log(Xm()):_r.includes("--help")||_r.includes("-h")?console.log(["Usage: knoflows [options]","","Starts the knoflows engine (REST API + bundled web client).","","Options:"," -v, --version Print the engine version and exit"," -h, --help Print this message and exit","","Environment:"," PORT Preferred HTTP port (default 3000). If taken, the next free port is used."," KNO_SQLITE_PATH SQLite file path, or :memory: for an ephemeral database"].join(`
|
|
23
|
+
`)):await Promise.resolve().then(()=>(Yc(),Qm));
|