@ngocsangairvds/vsaf 6.0.1 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/commands/run.d.ts +3 -0
  3. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  4. package/packages/cli/dist/commands/run.js +10 -0
  5. package/packages/cli/dist/commands/run.js.map +1 -1
  6. package/packages/cli/dist/server/routes/runs.d.ts +3 -1
  7. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  8. package/packages/cli/dist/server/routes/runs.js +33 -9
  9. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  10. package/packages/cli/dist/server/routes/workflows.js +1 -1
  11. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  12. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  13. package/packages/cli/dist/server/services/execution-manager.js +5 -0
  14. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  15. package/packages/core/dist/config/ai-config.d.ts +3 -0
  16. package/packages/core/dist/config/ai-config.d.ts.map +1 -1
  17. package/packages/core/dist/config/ai-config.js +9 -0
  18. package/packages/core/dist/config/ai-config.js.map +1 -1
  19. package/packages/core/dist/index.d.ts +1 -1
  20. package/packages/core/dist/index.d.ts.map +1 -1
  21. package/packages/core/dist/index.js +3 -2
  22. package/packages/core/dist/index.js.map +1 -1
  23. package/packages/core/dist/runtime/executor.d.ts.map +1 -1
  24. package/packages/core/dist/runtime/executor.js +1 -0
  25. package/packages/core/dist/runtime/executor.js.map +1 -1
  26. package/packages/web/dist/web/browser/{chunk-FE2VGLSN.js → chunk-7L4OEPXU.js} +1 -1
  27. package/packages/web/dist/web/browser/{chunk-FBCNCNPM.js → chunk-BDLVJ3JS.js} +1 -1
  28. package/packages/web/dist/web/browser/{chunk-MCW5ACIZ.js → chunk-CQQRQYJU.js} +1 -1
  29. package/packages/web/dist/web/browser/{chunk-6H3AYIT3.js → chunk-E3BSTPAZ.js} +1 -1
  30. package/packages/web/dist/web/browser/{chunk-L7B3BT5E.js → chunk-IBUECISR.js} +1 -1
  31. package/packages/web/dist/web/browser/{chunk-7ELOO4IC.js → chunk-OYL4KDHJ.js} +1 -1
  32. package/packages/web/dist/web/browser/{chunk-GR7SKUVU.js → chunk-Q6S2YOXT.js} +1 -1
  33. package/packages/web/dist/web/browser/chunk-RM7DW5FD.js +5 -0
  34. package/packages/web/dist/web/browser/chunk-SM2S63GA.js +1 -0
  35. package/packages/web/dist/web/browser/{chunk-N3FOQ3O5.js → chunk-ZZWA24BS.js} +1 -1
  36. package/packages/web/dist/web/browser/index.html +2 -2
  37. package/packages/web/dist/web/browser/{main-3UCJ3N4F.js → main-MOJ6YEDN.js} +1 -1
  38. package/packages/web/dist/web/browser/styles-KOJ4NEWT.css +1 -0
  39. package/skills/sdlc/onboard-code/cross-domain/SKILL.md +10 -0
  40. package/skills/sdlc/onboard-code/cross-domain/step.md +11 -0
  41. package/skills/sdlc/onboard-code/detect-structure/SKILL.md +10 -0
  42. package/skills/sdlc/onboard-code/detect-structure/step.md +7 -0
  43. package/skills/sdlc/onboard-code/env-docker/SKILL.md +10 -0
  44. package/skills/sdlc/onboard-code/env-docker/step.md +7 -0
  45. package/skills/sdlc/onboard-code/summary/SKILL.md +10 -0
  46. package/skills/sdlc/onboard-code/summary/step.md +4 -0
  47. package/skills/sdlc/onboard-code/verify-index/SKILL.md +10 -0
  48. package/skills/sdlc/onboard-code/verify-index/step.md +9 -0
  49. package/skills/sdlc/onboard-docs/extract-terms/SKILL.md +10 -0
  50. package/skills/sdlc/onboard-docs/extract-terms/step.md +20 -0
  51. package/skills/sdlc/onboard-docs/graphify-build/SKILL.md +10 -0
  52. package/skills/sdlc/onboard-docs/graphify-build/step.md +11 -0
  53. package/skills/sdlc/onboard-docs/scan-import/SKILL.md +10 -0
  54. package/skills/sdlc/onboard-docs/scan-import/step.md +19 -0
  55. package/skills/sdlc/onboard-docs/verify-fix/SKILL.md +10 -0
  56. package/skills/sdlc/onboard-docs/verify-fix/step.md +10 -0
  57. package/skills/sdlc/pack.yaml +9 -2
  58. package/workflows/sdlc/onboard-code.yaml +5 -43
  59. package/workflows/sdlc/onboard-docs.yaml +4 -64
  60. package/packages/web/dist/web/browser/chunk-4R37VVI4.js +0 -5
  61. package/packages/web/dist/web/browser/chunk-UDCOYDXU.js +0 -1
  62. package/packages/web/dist/web/browser/styles-5MTP4CCO.css +0 -1
  63. package/skills/sdlc/onboard-code/SKILL.md +0 -210
  64. package/skills/sdlc/onboard-docs/SKILL.md +0 -194
  65. /package/skills/sdlc/onboard-docs/{convert.py → scan-import/convert.py} +0 -0
@@ -14,8 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.detectCycle = exports.VSAF_SQLITE_SCHEMA = exports.SqliteWorkflowStore = exports.RunStore = exports.ArtifactStore = exports.resolveIsolationPlan = exports.WorkspaceManager = exports.loadSkill = exports.buildPrompt = exports.loadCommand = exports.GeminiAgyAdapter = exports.AntigravityAdapter = exports.MockProvider = exports.OpenAIAPIAdapter = exports.GeminiAPIAdapter = exports.AnthropicAPIAdapter = exports.ClaudeCodeAdapter = exports.resolveNodeProviderConfig = exports.createBuiltinCommandProvider = exports.createCommandProvidersFromConfig = exports.ProviderCommandError = exports.CommandProviderAdapter = exports.ProviderRegistry = exports.evaluateCondition = exports.resolveVariables = exports.NodeRunner = exports.detectCompletionSignal = exports.DAGExecutor = exports.expandWorkflowYaml = exports.parseWorkflow = exports.DEFAULT_TELEMETRY_ENDPOINT = exports.TELEMETRY_NOTICE_FILE = exports.TELEMETRY_ID_FILE = exports.buildWorkflowEventProperties = exports.sanitizeModelName = exports.captureEvent = exports.resolveTelemetryEndpoint = exports.getTelemetryStatus = exports.resetTelemetryId = exports.getTelemetryId = exports.TIER_NAMES = exports.isTierName = exports.vsafHome = exports.resolveModelRef = exports.unsetAlias = exports.setAlias = exports.unsetTier = exports.setTier = exports.loadAiConfig = exports.loadConfig = void 0;
18
- exports.safeReadSync = exports.atomicWriteSync = exports.loadSnapshot = exports.writeSnapshot = exports.prepareStateForRetry = exports.recoverState = exports.RunLock = exports.WAL = exports.validateWorkflowSchema = exports.validateInputs = exports.validateOutputFormat = void 0;
17
+ exports.VSAF_SQLITE_SCHEMA = exports.SqliteWorkflowStore = exports.RunStore = exports.ArtifactStore = exports.resolveIsolationPlan = exports.WorkspaceManager = exports.loadSkill = exports.buildPrompt = exports.loadCommand = exports.GeminiAgyAdapter = exports.AntigravityAdapter = exports.MockProvider = exports.OpenAIAPIAdapter = exports.GeminiAPIAdapter = exports.AnthropicAPIAdapter = exports.ClaudeCodeAdapter = exports.resolveNodeProviderConfig = exports.createBuiltinCommandProvider = exports.createCommandProvidersFromConfig = exports.ProviderCommandError = exports.CommandProviderAdapter = exports.ProviderRegistry = exports.evaluateCondition = exports.resolveVariables = exports.NodeRunner = exports.detectCompletionSignal = exports.DAGExecutor = exports.expandWorkflowYaml = exports.parseWorkflow = exports.DEFAULT_TELEMETRY_ENDPOINT = exports.TELEMETRY_NOTICE_FILE = exports.TELEMETRY_ID_FILE = exports.buildWorkflowEventProperties = exports.sanitizeModelName = exports.captureEvent = exports.resolveTelemetryEndpoint = exports.getTelemetryStatus = exports.resetTelemetryId = exports.getTelemetryId = exports.TIER_NAMES = exports.isTierName = exports.vsafHome = exports.assertValidModel = exports.resolveModelRef = exports.unsetAlias = exports.setAlias = exports.unsetTier = exports.setTier = exports.loadAiConfig = exports.loadConfig = void 0;
18
+ exports.safeReadSync = exports.atomicWriteSync = exports.loadSnapshot = exports.writeSnapshot = exports.prepareStateForRetry = exports.recoverState = exports.RunLock = exports.WAL = exports.validateWorkflowSchema = exports.validateInputs = exports.validateOutputFormat = exports.detectCycle = void 0;
19
19
  __exportStar(require("./types/index.js"), exports);
20
20
  __exportStar(require("./store/types.js"), exports);
21
21
  __exportStar(require("./runtime/index.js"), exports);
@@ -28,6 +28,7 @@ Object.defineProperty(exports, "unsetTier", { enumerable: true, get: function ()
28
28
  Object.defineProperty(exports, "setAlias", { enumerable: true, get: function () { return ai_config_js_1.setAlias; } });
29
29
  Object.defineProperty(exports, "unsetAlias", { enumerable: true, get: function () { return ai_config_js_1.unsetAlias; } });
30
30
  Object.defineProperty(exports, "resolveModelRef", { enumerable: true, get: function () { return ai_config_js_1.resolveModelRef; } });
31
+ Object.defineProperty(exports, "assertValidModel", { enumerable: true, get: function () { return ai_config_js_1.assertValidModel; } });
31
32
  Object.defineProperty(exports, "vsafHome", { enumerable: true, get: function () { return ai_config_js_1.vsafHome; } });
32
33
  Object.defineProperty(exports, "isTierName", { enumerable: true, get: function () { return ai_config_js_1.isTierName; } });
33
34
  Object.defineProperty(exports, "TIER_NAMES", { enumerable: true, get: function () { return ai_config_js_1.TIER_NAMES; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AAEnC,8DAA8F;AAArF,8GAAA,UAAU,OAAA;AACnB,sDAa+B;AAZ7B,4GAAA,YAAY,OAAA;AACZ,uGAAA,OAAO,OAAA;AACP,yGAAA,SAAS,OAAA;AACT,wGAAA,QAAQ,OAAA;AACR,0GAAA,UAAU,OAAA;AACV,+GAAA,eAAe,OAAA;AACf,wGAAA,QAAQ,OAAA;AACR,0GAAA,UAAU,OAAA;AACV,0GAAA,UAAU,OAAA;AAKZ,yDAakC;AAZhC,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,kHAAA,kBAAkB,OAAA;AAClB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,iHAAA,iBAAiB,OAAA;AACjB,4HAAA,4BAA4B,OAAA;AAC5B,iHAAA,iBAAiB,OAAA;AACjB,qHAAA,qBAAqB,OAAA;AACrB,0HAAA,0BAA0B,OAAA;AAI5B,wDAAuD;AAA9C,8GAAA,aAAa,OAAA;AACtB,kEAAiE;AAAxD,wHAAA,kBAAkB,OAAA;AAC3B,4DASkC;AARhC,8GAAA,WAAW,OAAA;AASb,0DAAiE;AAAxD,wHAAA,sBAAsB,OAAA;AAC/B,0DAA0E;AAAjE,4GAAA,UAAU,OAAA;AACnB,sEAAuF;AAA9E,wHAAA,gBAAgB,OAAA;AACzB,0EAAoE;AAA3D,2HAAA,iBAAiB,OAAA;AAC1B,yEAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,uEASyC;AARvC,6HAAA,sBAAsB,OAAA;AACtB,2HAAA,oBAAoB,OAAA;AACpB,uIAAA,gCAAgC,OAAA;AAChC,mIAAA,4BAA4B,OAAA;AAC5B,gIAAA,yBAAyB,OAAA;AAK3B,uEAQyC;AAPvC,wHAAA,iBAAiB,OAAA;AACjB,0HAAA,mBAAmB,OAAA;AACnB,uHAAA,gBAAgB,OAAA;AAChB,uHAAA,gBAAgB,OAAA;AAChB,mHAAA,YAAY,OAAA;AACZ,yHAAA,kBAAkB,OAAA;AAClB,uHAAA,gBAAgB,OAAA;AAElB,kEAAyE;AAAhE,gHAAA,WAAW,OAAA;AACpB,kEAA2D;AAAlD,gHAAA,WAAW,OAAA;AACpB,4DAAiE;AAAxD,4GAAA,SAAS,OAAA;AAClB,yEAAqG;AAA5F,wHAAA,gBAAgB,OAAA;AACzB,uEAMyC;AALvC,2HAAA,oBAAoB,OAAA;AAMtB,mEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,qDAAgD;AAAvC,wGAAA,QAAQ,OAAA;AACjB,6EAU0C;AATxC,+HAAA,mBAAmB,OAAA;AAUrB,6DAA8D;AAArD,sHAAA,kBAAkB,OAAA;AAC3B,gEAAyD;AAAhD,gHAAA,WAAW,OAAA;AACpB,wEAAsF;AAA7E,6HAAA,oBAAoB,OAAA;AAAE,uHAAA,cAAc,OAAA;AAC7C,wDAAgE;AAAvD,uHAAA,sBAAsB,OAAA;AAC/B,yCAAqC;AAA5B,6FAAA,GAAG,OAAA;AACZ,mDAA8C;AAArC,sGAAA,OAAO,OAAA;AAChB,mDAAyE;AAAhE,2GAAA,YAAY,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAC3C,mDAAkE;AAAzD,4GAAA,aAAa,OAAA;AAAE,2GAAA,YAAY,OAAA;AACpC,+CAAkE;AAAzD,4GAAA,eAAe,OAAA;AAAE,yGAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AAEnC,8DAA8F;AAArF,8GAAA,UAAU,OAAA;AACnB,sDAc+B;AAb7B,4GAAA,YAAY,OAAA;AACZ,uGAAA,OAAO,OAAA;AACP,yGAAA,SAAS,OAAA;AACT,wGAAA,QAAQ,OAAA;AACR,0GAAA,UAAU,OAAA;AACV,+GAAA,eAAe,OAAA;AACf,gHAAA,gBAAgB,OAAA;AAChB,wGAAA,QAAQ,OAAA;AACR,0GAAA,UAAU,OAAA;AACV,0GAAA,UAAU,OAAA;AAKZ,yDAakC;AAZhC,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,kHAAA,kBAAkB,OAAA;AAClB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,iHAAA,iBAAiB,OAAA;AACjB,4HAAA,4BAA4B,OAAA;AAC5B,iHAAA,iBAAiB,OAAA;AACjB,qHAAA,qBAAqB,OAAA;AACrB,0HAAA,0BAA0B,OAAA;AAI5B,wDAAuD;AAA9C,8GAAA,aAAa,OAAA;AACtB,kEAAiE;AAAxD,wHAAA,kBAAkB,OAAA;AAC3B,4DASkC;AARhC,8GAAA,WAAW,OAAA;AASb,0DAAiE;AAAxD,wHAAA,sBAAsB,OAAA;AAC/B,0DAA0E;AAAjE,4GAAA,UAAU,OAAA;AACnB,sEAAuF;AAA9E,wHAAA,gBAAgB,OAAA;AACzB,0EAAoE;AAA3D,2HAAA,iBAAiB,OAAA;AAC1B,yEAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,uEASyC;AARvC,6HAAA,sBAAsB,OAAA;AACtB,2HAAA,oBAAoB,OAAA;AACpB,uIAAA,gCAAgC,OAAA;AAChC,mIAAA,4BAA4B,OAAA;AAC5B,gIAAA,yBAAyB,OAAA;AAK3B,uEAQyC;AAPvC,wHAAA,iBAAiB,OAAA;AACjB,0HAAA,mBAAmB,OAAA;AACnB,uHAAA,gBAAgB,OAAA;AAChB,uHAAA,gBAAgB,OAAA;AAChB,mHAAA,YAAY,OAAA;AACZ,yHAAA,kBAAkB,OAAA;AAClB,uHAAA,gBAAgB,OAAA;AAElB,kEAAyE;AAAhE,gHAAA,WAAW,OAAA;AACpB,kEAA2D;AAAlD,gHAAA,WAAW,OAAA;AACpB,4DAAiE;AAAxD,4GAAA,SAAS,OAAA;AAClB,yEAAqG;AAA5F,wHAAA,gBAAgB,OAAA;AACzB,uEAMyC;AALvC,2HAAA,oBAAoB,OAAA;AAMtB,mEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,qDAAgD;AAAvC,wGAAA,QAAQ,OAAA;AACjB,6EAU0C;AATxC,+HAAA,mBAAmB,OAAA;AAUrB,6DAA8D;AAArD,sHAAA,kBAAkB,OAAA;AAC3B,gEAAyD;AAAhD,gHAAA,WAAW,OAAA;AACpB,wEAAsF;AAA7E,6HAAA,oBAAoB,OAAA;AAAE,uHAAA,cAAc,OAAA;AAC7C,wDAAgE;AAAvD,uHAAA,sBAAsB,OAAA;AAC/B,yCAAqC;AAA5B,6FAAA,GAAG,OAAA;AACZ,mDAA8C;AAArC,sGAAA,OAAO,OAAA;AAChB,mDAAyE;AAAhE,2GAAA,YAAY,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAC3C,mDAAkE;AAAzD,4GAAA,aAAa,OAAA;AAAE,2GAAA,YAAY,OAAA;AACpC,+CAAkE;AAAzD,4GAAA,eAAe,OAAA;AAAE,yGAAA,YAAY,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAqC,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGtG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,uBAAuB;IAMtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEK,OAAO,EAAE,8BAA8B;IAc9D,GAAG,CAAC,KAAK,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ3D,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAO9D,KAAK;YAwBL,gBAAgB;IAmB9B,OAAO,CAAC,oBAAoB;CAS7B;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAQ7E"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAqC,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGtG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,uBAAuB;IAMtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEK,OAAO,EAAE,8BAA8B;IAc9D,GAAG,CAAC,KAAK,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ3D,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAO9D,KAAK;YAwBL,gBAAgB;IAoB9B,OAAO,CAAC,oBAAoB;CAS7B;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAQ7E"}
@@ -62,6 +62,7 @@ class RuntimeWorkflowExecutor {
62
62
  const runtimeNode = this.options.workflow.nodes.find((candidate) => candidate.id === node.nodeId);
63
63
  const resolved = this.resolveProviderModel(node, runtimeNode);
64
64
  const provider = this.providerRegistry.get(resolved.provider);
65
+ (0, ai_config_js_1.assertValidModel)(resolved.model);
65
66
  const result = await provider.execute(node.prompt, {
66
67
  model: resolved.model,
67
68
  cwd: this.options.workspacePath ?? this.options.projectPath,
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import{b as D,d as T,e as L}from"./chunk-N3FOQ3O5.js";import{a as F,b as V,c as A,d as H,e as K,f as z,j as W,k as B}from"./chunk-7ELOO4IC.js";import{Ba as S,Ka as x,La as g,Ma as f,O as u,Oa as v,Pa as C,Qa as _,Qb as R,Ra as o,Sa as a,T as y,U as h,Xa as k,Ya as w,Za as d,da as m,gb as O,ib as r,jb as p,lb as P,mb as I,nb as E,ob as N,qa as s}from"./chunk-4R37VVI4.js";function $(t){let n=t.metadata?.category;return n==="gate"?"gate":n==="workflow_status"?"status":"text"}function j(t){return t.title?t.title:t.runs.length>0?t.runs[0].workflow_name:t.id}function b(t){return t.runs.length?t.runs[t.runs.length-1].id:void 0}var M=(t,n)=>n.id;function q(t,n){t&1&&(o(0,"p",2),r(1,"No conversations yet. Start a run or send a message."),a())}function J(t,n){if(t&1&&(o(0,"span",8),r(1),a()),t&2){let e=n.$implicit;x("data-status",e.status),s(),P("",e.workflow_name," \xB7 ",e.status)}}function Q(t,n){if(t&1&&(o(0,"a",5)(1,"span",6),r(2),a(),o(3,"span",7),v(4,J,2,3,"span",8,M),a()()),t&2){let e=n.$implicit,i=d();O("active",e.id===i.selectedId()),_("routerLink",i.linkFor(e)),s(2),p(i.label(e)),s(2),C(e.runs)}}function X(t,n){t&1&&(o(0,"p",2),r(1,"Select a conversation to view its messages."),a())}function Y(t,n){if(t&1&&(o(0,"div",10)(1,"span",15),r(2),a(),o(3,"p",16),r(4),a()()),t&2){let e=n.$implicit,i=d(2);x("data-role",e.role)("data-kind",i.kind(e)),s(2),p(e.role),s(2),p(e.content)}}function Z(t,n){if(t&1&&(o(0,"p",14),r(1),a()),t&2){let e=d(2);s(),p(e.lastReply())}}function ee(t,n){if(t&1){let e=k();o(0,"div",9),v(1,Y,5,4,"div",10,M),a(),o(3,"form",11),w("ngSubmit",function(){y(e);let l=d();return h(l.send())}),o(4,"input",12),N("ngModelChange",function(l){y(e);let c=d();return E(c.draft,l)||(c.draft=l),h(l)}),a(),o(5,"button",13),r(6,"Send"),a()(),g(7,Z,2,1,"p",14)}if(t&2){let e=d();s(),C(e.messages()),s(3),I("ngModel",e.draft),_("disabled",e.sending()),s(),_("disabled",e.sending()||!e.draft.trim()),s(2),f(e.lastReply()?7:-1)}}var G=class t{api=u(B);route=u(D);router=u(T);pollHandle;paramSub;conversations=m([]);messages=m([]);selectedId=m(null);sending=m(!1);lastReply=m("");draft="";ngOnInit(){this.paramSub=this.route.paramMap.subscribe(n=>{let e=n.get("conversationId");this.selectedId.set(e),this.refresh(),e&&this.api.listConversations().subscribe(i=>{let l=i.conversations.find(U=>U.id===e),c=l?b(l):void 0;c&&this.router.navigate(["/runs",c],{replaceUrl:!0})})}),this.pollHandle=setInterval(()=>this.refreshMessages(),4e3)}ngOnDestroy(){this.pollHandle&&clearInterval(this.pollHandle),this.paramSub?.unsubscribe()}label=j;kind=$;linkFor(n){let e=b(n);return e?["/runs",e]:["/conversations",n.id]}refresh(){this.api.listConversations().subscribe(n=>this.conversations.set(n.conversations)),this.refreshMessages()}refreshMessages(){let n=this.selectedId();n&&this.api.getConversationMessages(n).subscribe({next:e=>this.messages.set(e.messages),error:()=>this.messages.set([])})}send(){let n=this.selectedId(),e=this.draft.trim();!n||!e||(this.sending.set(!0),this.api.sendConversationMessage(n,e).subscribe({next:i=>{this.lastReply.set(i.reply),this.draft="",this.sending.set(!1),this.refresh()},error:()=>this.sending.set(!1)}))}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=S({type:t,selectors:[["app-conversations"]],decls:10,vars:2,consts:[[1,"conversations-layout"],[1,"conversations-sidebar"],[1,"empty"],[1,"conversation-item",3,"active","routerLink"],[1,"chat-panel"],[1,"conversation-item",3,"routerLink"],[1,"conversation-title"],[1,"conversation-meta"],[1,"run-chip"],[1,"message-list"],[1,"message"],[1,"message-input",3,"ngSubmit"],["type","text","name","draft","placeholder","Reply to the paused run or leave a note\u2026","aria-label","Message",3,"ngModelChange","ngModel","disabled"],["type","submit",3,"disabled"],[1,"chat-hint"],[1,"message-role"],[1,"message-content"]],template:function(e,i){e&1&&(o(0,"div",0)(1,"aside",1)(2,"h2"),r(3,"Conversations"),a(),g(4,q,2,0,"p",2),v(5,Q,6,4,"a",3,M),a(),o(7,"section",4),g(8,X,2,0,"p",2)(9,ee,8,4),a()()),e&2&&(s(4),f(i.conversations().length===0?4:-1),s(),C(i.conversations()),s(3),f(i.selectedId()?9:8))},dependencies:[R,W,z,F,V,A,K,H,L],styles:[".conversations-layout[_ngcontent-%COMP%]{display:flex;gap:1rem;min-height:70vh}.conversations-sidebar[_ngcontent-%COMP%]{width:280px;border-right:1px solid var(--border-color, #333);padding-right:1rem}.conversation-item[_ngcontent-%COMP%]{display:block;padding:.5rem;border-radius:6px;text-decoration:none;color:inherit}.conversation-item.active[_ngcontent-%COMP%]{background:#8080ff1f}.conversation-title[_ngcontent-%COMP%]{display:block;font-weight:600}.run-chip[_ngcontent-%COMP%]{font-size:.75rem;opacity:.75;margin-right:.5rem}.chat-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column}.message-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:.5rem}.message[_ngcontent-%COMP%]{max-width:70%;padding:.5rem .75rem;border-radius:8px;background:#8080801f}.message[data-role=user][_ngcontent-%COMP%]{align-self:flex-end;background:#5078ff2e}.message[data-kind=gate][_ngcontent-%COMP%]{border-left:3px solid orange}.message[data-kind=status][_ngcontent-%COMP%]{opacity:.8;font-style:italic}.message-role[_ngcontent-%COMP%]{font-size:.7rem;text-transform:uppercase;opacity:.6}.message-content[_ngcontent-%COMP%]{margin:.25rem 0 0;white-space:pre-wrap}.message-input[_ngcontent-%COMP%]{display:flex;gap:.5rem;margin-top:1rem}.message-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1}.empty[_ngcontent-%COMP%]{opacity:.7;padding:1rem 0}.chat-hint[_ngcontent-%COMP%]{opacity:.7;font-size:.85rem}"]})};export{G as ConversationsComponent};
1
+ import{b as D,d as T,e as L}from"./chunk-ZZWA24BS.js";import{a as F,b as V,c as A,d as H,e as K,f as z,j as W,k as B}from"./chunk-OYL4KDHJ.js";import{Ba as S,Ka as x,La as g,Ma as f,O as u,Oa as v,Pa as C,Qa as _,Ra as o,Rb as R,Sa as a,T as y,U as h,Xa as k,Ya as w,Za as d,da as m,gb as O,ib as r,jb as p,lb as P,nb as I,ob as E,pb as N,qa as s}from"./chunk-RM7DW5FD.js";function $(t){let n=t.metadata?.category;return n==="gate"?"gate":n==="workflow_status"?"status":"text"}function j(t){return t.title?t.title:t.runs.length>0?t.runs[0].workflow_name:t.id}function b(t){return t.runs.length?t.runs[t.runs.length-1].id:void 0}var M=(t,n)=>n.id;function q(t,n){t&1&&(o(0,"p",2),r(1,"No conversations yet. Start a run or send a message."),a())}function J(t,n){if(t&1&&(o(0,"span",8),r(1),a()),t&2){let e=n.$implicit;x("data-status",e.status),s(),P("",e.workflow_name," \xB7 ",e.status)}}function Q(t,n){if(t&1&&(o(0,"a",5)(1,"span",6),r(2),a(),o(3,"span",7),v(4,J,2,3,"span",8,M),a()()),t&2){let e=n.$implicit,i=d();O("active",e.id===i.selectedId()),_("routerLink",i.linkFor(e)),s(2),p(i.label(e)),s(2),C(e.runs)}}function X(t,n){t&1&&(o(0,"p",2),r(1,"Select a conversation to view its messages."),a())}function Y(t,n){if(t&1&&(o(0,"div",10)(1,"span",15),r(2),a(),o(3,"p",16),r(4),a()()),t&2){let e=n.$implicit,i=d(2);x("data-role",e.role)("data-kind",i.kind(e)),s(2),p(e.role),s(2),p(e.content)}}function Z(t,n){if(t&1&&(o(0,"p",14),r(1),a()),t&2){let e=d(2);s(),p(e.lastReply())}}function ee(t,n){if(t&1){let e=k();o(0,"div",9),v(1,Y,5,4,"div",10,M),a(),o(3,"form",11),w("ngSubmit",function(){y(e);let l=d();return h(l.send())}),o(4,"input",12),N("ngModelChange",function(l){y(e);let c=d();return E(c.draft,l)||(c.draft=l),h(l)}),a(),o(5,"button",13),r(6,"Send"),a()(),g(7,Z,2,1,"p",14)}if(t&2){let e=d();s(),C(e.messages()),s(3),I("ngModel",e.draft),_("disabled",e.sending()),s(),_("disabled",e.sending()||!e.draft.trim()),s(2),f(e.lastReply()?7:-1)}}var G=class t{api=u(B);route=u(D);router=u(T);pollHandle;paramSub;conversations=m([]);messages=m([]);selectedId=m(null);sending=m(!1);lastReply=m("");draft="";ngOnInit(){this.paramSub=this.route.paramMap.subscribe(n=>{let e=n.get("conversationId");this.selectedId.set(e),this.refresh(),e&&this.api.listConversations().subscribe(i=>{let l=i.conversations.find(U=>U.id===e),c=l?b(l):void 0;c&&this.router.navigate(["/runs",c],{replaceUrl:!0})})}),this.pollHandle=setInterval(()=>this.refreshMessages(),4e3)}ngOnDestroy(){this.pollHandle&&clearInterval(this.pollHandle),this.paramSub?.unsubscribe()}label=j;kind=$;linkFor(n){let e=b(n);return e?["/runs",e]:["/conversations",n.id]}refresh(){this.api.listConversations().subscribe(n=>this.conversations.set(n.conversations)),this.refreshMessages()}refreshMessages(){let n=this.selectedId();n&&this.api.getConversationMessages(n).subscribe({next:e=>this.messages.set(e.messages),error:()=>this.messages.set([])})}send(){let n=this.selectedId(),e=this.draft.trim();!n||!e||(this.sending.set(!0),this.api.sendConversationMessage(n,e).subscribe({next:i=>{this.lastReply.set(i.reply),this.draft="",this.sending.set(!1),this.refresh()},error:()=>this.sending.set(!1)}))}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=S({type:t,selectors:[["app-conversations"]],decls:10,vars:2,consts:[[1,"conversations-layout"],[1,"conversations-sidebar"],[1,"empty"],[1,"conversation-item",3,"active","routerLink"],[1,"chat-panel"],[1,"conversation-item",3,"routerLink"],[1,"conversation-title"],[1,"conversation-meta"],[1,"run-chip"],[1,"message-list"],[1,"message"],[1,"message-input",3,"ngSubmit"],["type","text","name","draft","placeholder","Reply to the paused run or leave a note\u2026","aria-label","Message",3,"ngModelChange","ngModel","disabled"],["type","submit",3,"disabled"],[1,"chat-hint"],[1,"message-role"],[1,"message-content"]],template:function(e,i){e&1&&(o(0,"div",0)(1,"aside",1)(2,"h2"),r(3,"Conversations"),a(),g(4,q,2,0,"p",2),v(5,Q,6,4,"a",3,M),a(),o(7,"section",4),g(8,X,2,0,"p",2)(9,ee,8,4),a()()),e&2&&(s(4),f(i.conversations().length===0?4:-1),s(),C(i.conversations()),s(3),f(i.selectedId()?9:8))},dependencies:[R,W,z,F,V,A,K,H,L],styles:[".conversations-layout[_ngcontent-%COMP%]{display:flex;gap:1rem;min-height:70vh}.conversations-sidebar[_ngcontent-%COMP%]{width:280px;border-right:1px solid var(--border-color, #333);padding-right:1rem}.conversation-item[_ngcontent-%COMP%]{display:block;padding:.5rem;border-radius:6px;text-decoration:none;color:inherit}.conversation-item.active[_ngcontent-%COMP%]{background:#8080ff1f}.conversation-title[_ngcontent-%COMP%]{display:block;font-weight:600}.run-chip[_ngcontent-%COMP%]{font-size:.75rem;opacity:.75;margin-right:.5rem}.chat-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column}.message-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:.5rem}.message[_ngcontent-%COMP%]{max-width:70%;padding:.5rem .75rem;border-radius:8px;background:#8080801f}.message[data-role=user][_ngcontent-%COMP%]{align-self:flex-end;background:#5078ff2e}.message[data-kind=gate][_ngcontent-%COMP%]{border-left:3px solid orange}.message[data-kind=status][_ngcontent-%COMP%]{opacity:.8;font-style:italic}.message-role[_ngcontent-%COMP%]{font-size:.7rem;text-transform:uppercase;opacity:.6}.message-content[_ngcontent-%COMP%]{margin:.25rem 0 0;white-space:pre-wrap}.message-input[_ngcontent-%COMP%]{display:flex;gap:.5rem;margin-top:1rem}.message-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1}.empty[_ngcontent-%COMP%]{opacity:.7;padding:1rem 0}.chat-hint[_ngcontent-%COMP%]{opacity:.7;font-size:.85rem}"]})};export{G as ConversationsComponent};
@@ -1,4 +1,4 @@
1
- import{a as ge}from"./chunk-33F7AVPH.js";import{b as ie,d as oe,e as re}from"./chunk-N3FOQ3O5.js";import{a as ae,b as le,e as se,g as de,h as pe,i as ce,j as me,k as ue}from"./chunk-7ELOO4IC.js";import{$a as $,Ba as T,Fa as _,Ka as E,Lb as te,Mb as F,O as W,Pb as ne,Qa as m,Qb as z,Ra as o,Sa as r,T as g,Ta as B,U as f,V as Y,W as X,Xa as w,Ya as c,Za as u,_a as G,a as b,b as x,bb as I,cb as V,db as D,fb as M,gb as S,hb as J,ib as s,jb as h,kb as P,lb as A,mb as C,nb as v,ob as y,qa as d,rb as U,sb as Z,tb as ee}from"./chunk-4R37VVI4.js";var Ce={ratio:.5,leftCollapsed:!1,rightCollapsed:!1};function R(a,n=.15,e=.85){return Number.isNaN(a)?.5:Math.min(e,Math.max(n,a))}function fe(a,n=Ce){let e=x(b({},n),{rightCollapsed:n.rightCollapsed&&!n.leftCollapsed});try{let t=globalThis.localStorage?.getItem(a);if(!t)return b({},e);let i=JSON.parse(t),l=!!i.leftCollapsed;return{ratio:typeof i.ratio=="number"?R(i.ratio):e.ratio,leftCollapsed:l,rightCollapsed:!!i.rightCollapsed&&!l}}catch(t){return b({},e)}}function H(a,n){try{globalThis.localStorage?.setItem(a,JSON.stringify(n))}catch(e){}}function he(a,n){if(n==="left"){let t=!a.leftCollapsed;return x(b({},a),{leftCollapsed:t,rightCollapsed:t?!1:a.rightCollapsed})}let e=!a.rightCollapsed;return x(b({},a),{rightCollapsed:e,leftCollapsed:e?!1:a.leftCollapsed})}var Me=["host"],Se=[[["","sp-left",""]],[["","sp-right",""]]],Pe=["[sp-left]","[sp-right]"];function Oe(a,n){a&1&&(o(0,"div",8),$(1),r())}function Ee(a,n){if(a&1){let e=w();o(0,"div",9),c("mousedown",function(i){g(e);let l=u();return f(l.startDrag(i))}),r()}}function Ne(a,n){a&1&&(o(0,"div",8),$(1,1),r())}var L=class a{storageKey="split-pane";leftTitle="";rightTitle="";minPx=240;host;state={ratio:.5,leftCollapsed:!1,rightCollapsed:!1};dragging=!1;moveHandler;upHandler;ngOnInit(){this.state=fe(this.storageKey)}ngAfterViewInit(){queueMicrotask(()=>{let n=this.host?.nativeElement.getBoundingClientRect().width??0;if(n>0&&!this.state.leftCollapsed&&!this.state.rightCollapsed){let e=this.minPx/n,t=R(this.state.ratio,e,1-e);t!==this.state.ratio&&(this.state=x(b({},this.state),{ratio:t}))}})}leftBasis(){return this.state.leftCollapsed?"34px":this.state.rightCollapsed?"auto":this.state.ratio*100+"%"}toggle(n){this.state=he(this.state,n),H(this.storageKey,this.state)}startDrag(n){n.preventDefault(),this.dragging=!0,this.moveHandler=e=>{if(!this.dragging)return;let t=this.host.nativeElement.getBoundingClientRect();if(t.width<=0)return;let i=this.minPx/t.width;this.state=x(b({},this.state),{ratio:R((e.clientX-t.left)/t.width,i,1-i)})},this.upHandler=()=>this.endDrag(),document.addEventListener("mousemove",this.moveHandler),document.addEventListener("mouseup",this.upHandler),window.addEventListener("blur",this.upHandler)}endDrag(){this.dragging&&(this.dragging=!1,this.moveHandler&&document.removeEventListener("mousemove",this.moveHandler),this.upHandler&&(document.removeEventListener("mouseup",this.upHandler),window.removeEventListener("blur",this.upHandler)),this.moveHandler=this.upHandler=void 0,H(this.storageKey,this.state))}ngOnDestroy(){this.endDrag()}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=T({type:a,selectors:[["app-split-pane"]],viewQuery:function(e,t){if(e&1&&I(Me,7),e&2){let i;V(i=D())&&(t.host=i.first)}},inputs:{storageKey:"storageKey",leftTitle:"leftTitle",rightTitle:"rightTitle",minPx:"minPx"},ngContentSelectors:Pe,decls:17,vars:21,consts:[["host",""],[1,"sp"],[1,"sp-pane"],[1,"sp-hd"],[1,"sp-title"],["type","button",1,"sp-min",3,"click","title"],["class","sp-bd",4,"ngIf"],["class","sp-divider",3,"mousedown",4,"ngIf"],[1,"sp-bd"],[1,"sp-divider",3,"mousedown"]],template:function(e,t){e&1&&(G(Se),o(0,"div",1,0)(2,"div",2)(3,"div",3)(4,"span",4),s(5),r(),o(6,"button",5),c("click",function(){return t.toggle("left")}),s(7),r()(),_(8,Oe,2,0,"div",6),r(),_(9,Ee,1,0,"div",7),o(10,"div",2)(11,"div",3)(12,"span",4),s(13),r(),o(14,"button",5),c("click",function(){return t.toggle("right")}),s(15),r()(),_(16,Ne,2,0,"div",6),r()()),e&2&&(d(2),M("flex-basis",t.leftBasis())("flex-grow",t.state.leftCollapsed?0:t.state.rightCollapsed?1:0),S("collapsed",t.state.leftCollapsed),d(3),h(t.leftTitle),d(),m("title",t.state.leftCollapsed?"Restore":"Minimize"),E("aria-label",(t.state.leftCollapsed?"Restore ":"Minimize ")+t.leftTitle),d(),h(t.state.leftCollapsed?"\u25A3":"\u229F"),d(),m("ngIf",!t.state.leftCollapsed),d(),m("ngIf",!t.state.leftCollapsed&&!t.state.rightCollapsed),d(),M("flex-grow",1),S("collapsed",t.state.rightCollapsed),d(3),h(t.rightTitle),d(),m("title",t.state.rightCollapsed?"Restore":"Minimize"),E("aria-label",(t.state.rightCollapsed?"Restore ":"Minimize ")+t.rightTitle),d(),h(t.state.rightCollapsed?"\u25A3":"\u229F"),d(),m("ngIf",!t.state.rightCollapsed))},dependencies:[z,F],styles:['.sp[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;min-height:470px}.sp-pane[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0;border:1px solid #2b2d33;border-radius:8px;background:#15161b;overflow:hidden}.sp-pane.collapsed[_ngcontent-%COMP%]{flex:0 0 34px!important}.sp-hd[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 10px;border-bottom:1px solid #2b2d33;background:#17181d;font-size:12px;color:#a1a1aa}.sp-pane.collapsed[_ngcontent-%COMP%] .sp-hd[_ngcontent-%COMP%]{writing-mode:vertical-rl;border-bottom:0;border-right:1px solid #2b2d33;height:100%;justify-content:flex-start}.sp-title[_ngcontent-%COMP%]{font-weight:700;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sp-min[_ngcontent-%COMP%]{border:0;background:transparent;color:#9ca3af;cursor:pointer;font-size:13px;line-height:1;padding:0 2px}.sp-min[_ngcontent-%COMP%]:hover{color:#e7e7ea}.sp-bd[_ngcontent-%COMP%]{flex:1;min-height:0;position:relative;overflow:auto}.sp-divider[_ngcontent-%COMP%]{flex:0 0 10px;cursor:col-resize;position:relative}.sp-divider[_ngcontent-%COMP%]:after{content:"";position:absolute;left:4px;top:0;bottom:0;width:2px;background:#2b2d33}.sp-divider[_ngcontent-%COMP%]:hover:after{background:#6366f1}@media(max-width:900px){.sp[_ngcontent-%COMP%]{flex-direction:column}.sp-divider[_ngcontent-%COMP%]{display:none}.sp-pane[_ngcontent-%COMP%]{flex:1 1 auto!important}.sp-pane.collapsed[_ngcontent-%COMP%]{flex:0 0 34px!important}.sp-pane.collapsed[_ngcontent-%COMP%] .sp-hd[_ngcontent-%COMP%]{writing-mode:horizontal-tb;border-right:0;border-bottom:1px solid #2b2d33;height:auto}}']})};var We=["canvasContent"],Te=a=>["/runs",a];function Be(a,n){if(a&1){let e=w();o(0,"button",46),c("dragstart",function(i){let l=g(e).$implicit,p=u();return f(p.onPaletteDragStart(i,l.type))})("click",function(){let i=g(e).$implicit,l=u();return f(l.addNode(i.type))}),o(1,"span",47),s(2),r(),o(3,"span")(4,"strong"),s(5),r(),o(6,"small"),s(7),r()()()}if(a&2){let e=n.$implicit,t=u();d(2),h(t.iconFor(e.type)),d(3),h(e.label),d(2),h(e.description)}}function Ie(a,n){if(a&1){let e=w();o(0,"button",48),c("click",function(){let i=g(e).$implicit,l=u();return f(l.loadWorkflow(i.id))}),o(1,"span"),s(2),r(),o(3,"small"),s(4),r()()}if(a&2){let e=n.$implicit;d(2),h(e.name),d(2),P("",e.nodeCount," nodes")}}function Ve(a,n){if(a&1&&(o(0,"a",49)(1,"span")(2,"strong"),s(3),r(),o(4,"small"),s(5),r()(),o(6,"em"),s(7),r()()),a&2){let e=n.$implicit,t=u();m("routerLink",U(6,Te,e.runId)),d(3),h(e.workflow),d(2),h(e.runId),d(),J(t.statusClass(e.status)),d(),h(e.status)}}function De(a,n){a&1&&(o(0,"p",50),s(1,"No runs yet."),r())}function Fe(a,n){if(a&1&&(o(0,"div",51),s(1),r()),a&2){let e=u();S("error",e.saveState==="error"),d(),P(" ",e.statusMessage," ")}}function ze(a,n){a&1&&(o(0,"div",52)(1,"h2"),s(2,"Drop nodes here"),r(),o(3,"p"),s(4,"Build a DAG by adding Bash, Command, and Prompt nodes."),r()())}function Re(a,n){if(a&1&&(Y(),B(0,"line")),a&2){let e=n.$implicit;E("x1",e.x1)("y1",e.y1)("x2",e.x2)("y2",e.y2)}}function Le(a,n){if(a&1){let e=w();o(0,"button",53),c("click",function(){let i=g(e).$implicit,l=u();return f(l.selectNode(i))})("dragstart",function(i){let l=g(e).$implicit,p=u();return f(p.onNodeDragStart(i,l))}),o(1,"span",54),s(2),r(),o(3,"span",55)(4,"strong"),s(5),r(),o(6,"small"),s(7),r()()()}if(a&2){let e=n.$implicit,t=u();M("left",e.x,"px")("top",e.y,"px"),S("selected",(t.selectedNode==null?null:t.selectedNode.id)===e.id),d(2),h(t.iconFor(e.type)),d(3),h(e.id),d(2),A("",e.type," \xB7 ",e.dependsOn.length||0," deps")}}function Ye(a,n){if(a&1&&(o(0,"option",80),s(1),r()),a&2){let e=n.$implicit;m("value",e.name)("disabled",!e.available),d(),A(" ",e.name,"",e.available?"":" \u2014 not available on this machine"," ")}}function $e(a,n){if(a&1&&B(0,"option",81),a&2){let e=n.$implicit;m("value",e)}}function Ae(a,n){if(a&1){let e=w();o(0,"label",82)(1,"input",83),c("change",function(i){let l=g(e).$implicit,p=u(2);return f(p.toggleDependency(l.id,i))}),r(),o(2,"span"),s(3),r()()}if(a&2){let e=n.$implicit,t=u(2);d(),m("checked",t.selectedNode.dependsOn.includes(e.id)),d(2),h(e.id)}}function He(a,n){if(a&1){let e=w();o(0,"aside",56)(1,"div",57)(2,"span",58),s(3,"Inspector"),r(),o(4,"button",59),c("click",function(){g(e);let i=u();return f(i.closeInspector())}),s(5,"\u2715"),r()(),o(6,"label",60),s(7,"Node ID"),r(),o(8,"input",61),c("ngModelChange",function(i){g(e);let l=u();return f(l.renameSelectedNode(i))}),r(),o(9,"label",62),s(10,"Type"),r(),o(11,"select",63),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.type,i)||(l.selectedNode.type=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),o(12,"option",64),s(13,"bash"),r(),o(14,"option",65),s(15,"command"),r(),o(16,"option",66),s(17,"prompt"),r()(),o(18,"label",67),s(19,"Content"),r(),o(20,"textarea",68),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.content,i)||(l.selectedNode.content=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),r(),o(21,"label",69),s(22,"Provider"),r(),o(23,"select",70),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.provider,i)||(l.selectedNode.provider=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),o(24,"option",71),s(25,"(inherit workflow)"),r(),_(26,Ye,2,4,"option",72),r(),o(27,"label",73),s(28,"Model"),r(),o(29,"input",74),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.model,i)||(l.selectedNode.model=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),r(),o(30,"datalist",75),_(31,$e,1,1,"option",76),r(),o(32,"label",77),s(33,"Depends on"),r(),_(34,Ae,4,2,"label",78),o(35,"button",79),c("click",function(){g(e);let i=u();return f(i.deleteSelectedNode())}),s(36,"Delete Node"),r()()}if(a&2){let e=u();d(8),m("ngModel",e.selectedNode.id),d(3),C("ngModel",e.selectedNode.type),d(9),C("ngModel",e.selectedNode.content),d(3),C("ngModel",e.selectedNode.provider),d(3),m("ngForOf",e.providers),d(3),C("ngModel",e.selectedNode.model),d(2),m("ngForOf",e.modelSuggestions),d(3),m("ngForOf",e.dependencyCandidates)}}var _e=class a{api=W(ue);router=W(oe);route=W(ie);palette=[{type:"bash",label:"Bash",description:"Run a shell step"},{type:"command",label:"Command",description:"Use a .vsaf command"},{type:"prompt",label:"Prompt",description:"Call an AI provider"}];workflowName="new-workflow";workflowFolder="";description="Draft workflow";nodes=[];selectedNode;workflows=[];runs=[];providers=[];yamlPreview="";saveState="idle";statusMessage="";canvasScale=1;yamlFontPx=12;canvasContent;draggingType;draggingNodeId;ngOnInit(){this.loadYamlFont(),this.workflowFolder=q(this.route.snapshot.queryParamMap.get("folder")??""),this.refreshData(),this.resetBuilder();let n=this.route.snapshot.queryParamMap.get("edit");n&&this.loadWorkflow(n)}refreshData(){this.api.getWorkflows().subscribe(n=>this.workflows=n),this.api.getRuns().subscribe(n=>this.runs=n.slice().reverse().slice(0,8)),this.api.getProviders().subscribe({next:n=>this.providers=n.providers??[],error:()=>this.providers=[]})}get modelSuggestions(){let n=this.selectedNode?.provider||xe;return this.providers.find(e=>e.name===n)?.defaultModels??[]}resetBuilder(){this.workflowName="new-workflow",this.description="Draft workflow",this.nodes=[this.makeNode("bash",80,100,"setup"),this.makeNode("command",330,170,"review")],this.nodes[1].dependsOn=[this.nodes[0].id],this.arrange(),this.selectedNode=this.nodes[0],this.setStatus(""),this.refreshYaml()}get workflowId(){let n=q(this.workflowFolder),e=O(this.workflowName);return n?`${n}/${e}`:e}onPaletteDragStart(n,e){this.draggingType=e,n.dataTransfer?.setData("application/x-vsaf-node-type",e),n.dataTransfer?.setData("text/plain",e)}onNodeDragStart(n,e){this.draggingNodeId=e.id,n.dataTransfer?.setData("application/x-vsaf-node-id",e.id)}onCanvasDragOver(n){n.preventDefault()}onCanvasDrop(n){n.preventDefault();let t=(this.canvasContent?.nativeElement??n.currentTarget).getBoundingClientRect(),i=Math.max(18,(n.clientX-t.left)/this.canvasScale-95),l=Math.max(18,(n.clientY-t.top)/this.canvasScale-24),p=n.dataTransfer?.getData("application/x-vsaf-node-id")||this.draggingNodeId;if(p){let N=this.nodes.find(we=>we.id===p);N&&(N.x=i,N.y=l,this.selectNode(N),this.refreshYaml()),this.draggingNodeId=void 0;return}let k=n.dataTransfer?.getData("application/x-vsaf-node-type")||this.draggingType;k&&this.addNode(k,i,l),this.draggingType=void 0}zoomBy(n){this.canvasScale=Math.min(2,Math.max(.3,this.canvasScale*n))}onCanvasWheel(n){n.ctrlKey&&(n.preventDefault(),this.zoomBy(n.deltaY<0?1.1:.9))}zoomFit(){if(this.nodes.length===0){this.canvasScale=1;return}let n=this.canvasContent?.nativeElement.parentElement,e=n?.clientWidth??600,t=n?.clientHeight??400,i=Math.max(...this.nodes.map(k=>k.x))+j+40,l=Math.max(...this.nodes.map(k=>k.y))+K+40;this.canvasScale=Math.min(2,Math.max(.3,Math.min(e/i,t/l))),this.canvasContent?.nativeElement.parentElement?.scrollTo({top:0,left:0})}setYamlFont(n){this.yamlFontPx=Math.min(22,Math.max(10,this.yamlFontPx+n));try{localStorage.setItem("wf-yaml-font",String(this.yamlFontPx))}catch(e){}}loadYamlFont(){try{let n=Number(localStorage.getItem("wf-yaml-font"));n>=10&&n<=22&&(this.yamlFontPx=n)}catch(n){}}addNode(n,e,t){let i=e??40,l=t??(this.nodes.length?Math.max(...this.nodes.map(k=>k.y))+K+be.gapY:20),p=this.makeNode(n,i,l);this.nodes=[...this.nodes,p],this.selectNode(p),this.refreshYaml()}arrange(){let n=ge(this.nodes.map(e=>({key:e.id,dependsOn:e.dependsOn})),be);for(let e of this.nodes){let t=n.positions.get(e.id);t&&(e.x=t.x+40,e.y=t.y+20)}}arrangeVertical(){this.arrange()}selectNode(n){this.selectedNode=n}closeInspector(){this.selectedNode=void 0}renameSelectedNode(n){if(!this.selectedNode)return;let e=O(n);if(!e)return;let t=this.selectedNode.id;if(t!==e){if(this.nodes.some(i=>i.id===e)){this.setStatus(`Node ID already exists: ${e}`,"error");return}this.selectedNode.id=e;for(let i of this.nodes)i.dependsOn=i.dependsOn.map(l=>l===t?e:l);this.refreshYaml()}}toggleDependency(n,e){if(!this.selectedNode)return;e.target.checked?this.selectedNode.dependsOn=[...new Set([...this.selectedNode.dependsOn,n])]:this.selectedNode.dependsOn=this.selectedNode.dependsOn.filter(i=>i!==n),this.refreshYaml()}deleteSelectedNode(){if(!this.selectedNode)return;let n=this.selectedNode.id;this.nodes=this.nodes.filter(e=>e.id!==n).map(e=>x(b({},e),{dependsOn:e.dependsOn.filter(t=>t!==n)})),this.selectedNode=this.nodes[0],this.refreshYaml()}loadWorkflow(n){this.api.getWorkflow(n).subscribe(e=>{let t=e.id.lastIndexOf("/");this.workflowFolder=t>=0?e.id.slice(0,t):"",this.workflowName=t>=0?e.id.slice(t+1):e.id,this.description=e.description||"Workflow loaded from disk",this.nodes=e.nodes.map(i=>({id:i.id,type:i.type,title:i.id,content:i.content,dependsOn:i.dependsOn,provider:i.provider??"",model:i.model??"",x:0,y:0})),this.arrange(),this.selectedNode=this.nodes[0],this.setStatus(`Loaded ${e.name}`),this.refreshYaml()})}saveWorkflow(){this.saveCurrentWorkflow()}runWorkflow(){this.saveCurrentWorkflow(n=>{this.api.startRun(n,"").subscribe({next:e=>this.router.navigate(["/runs",e.runId]),error:e=>this.setStatus(e?.error?.error??e?.message??"Run failed","error")})})}refreshYaml(){this.yamlPreview=Ke(this.workflowName,this.description,this.nodes),this.saveState==="saved"&&(this.saveState="idle")}get dependencyCandidates(){return this.selectedNode?this.nodes.filter(n=>n.id!==this.selectedNode.id):[]}get edges(){let n=new Map(this.nodes.map(t=>[t.id,t])),e=[];for(let t of this.nodes)for(let i of t.dependsOn){let l=n.get(i);l&&e.push({x1:l.x+j/2,y1:l.y+K,x2:t.x+j/2,y2:t.y})}return e}iconFor(n){switch(n){case"bash":return"$";case"command":return"/";case"prompt":return"AI"}}statusClass(n){switch(n){case"completed":return"status-completed";case"failed":return"status-failed";case"running":return"status-running";default:return"status-default"}}saveCurrentWorkflow(n){let e=O(this.workflowName),t=q(this.workflowFolder),i=t?`${t}/${e}`:e;if(!e||this.nodes.length===0){this.setStatus("Workflow name and at least one node are required.","error");return}this.workflowName=e,this.refreshYaml(),this.saveState="saving",this.api.saveWorkflow(i,this.yamlPreview).subscribe({next:()=>{this.saveState="saved",this.setStatus(`Saved ${i}`),this.refreshData(),n?.(i)},error:l=>{this.saveState="error",this.setStatus(l?.error?.error??l?.message??"Save failed","error")}})}makeNode(n,e,t,i=n){let l=qe(this.nodes.map(p=>p.id),`${n}-${i}`);return{id:l,type:n,title:l,content:je(n,l),dependsOn:[],provider:"",model:"",x:e,y:t}}setStatus(n,e="idle"){this.statusMessage=n,this.saveState=e}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=T({type:a,selectors:[["app-workflow-builder"]],viewQuery:function(e,t){if(e&1&&I(We,5),e&2){let i;V(i=D())&&(t.canvasContent=i.first)}},decls:78,vars:28,consts:[["canvasContent",""],[1,"builder-shell"],[1,"sidebar"],[1,"brand-row"],[1,"brand-mark"],[1,"brand-title"],[1,"brand-subtitle"],["for","workflow-folder",1,"field-label"],["id","workflow-folder","placeholder","e.g. sdlc/release",1,"text-input",3,"ngModelChange","ngModel"],["for","workflow-name",1,"field-label"],["id","workflow-name",1,"text-input",3,"ngModelChange","ngModel"],["for","workflow-description",1,"field-label"],["id","workflow-description","rows","3",1,"text-area",3,"ngModelChange","ngModel"],[1,"section-title"],["type","button","class","palette-item","draggable","true",3,"dragstart","click",4,"ngFor","ngForOf"],["type","button","class","workflow-link",3,"click",4,"ngFor","ngForOf"],["open","",1,"runs-details"],["class","run-row",3,"routerLink",4,"ngFor","ngForOf"],["class","muted",4,"ngIf"],[1,"workspace"],[1,"toolbar"],[1,"toolbar-actions"],["type","button",1,"ghost-button",3,"click"],["type","button",1,"primary-button",3,"click","disabled"],["type","button",1,"run-button",3,"click","disabled"],["class","status-row",3,"error",4,"ngIf"],[1,"workspace-split"],["storageKey","wf-builder-split","leftTitle","Canvas","rightTitle","Workflow YAML"],["sp-left","",1,"canvas-wrap"],[1,"canvas-grid"],[1,"canvas-zoom"],["type","button","aria-label","Zoom out",3,"click"],["type","button","aria-label","Zoom in",3,"click"],["type","button","aria-label","Fit to view",1,"fit",3,"click"],[1,"canvas",3,"dragover","drop","wheel"],["class","empty-state",4,"ngIf"],[1,"canvas-content"],["aria-hidden","true",1,"edges"],[4,"ngFor","ngForOf"],["type","button","class","node-card","draggable","true",3,"selected","left","top","click","dragstart",4,"ngFor","ngForOf"],["class","inspector-drawer",4,"ngIf"],["sp-right","",1,"yaml-wrap"],[1,"yaml-fontctl"],["type","button","aria-label","Decrease YAML font size","title","Smaller",3,"click"],["type","button","aria-label","Increase YAML font size","title","Larger",3,"click"],[1,"yaml-editor",3,"ngModelChange","ngModel"],["type","button","draggable","true",1,"palette-item",3,"dragstart","click"],[1,"palette-icon"],["type","button",1,"workflow-link",3,"click"],[1,"run-row",3,"routerLink"],[1,"muted"],[1,"status-row"],[1,"empty-state"],["type","button","draggable","true",1,"node-card",3,"click","dragstart"],[1,"node-kind"],[1,"node-copy"],[1,"inspector-drawer"],[1,"drawer-hd"],[1,"panel-title"],["type","button","title","Close",1,"icon-button",3,"click"],["for","node-id",1,"field-label"],["id","node-id",1,"text-input",3,"ngModelChange","ngModel"],["for","node-type",1,"field-label"],["id","node-type",1,"text-input",3,"ngModelChange","ngModel"],["value","bash"],["value","command"],["value","prompt"],["for","node-content",1,"field-label"],["id","node-content","rows","7",1,"text-area","mono",3,"ngModelChange","ngModel"],["for","node-provider",1,"field-label"],["id","node-provider",1,"text-input",3,"ngModelChange","ngModel"],["value",""],[3,"value","disabled",4,"ngFor","ngForOf"],["for","node-model",1,"field-label"],["id","node-model","list","builder-model-suggestions","placeholder","(inherit)",1,"text-input",3,"ngModelChange","ngModel"],["id","builder-model-suggestions"],[3,"value",4,"ngFor","ngForOf"],[1,"field-label"],["class","check-row",4,"ngFor","ngForOf"],["type","button",1,"danger-button",3,"click"],[3,"value","disabled"],[3,"value"],[1,"check-row"],["type","checkbox",3,"change","checked"]],template:function(e,t){if(e&1){let i=w();o(0,"section",1)(1,"aside",2)(2,"div",3)(3,"div",4),s(4,"V"),r(),o(5,"div")(6,"div",5),s(7,"VSAF Builder"),r(),o(8,"div",6),s(9,"Workflow canvas"),r()()(),o(10,"label",7),s(11,"Folder"),r(),o(12,"input",8),y("ngModelChange",function(p){return g(i),v(t.workflowFolder,p)||(t.workflowFolder=p),f(p)}),r(),o(13,"label",9),s(14,"Workflow name"),r(),o(15,"input",10),y("ngModelChange",function(p){return g(i),v(t.workflowName,p)||(t.workflowName=p),f(p)}),c("ngModelChange",function(){return t.refreshYaml()}),r(),o(16,"label",11),s(17,"Description"),r(),o(18,"textarea",12),y("ngModelChange",function(p){return g(i),v(t.description,p)||(t.description=p),f(p)}),c("ngModelChange",function(){return t.refreshYaml()}),r(),o(19,"div",13),s(20,"Node Palette"),r(),_(21,Be,8,3,"button",14),o(22,"div",13),s(23,"Existing"),r(),_(24,Ie,5,2,"button",15),o(25,"details",16)(26,"summary",13),s(27,"Recent Runs"),r(),_(28,Ve,8,8,"a",17)(29,De,2,0,"p",18),r()(),o(30,"main",19)(31,"header",20)(32,"div")(33,"h1"),s(34),r(),o(35,"p"),s(36),r()(),o(37,"div",21)(38,"button",22),c("click",function(){return t.resetBuilder()}),s(39,"New"),r(),o(40,"button",22),c("click",function(){return t.refreshData()}),s(41,"Reload"),r(),o(42,"button",22),c("click",function(){return t.arrangeVertical()}),s(43,"Arrange"),r(),o(44,"button",23),c("click",function(){return t.saveWorkflow()}),s(45),r(),o(46,"button",24),c("click",function(){return t.runWorkflow()}),s(47,"Run"),r()()(),_(48,Fe,2,3,"div",25),o(49,"div",26)(50,"app-split-pane",27)(51,"div",28),B(52,"div",29),o(53,"div",30)(54,"button",31),c("click",function(){return t.zoomBy(.8)}),s(55,"\u2212"),r(),o(56,"span"),s(57),Z(58,"number"),r(),o(59,"button",32),c("click",function(){return t.zoomBy(1.25)}),s(60,"+"),r(),o(61,"button",33),c("click",function(){return t.zoomFit()}),s(62,"fit"),r()(),o(63,"section",34),c("dragover",function(p){return t.onCanvasDragOver(p)})("drop",function(p){return t.onCanvasDrop(p)})("wheel",function(p){return t.onCanvasWheel(p)}),_(64,ze,5,0,"div",35),o(65,"div",36,0),Y(),o(67,"svg",37),_(68,Re,1,4,"line",38),r(),_(69,Le,8,10,"button",39),r()(),_(70,He,37,8,"aside",40),r(),X(),o(71,"div",41)(72,"div",42)(73,"button",43),c("click",function(){return t.setYamlFont(-1)}),s(74,"A\u2212"),r(),o(75,"button",44),c("click",function(){return t.setYamlFont(1)}),s(76,"A+"),r()(),o(77,"textarea",45),y("ngModelChange",function(p){return g(i),v(t.yamlPreview,p)||(t.yamlPreview=p),f(p)}),r()()()()()()}e&2&&(d(12),C("ngModel",t.workflowFolder),d(3),C("ngModel",t.workflowName),d(3),C("ngModel",t.description),d(3),m("ngForOf",t.palette),d(3),m("ngForOf",t.workflows),d(4),m("ngForOf",t.runs),d(),m("ngIf",t.runs.length===0),d(5),h(t.workflowId||"untitled-workflow"),d(2),P("",t.nodes.length," nodes \xB7 drag from palette or click a node to edit"),d(8),m("disabled",t.saveState==="saving"),d(),P(" ",t.saveState==="saving"?"Saving...":"Save Workflow"," "),d(),m("disabled",t.nodes.length===0),d(2),m("ngIf",t.statusMessage),d(9),P("",ee(58,25,t.canvasScale*100,"1.0-0"),"%"),d(7),m("ngIf",t.nodes.length===0),d(),M("transform","scale("+t.canvasScale+")"),d(3),m("ngForOf",t.edges),d(),m("ngForOf",t.nodes),d(),m("ngIf",t.selectedNode),d(7),M("font-size",t.yamlFontPx,"px")("line-height",1.5),C("ngModel",t.yamlPreview))},dependencies:[z,te,F,me,pe,ce,ae,de,le,se,re,L,ne],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}button[_ngcontent-%COMP%], input[_ngcontent-%COMP%], textarea[_ngcontent-%COMP%], select[_ngcontent-%COMP%]{font:inherit}.builder-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:280px minmax(0,1fr);min-height:calc(100vh - 56px)}.sidebar[_ngcontent-%COMP%]{border-right:1px solid #2b2d33;background:#17181d;padding:16px;overflow:auto}.brand-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;margin-bottom:22px}.brand-mark[_ngcontent-%COMP%]{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;background:#6366f1;color:#fff;font-weight:700}.brand-title[_ngcontent-%COMP%]{font-size:15px;font-weight:700}.brand-subtitle[_ngcontent-%COMP%], .muted[_ngcontent-%COMP%], small[_ngcontent-%COMP%]{color:#9ca3af}.field-label[_ngcontent-%COMP%], .section-title[_ngcontent-%COMP%]{display:block;margin:14px 0 7px;color:#a1a1aa;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.text-input[_ngcontent-%COMP%], .text-area[_ngcontent-%COMP%]{width:100%;box-sizing:border-box;border:1px solid #333640;border-radius:7px;background:#101114;color:#f4f4f5;padding:9px 10px;outline:none}.text-input[_ngcontent-%COMP%]:focus, .text-area[_ngcontent-%COMP%]:focus, .yaml-editor[_ngcontent-%COMP%]:focus{border-color:#6366f1;box-shadow:0 0 0 2px #6366f12e}.text-area[_ngcontent-%COMP%]{resize:vertical}.mono[_ngcontent-%COMP%], .yaml-editor[_ngcontent-%COMP%]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.palette-item[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;width:100%;border:1px solid #2b2d33;border-radius:8px;background:#1f2128;color:#e7e7ea;padding:10px;margin-bottom:8px;text-align:left;cursor:grab}.palette-item[_ngcontent-%COMP%]:hover, .workflow-link[_ngcontent-%COMP%]:hover{border-color:#4f46e5;background:#242633}.palette-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:28px;height:28px;border-radius:7px;background:#111827;color:#a5b4fc}.palette-item[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;font-size:13px}.palette-item[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block;font-size:11px;margin-top:2px}.workflow-link[_ngcontent-%COMP%]{justify-content:space-between;cursor:pointer}.runs-details[_ngcontent-%COMP%]{margin-top:8px}.runs-details[_ngcontent-%COMP%] > summary[_ngcontent-%COMP%]{cursor:pointer;list-style:revert}.workspace[_ngcontent-%COMP%]{min-width:0;padding:18px;display:flex;flex-direction:column;min-height:0}.toolbar[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:12px}.toolbar[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0;font-size:20px}.toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0 0;color:#9ca3af;font-size:13px}.toolbar-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-wrap:wrap}.ghost-button[_ngcontent-%COMP%], .primary-button[_ngcontent-%COMP%], .run-button[_ngcontent-%COMP%], .danger-button[_ngcontent-%COMP%]{border:1px solid #333640;border-radius:7px;padding:8px 12px;color:#f4f4f5;background:#20222a;cursor:pointer}.primary-button[_ngcontent-%COMP%]{background:#4f46e5;border-color:#4f46e5}.run-button[_ngcontent-%COMP%]{background:#059669;border-color:#059669}.danger-button[_ngcontent-%COMP%]{width:100%;margin-top:14px;background:#3f1d24;border-color:#7f1d1d;color:#fecaca}.primary-button[_ngcontent-%COMP%]:disabled, .run-button[_ngcontent-%COMP%]:disabled{opacity:.55;cursor:not-allowed}.status-row[_ngcontent-%COMP%]{border:1px solid #1f5f45;border-radius:8px;background:#092d22;color:#a7f3d0;padding:10px 12px;margin-bottom:12px;font-size:13px}.status-row.error[_ngcontent-%COMP%]{border-color:#7f1d1d;background:#2a1217;color:#fecaca}.workspace-split[_ngcontent-%COMP%]{flex:1;min-height:470px}.canvas-wrap[_ngcontent-%COMP%]{position:relative;height:100%;min-height:470px;background:#15161b}.canvas[_ngcontent-%COMP%]{position:absolute;inset:0;overflow:auto;border:0;border-radius:0;background:transparent;z-index:1}.canvas-content[_ngcontent-%COMP%]{position:relative;width:3000px;height:2000px;transform-origin:0 0}.canvas-zoom[_ngcontent-%COMP%]{position:absolute;top:8px;left:8px;z-index:6;display:flex;align-items:center;gap:4px;background:#17181dd9;border:1px solid #2b2d33;border-radius:8px;padding:4px 6px}.canvas-zoom[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #333640;background:#20222a;color:#e7e7ea;border-radius:6px;min-width:24px;height:24px;cursor:pointer;font-size:13px}.canvas-zoom[_ngcontent-%COMP%] .fit[_ngcontent-%COMP%]{width:auto;padding:0 8px;font-size:11px}.canvas-zoom[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#9ca3af;font-size:11px;min-width:34px;text-align:center;font-family:ui-monospace,monospace}.inspector-drawer[_ngcontent-%COMP%]{position:absolute;top:0;right:0;bottom:0;width:min(360px,72%);background:#17181d;border-left:1px solid #2b2d33;box-shadow:-14px 0 30px #0006;padding:14px;overflow:auto;z-index:5}.drawer-hd[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.icon-button[_ngcontent-%COMP%]{border:0;background:transparent;color:#9ca3af;cursor:pointer;font-size:15px;line-height:1}.icon-button[_ngcontent-%COMP%]:hover{color:#e7e7ea}.canvas-grid[_ngcontent-%COMP%]{position:absolute;inset:0;z-index:0;pointer-events:none;background-image:linear-gradient(#24262e 1px,transparent 1px),linear-gradient(90deg,#24262e 1px,transparent 1px);background-size:28px 28px;opacity:.45}.empty-state[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-content:center;text-align:center;color:#9ca3af;pointer-events:none}.empty-state[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0 0 6px;color:#e7e7ea}.edges[_ngcontent-%COMP%]{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.edges[_ngcontent-%COMP%] line[_ngcontent-%COMP%]{stroke:#6366f1;stroke-width:2;stroke-dasharray:5 5;opacity:.8}.node-card[_ngcontent-%COMP%]{position:absolute;z-index:2;display:flex;align-items:center;gap:10px;width:190px;border:1px solid #3f4250;border-radius:8px;background:#20222a;color:#f4f4f5;padding:11px;cursor:move;text-align:left;box-shadow:0 12px 28px #00000038}.node-card.selected[_ngcontent-%COMP%]{border-color:#818cf8;box-shadow:0 0 0 2px #6366f147,0 12px 28px #00000038}.node-kind[_ngcontent-%COMP%]{display:grid;place-items:center;width:30px;height:30px;border-radius:7px;background:#111827;color:#a5b4fc}.node-copy[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .node-copy[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.node-copy[_ngcontent-%COMP%]{min-width:0}.panel-title[_ngcontent-%COMP%]{margin-bottom:12px;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:#d4d4d8}.check-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:8px 0;color:#d4d4d8;font-size:13px}.yaml-editor[_ngcontent-%COMP%]{width:100%;min-height:260px;box-sizing:border-box;border:1px solid #333640;border-radius:7px;background:#0f1014;color:#d4d4d8;padding:12px;resize:vertical}.yaml-wrap[_ngcontent-%COMP%]{height:100%;position:relative}.yaml-fontctl[_ngcontent-%COMP%]{position:absolute;top:6px;right:10px;z-index:6;display:flex;gap:4px}.yaml-fontctl[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #333640;background:#17181dd9;color:#e7e7ea;border-radius:6px;min-width:28px;height:24px;cursor:pointer;font-size:12px}.yaml-wrap[_ngcontent-%COMP%] .yaml-editor[_ngcontent-%COMP%]{width:100%;height:100%;min-height:0;box-sizing:border-box;border:0;border-radius:0;resize:none}.run-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:10px 0;color:#e7e7ea;text-decoration:none;border-bottom:1px solid #252730}.run-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .run-row[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block}.run-row[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.status-completed[_ngcontent-%COMP%]{color:#34d399}.status-failed[_ngcontent-%COMP%]{color:#f87171}.status-running[_ngcontent-%COMP%]{color:#60a5fa}.status-default[_ngcontent-%COMP%]{color:#a1a1aa}@media(max-width:980px){.builder-shell[_ngcontent-%COMP%]{grid-template-columns:1fr}.sidebar[_ngcontent-%COMP%]{border-right:0;border-bottom:1px solid #2b2d33}.toolbar[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}}"]})};function je(a,n){switch(a){case"bash":return`echo "${n}"`;case"command":return n;case"prompt":return`Complete ${n} and summarize the result.`}}var be={nodeW:190,nodeH:56,gapX:40,gapY:48},j=190,K=56,xe="claude";function Ke(a,n,e){let t=[`name: ${O(a)||"new-workflow"}`,`description: ${Q(n||"Draft workflow")}`,`provider: ${xe}`,"model: sonnet","nodes:"];for(let i of e)if(t.push(` - id: ${i.id}`),i.dependsOn.length>0&&t.push(` depends_on: [${i.dependsOn.join(", ")}]`),i.provider&&t.push(` provider: ${i.provider}`),i.model&&t.push(` model: ${i.model}`),i.type==="bash")t.push(` bash: ${Q(i.content||"echo ok")}`);else if(i.type==="command")t.push(` command: ${Q(i.content||i.id)}`);else{t.push(" prompt: |");for(let l of(i.content||`Complete ${i.id}`).split(`
1
+ import{a as ge}from"./chunk-33F7AVPH.js";import{b as ie,d as oe,e as re}from"./chunk-ZZWA24BS.js";import{a as ae,b as le,e as se,g as de,h as pe,i as ce,j as me,k as ue}from"./chunk-OYL4KDHJ.js";import{$a as $,Ba as T,Fa as _,Ka as E,Mb as te,Nb as F,O as W,Qa as m,Qb as ne,Ra as o,Rb as z,Sa as r,T as g,Ta as B,U as f,V as Y,W as X,Xa as w,Ya as c,Za as u,_a as G,a as b,b as x,bb as I,cb as V,db as D,fb as M,gb as S,hb as J,ib as s,jb as h,kb as P,lb as A,nb as C,ob as v,pb as y,qa as d,sb as U,tb as Z,ub as ee}from"./chunk-RM7DW5FD.js";var Ce={ratio:.5,leftCollapsed:!1,rightCollapsed:!1};function R(a,n=.15,e=.85){return Number.isNaN(a)?.5:Math.min(e,Math.max(n,a))}function fe(a,n=Ce){let e=x(b({},n),{rightCollapsed:n.rightCollapsed&&!n.leftCollapsed});try{let t=globalThis.localStorage?.getItem(a);if(!t)return b({},e);let i=JSON.parse(t),l=!!i.leftCollapsed;return{ratio:typeof i.ratio=="number"?R(i.ratio):e.ratio,leftCollapsed:l,rightCollapsed:!!i.rightCollapsed&&!l}}catch(t){return b({},e)}}function H(a,n){try{globalThis.localStorage?.setItem(a,JSON.stringify(n))}catch(e){}}function he(a,n){if(n==="left"){let t=!a.leftCollapsed;return x(b({},a),{leftCollapsed:t,rightCollapsed:t?!1:a.rightCollapsed})}let e=!a.rightCollapsed;return x(b({},a),{rightCollapsed:e,leftCollapsed:e?!1:a.leftCollapsed})}var Me=["host"],Se=[[["","sp-left",""]],[["","sp-right",""]]],Pe=["[sp-left]","[sp-right]"];function Oe(a,n){a&1&&(o(0,"div",8),$(1),r())}function Ee(a,n){if(a&1){let e=w();o(0,"div",9),c("mousedown",function(i){g(e);let l=u();return f(l.startDrag(i))}),r()}}function Ne(a,n){a&1&&(o(0,"div",8),$(1,1),r())}var L=class a{storageKey="split-pane";leftTitle="";rightTitle="";minPx=240;host;state={ratio:.5,leftCollapsed:!1,rightCollapsed:!1};dragging=!1;moveHandler;upHandler;ngOnInit(){this.state=fe(this.storageKey)}ngAfterViewInit(){queueMicrotask(()=>{let n=this.host?.nativeElement.getBoundingClientRect().width??0;if(n>0&&!this.state.leftCollapsed&&!this.state.rightCollapsed){let e=this.minPx/n,t=R(this.state.ratio,e,1-e);t!==this.state.ratio&&(this.state=x(b({},this.state),{ratio:t}))}})}leftBasis(){return this.state.leftCollapsed?"34px":this.state.rightCollapsed?"auto":this.state.ratio*100+"%"}toggle(n){this.state=he(this.state,n),H(this.storageKey,this.state)}startDrag(n){n.preventDefault(),this.dragging=!0,this.moveHandler=e=>{if(!this.dragging)return;let t=this.host.nativeElement.getBoundingClientRect();if(t.width<=0)return;let i=this.minPx/t.width;this.state=x(b({},this.state),{ratio:R((e.clientX-t.left)/t.width,i,1-i)})},this.upHandler=()=>this.endDrag(),document.addEventListener("mousemove",this.moveHandler),document.addEventListener("mouseup",this.upHandler),window.addEventListener("blur",this.upHandler)}endDrag(){this.dragging&&(this.dragging=!1,this.moveHandler&&document.removeEventListener("mousemove",this.moveHandler),this.upHandler&&(document.removeEventListener("mouseup",this.upHandler),window.removeEventListener("blur",this.upHandler)),this.moveHandler=this.upHandler=void 0,H(this.storageKey,this.state))}ngOnDestroy(){this.endDrag()}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=T({type:a,selectors:[["app-split-pane"]],viewQuery:function(e,t){if(e&1&&I(Me,7),e&2){let i;V(i=D())&&(t.host=i.first)}},inputs:{storageKey:"storageKey",leftTitle:"leftTitle",rightTitle:"rightTitle",minPx:"minPx"},ngContentSelectors:Pe,decls:17,vars:21,consts:[["host",""],[1,"sp"],[1,"sp-pane"],[1,"sp-hd"],[1,"sp-title"],["type","button",1,"sp-min",3,"click","title"],["class","sp-bd",4,"ngIf"],["class","sp-divider",3,"mousedown",4,"ngIf"],[1,"sp-bd"],[1,"sp-divider",3,"mousedown"]],template:function(e,t){e&1&&(G(Se),o(0,"div",1,0)(2,"div",2)(3,"div",3)(4,"span",4),s(5),r(),o(6,"button",5),c("click",function(){return t.toggle("left")}),s(7),r()(),_(8,Oe,2,0,"div",6),r(),_(9,Ee,1,0,"div",7),o(10,"div",2)(11,"div",3)(12,"span",4),s(13),r(),o(14,"button",5),c("click",function(){return t.toggle("right")}),s(15),r()(),_(16,Ne,2,0,"div",6),r()()),e&2&&(d(2),M("flex-basis",t.leftBasis())("flex-grow",t.state.leftCollapsed?0:t.state.rightCollapsed?1:0),S("collapsed",t.state.leftCollapsed),d(3),h(t.leftTitle),d(),m("title",t.state.leftCollapsed?"Restore":"Minimize"),E("aria-label",(t.state.leftCollapsed?"Restore ":"Minimize ")+t.leftTitle),d(),h(t.state.leftCollapsed?"\u25A3":"\u229F"),d(),m("ngIf",!t.state.leftCollapsed),d(),m("ngIf",!t.state.leftCollapsed&&!t.state.rightCollapsed),d(),M("flex-grow",1),S("collapsed",t.state.rightCollapsed),d(3),h(t.rightTitle),d(),m("title",t.state.rightCollapsed?"Restore":"Minimize"),E("aria-label",(t.state.rightCollapsed?"Restore ":"Minimize ")+t.rightTitle),d(),h(t.state.rightCollapsed?"\u25A3":"\u229F"),d(),m("ngIf",!t.state.rightCollapsed))},dependencies:[z,F],styles:['.sp[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;min-height:470px}.sp-pane[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:0;border:1px solid #2b2d33;border-radius:8px;background:#15161b;overflow:hidden}.sp-pane.collapsed[_ngcontent-%COMP%]{flex:0 0 34px!important}.sp-hd[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 10px;border-bottom:1px solid #2b2d33;background:#17181d;font-size:12px;color:#a1a1aa}.sp-pane.collapsed[_ngcontent-%COMP%] .sp-hd[_ngcontent-%COMP%]{writing-mode:vertical-rl;border-bottom:0;border-right:1px solid #2b2d33;height:100%;justify-content:flex-start}.sp-title[_ngcontent-%COMP%]{font-weight:700;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sp-min[_ngcontent-%COMP%]{border:0;background:transparent;color:#9ca3af;cursor:pointer;font-size:13px;line-height:1;padding:0 2px}.sp-min[_ngcontent-%COMP%]:hover{color:#e7e7ea}.sp-bd[_ngcontent-%COMP%]{flex:1;min-height:0;position:relative;overflow:auto}.sp-divider[_ngcontent-%COMP%]{flex:0 0 10px;cursor:col-resize;position:relative}.sp-divider[_ngcontent-%COMP%]:after{content:"";position:absolute;left:4px;top:0;bottom:0;width:2px;background:#2b2d33}.sp-divider[_ngcontent-%COMP%]:hover:after{background:#6366f1}@media(max-width:900px){.sp[_ngcontent-%COMP%]{flex-direction:column}.sp-divider[_ngcontent-%COMP%]{display:none}.sp-pane[_ngcontent-%COMP%]{flex:1 1 auto!important}.sp-pane.collapsed[_ngcontent-%COMP%]{flex:0 0 34px!important}.sp-pane.collapsed[_ngcontent-%COMP%] .sp-hd[_ngcontent-%COMP%]{writing-mode:horizontal-tb;border-right:0;border-bottom:1px solid #2b2d33;height:auto}}']})};var We=["canvasContent"],Te=a=>["/runs",a];function Be(a,n){if(a&1){let e=w();o(0,"button",46),c("dragstart",function(i){let l=g(e).$implicit,p=u();return f(p.onPaletteDragStart(i,l.type))})("click",function(){let i=g(e).$implicit,l=u();return f(l.addNode(i.type))}),o(1,"span",47),s(2),r(),o(3,"span")(4,"strong"),s(5),r(),o(6,"small"),s(7),r()()()}if(a&2){let e=n.$implicit,t=u();d(2),h(t.iconFor(e.type)),d(3),h(e.label),d(2),h(e.description)}}function Ie(a,n){if(a&1){let e=w();o(0,"button",48),c("click",function(){let i=g(e).$implicit,l=u();return f(l.loadWorkflow(i.id))}),o(1,"span"),s(2),r(),o(3,"small"),s(4),r()()}if(a&2){let e=n.$implicit;d(2),h(e.name),d(2),P("",e.nodeCount," nodes")}}function Ve(a,n){if(a&1&&(o(0,"a",49)(1,"span")(2,"strong"),s(3),r(),o(4,"small"),s(5),r()(),o(6,"em"),s(7),r()()),a&2){let e=n.$implicit,t=u();m("routerLink",U(6,Te,e.runId)),d(3),h(e.workflow),d(2),h(e.runId),d(),J(t.statusClass(e.status)),d(),h(e.status)}}function De(a,n){a&1&&(o(0,"p",50),s(1,"No runs yet."),r())}function Fe(a,n){if(a&1&&(o(0,"div",51),s(1),r()),a&2){let e=u();S("error",e.saveState==="error"),d(),P(" ",e.statusMessage," ")}}function ze(a,n){a&1&&(o(0,"div",52)(1,"h2"),s(2,"Drop nodes here"),r(),o(3,"p"),s(4,"Build a DAG by adding Bash, Command, and Prompt nodes."),r()())}function Re(a,n){if(a&1&&(Y(),B(0,"line")),a&2){let e=n.$implicit;E("x1",e.x1)("y1",e.y1)("x2",e.x2)("y2",e.y2)}}function Le(a,n){if(a&1){let e=w();o(0,"button",53),c("click",function(){let i=g(e).$implicit,l=u();return f(l.selectNode(i))})("dragstart",function(i){let l=g(e).$implicit,p=u();return f(p.onNodeDragStart(i,l))}),o(1,"span",54),s(2),r(),o(3,"span",55)(4,"strong"),s(5),r(),o(6,"small"),s(7),r()()()}if(a&2){let e=n.$implicit,t=u();M("left",e.x,"px")("top",e.y,"px"),S("selected",(t.selectedNode==null?null:t.selectedNode.id)===e.id),d(2),h(t.iconFor(e.type)),d(3),h(e.id),d(2),A("",e.type," \xB7 ",e.dependsOn.length||0," deps")}}function Ye(a,n){if(a&1&&(o(0,"option",80),s(1),r()),a&2){let e=n.$implicit;m("value",e.name)("disabled",!e.available),d(),A(" ",e.name,"",e.available?"":" \u2014 not available on this machine"," ")}}function $e(a,n){if(a&1&&B(0,"option",81),a&2){let e=n.$implicit;m("value",e)}}function Ae(a,n){if(a&1){let e=w();o(0,"label",82)(1,"input",83),c("change",function(i){let l=g(e).$implicit,p=u(2);return f(p.toggleDependency(l.id,i))}),r(),o(2,"span"),s(3),r()()}if(a&2){let e=n.$implicit,t=u(2);d(),m("checked",t.selectedNode.dependsOn.includes(e.id)),d(2),h(e.id)}}function He(a,n){if(a&1){let e=w();o(0,"aside",56)(1,"div",57)(2,"span",58),s(3,"Inspector"),r(),o(4,"button",59),c("click",function(){g(e);let i=u();return f(i.closeInspector())}),s(5,"\u2715"),r()(),o(6,"label",60),s(7,"Node ID"),r(),o(8,"input",61),c("ngModelChange",function(i){g(e);let l=u();return f(l.renameSelectedNode(i))}),r(),o(9,"label",62),s(10,"Type"),r(),o(11,"select",63),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.type,i)||(l.selectedNode.type=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),o(12,"option",64),s(13,"bash"),r(),o(14,"option",65),s(15,"command"),r(),o(16,"option",66),s(17,"prompt"),r()(),o(18,"label",67),s(19,"Content"),r(),o(20,"textarea",68),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.content,i)||(l.selectedNode.content=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),r(),o(21,"label",69),s(22,"Provider"),r(),o(23,"select",70),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.provider,i)||(l.selectedNode.provider=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),o(24,"option",71),s(25,"(inherit workflow)"),r(),_(26,Ye,2,4,"option",72),r(),o(27,"label",73),s(28,"Model"),r(),o(29,"input",74),y("ngModelChange",function(i){g(e);let l=u();return v(l.selectedNode.model,i)||(l.selectedNode.model=i),f(i)}),c("ngModelChange",function(){g(e);let i=u();return f(i.refreshYaml())}),r(),o(30,"datalist",75),_(31,$e,1,1,"option",76),r(),o(32,"label",77),s(33,"Depends on"),r(),_(34,Ae,4,2,"label",78),o(35,"button",79),c("click",function(){g(e);let i=u();return f(i.deleteSelectedNode())}),s(36,"Delete Node"),r()()}if(a&2){let e=u();d(8),m("ngModel",e.selectedNode.id),d(3),C("ngModel",e.selectedNode.type),d(9),C("ngModel",e.selectedNode.content),d(3),C("ngModel",e.selectedNode.provider),d(3),m("ngForOf",e.providers),d(3),C("ngModel",e.selectedNode.model),d(2),m("ngForOf",e.modelSuggestions),d(3),m("ngForOf",e.dependencyCandidates)}}var _e=class a{api=W(ue);router=W(oe);route=W(ie);palette=[{type:"bash",label:"Bash",description:"Run a shell step"},{type:"command",label:"Command",description:"Use a .vsaf command"},{type:"prompt",label:"Prompt",description:"Call an AI provider"}];workflowName="new-workflow";workflowFolder="";description="Draft workflow";nodes=[];selectedNode;workflows=[];runs=[];providers=[];yamlPreview="";saveState="idle";statusMessage="";canvasScale=1;yamlFontPx=12;canvasContent;draggingType;draggingNodeId;ngOnInit(){this.loadYamlFont(),this.workflowFolder=q(this.route.snapshot.queryParamMap.get("folder")??""),this.refreshData(),this.resetBuilder();let n=this.route.snapshot.queryParamMap.get("edit");n&&this.loadWorkflow(n)}refreshData(){this.api.getWorkflows().subscribe(n=>this.workflows=n),this.api.getRuns().subscribe(n=>this.runs=n.slice().reverse().slice(0,8)),this.api.getProviders().subscribe({next:n=>this.providers=n.providers??[],error:()=>this.providers=[]})}get modelSuggestions(){let n=this.selectedNode?.provider||xe;return this.providers.find(e=>e.name===n)?.defaultModels??[]}resetBuilder(){this.workflowName="new-workflow",this.description="Draft workflow",this.nodes=[this.makeNode("bash",80,100,"setup"),this.makeNode("command",330,170,"review")],this.nodes[1].dependsOn=[this.nodes[0].id],this.arrange(),this.selectedNode=this.nodes[0],this.setStatus(""),this.refreshYaml()}get workflowId(){let n=q(this.workflowFolder),e=O(this.workflowName);return n?`${n}/${e}`:e}onPaletteDragStart(n,e){this.draggingType=e,n.dataTransfer?.setData("application/x-vsaf-node-type",e),n.dataTransfer?.setData("text/plain",e)}onNodeDragStart(n,e){this.draggingNodeId=e.id,n.dataTransfer?.setData("application/x-vsaf-node-id",e.id)}onCanvasDragOver(n){n.preventDefault()}onCanvasDrop(n){n.preventDefault();let t=(this.canvasContent?.nativeElement??n.currentTarget).getBoundingClientRect(),i=Math.max(18,(n.clientX-t.left)/this.canvasScale-95),l=Math.max(18,(n.clientY-t.top)/this.canvasScale-24),p=n.dataTransfer?.getData("application/x-vsaf-node-id")||this.draggingNodeId;if(p){let N=this.nodes.find(we=>we.id===p);N&&(N.x=i,N.y=l,this.selectNode(N),this.refreshYaml()),this.draggingNodeId=void 0;return}let k=n.dataTransfer?.getData("application/x-vsaf-node-type")||this.draggingType;k&&this.addNode(k,i,l),this.draggingType=void 0}zoomBy(n){this.canvasScale=Math.min(2,Math.max(.3,this.canvasScale*n))}onCanvasWheel(n){n.ctrlKey&&(n.preventDefault(),this.zoomBy(n.deltaY<0?1.1:.9))}zoomFit(){if(this.nodes.length===0){this.canvasScale=1;return}let n=this.canvasContent?.nativeElement.parentElement,e=n?.clientWidth??600,t=n?.clientHeight??400,i=Math.max(...this.nodes.map(k=>k.x))+j+40,l=Math.max(...this.nodes.map(k=>k.y))+K+40;this.canvasScale=Math.min(2,Math.max(.3,Math.min(e/i,t/l))),this.canvasContent?.nativeElement.parentElement?.scrollTo({top:0,left:0})}setYamlFont(n){this.yamlFontPx=Math.min(22,Math.max(10,this.yamlFontPx+n));try{localStorage.setItem("wf-yaml-font",String(this.yamlFontPx))}catch(e){}}loadYamlFont(){try{let n=Number(localStorage.getItem("wf-yaml-font"));n>=10&&n<=22&&(this.yamlFontPx=n)}catch(n){}}addNode(n,e,t){let i=e??40,l=t??(this.nodes.length?Math.max(...this.nodes.map(k=>k.y))+K+be.gapY:20),p=this.makeNode(n,i,l);this.nodes=[...this.nodes,p],this.selectNode(p),this.refreshYaml()}arrange(){let n=ge(this.nodes.map(e=>({key:e.id,dependsOn:e.dependsOn})),be);for(let e of this.nodes){let t=n.positions.get(e.id);t&&(e.x=t.x+40,e.y=t.y+20)}}arrangeVertical(){this.arrange()}selectNode(n){this.selectedNode=n}closeInspector(){this.selectedNode=void 0}renameSelectedNode(n){if(!this.selectedNode)return;let e=O(n);if(!e)return;let t=this.selectedNode.id;if(t!==e){if(this.nodes.some(i=>i.id===e)){this.setStatus(`Node ID already exists: ${e}`,"error");return}this.selectedNode.id=e;for(let i of this.nodes)i.dependsOn=i.dependsOn.map(l=>l===t?e:l);this.refreshYaml()}}toggleDependency(n,e){if(!this.selectedNode)return;e.target.checked?this.selectedNode.dependsOn=[...new Set([...this.selectedNode.dependsOn,n])]:this.selectedNode.dependsOn=this.selectedNode.dependsOn.filter(i=>i!==n),this.refreshYaml()}deleteSelectedNode(){if(!this.selectedNode)return;let n=this.selectedNode.id;this.nodes=this.nodes.filter(e=>e.id!==n).map(e=>x(b({},e),{dependsOn:e.dependsOn.filter(t=>t!==n)})),this.selectedNode=this.nodes[0],this.refreshYaml()}loadWorkflow(n){this.api.getWorkflow(n).subscribe(e=>{let t=e.id.lastIndexOf("/");this.workflowFolder=t>=0?e.id.slice(0,t):"",this.workflowName=t>=0?e.id.slice(t+1):e.id,this.description=e.description||"Workflow loaded from disk",this.nodes=e.nodes.map(i=>({id:i.id,type:i.type,title:i.id,content:i.content,dependsOn:i.dependsOn,provider:i.provider??"",model:i.model??"",x:0,y:0})),this.arrange(),this.selectedNode=this.nodes[0],this.setStatus(`Loaded ${e.name}`),this.refreshYaml()})}saveWorkflow(){this.saveCurrentWorkflow()}runWorkflow(){this.saveCurrentWorkflow(n=>{this.api.startRun(n,"").subscribe({next:e=>this.router.navigate(["/runs",e.runId]),error:e=>this.setStatus(e?.error?.error??e?.message??"Run failed","error")})})}refreshYaml(){this.yamlPreview=Ke(this.workflowName,this.description,this.nodes),this.saveState==="saved"&&(this.saveState="idle")}get dependencyCandidates(){return this.selectedNode?this.nodes.filter(n=>n.id!==this.selectedNode.id):[]}get edges(){let n=new Map(this.nodes.map(t=>[t.id,t])),e=[];for(let t of this.nodes)for(let i of t.dependsOn){let l=n.get(i);l&&e.push({x1:l.x+j/2,y1:l.y+K,x2:t.x+j/2,y2:t.y})}return e}iconFor(n){switch(n){case"bash":return"$";case"command":return"/";case"prompt":return"AI"}}statusClass(n){switch(n){case"completed":return"status-completed";case"failed":return"status-failed";case"running":return"status-running";default:return"status-default"}}saveCurrentWorkflow(n){let e=O(this.workflowName),t=q(this.workflowFolder),i=t?`${t}/${e}`:e;if(!e||this.nodes.length===0){this.setStatus("Workflow name and at least one node are required.","error");return}this.workflowName=e,this.refreshYaml(),this.saveState="saving",this.api.saveWorkflow(i,this.yamlPreview).subscribe({next:()=>{this.saveState="saved",this.setStatus(`Saved ${i}`),this.refreshData(),n?.(i)},error:l=>{this.saveState="error",this.setStatus(l?.error?.error??l?.message??"Save failed","error")}})}makeNode(n,e,t,i=n){let l=qe(this.nodes.map(p=>p.id),`${n}-${i}`);return{id:l,type:n,title:l,content:je(n,l),dependsOn:[],provider:"",model:"",x:e,y:t}}setStatus(n,e="idle"){this.statusMessage=n,this.saveState=e}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=T({type:a,selectors:[["app-workflow-builder"]],viewQuery:function(e,t){if(e&1&&I(We,5),e&2){let i;V(i=D())&&(t.canvasContent=i.first)}},decls:78,vars:28,consts:[["canvasContent",""],[1,"builder-shell"],[1,"sidebar"],[1,"brand-row"],[1,"brand-mark"],[1,"brand-title"],[1,"brand-subtitle"],["for","workflow-folder",1,"field-label"],["id","workflow-folder","placeholder","e.g. sdlc/release",1,"text-input",3,"ngModelChange","ngModel"],["for","workflow-name",1,"field-label"],["id","workflow-name",1,"text-input",3,"ngModelChange","ngModel"],["for","workflow-description",1,"field-label"],["id","workflow-description","rows","3",1,"text-area",3,"ngModelChange","ngModel"],[1,"section-title"],["type","button","class","palette-item","draggable","true",3,"dragstart","click",4,"ngFor","ngForOf"],["type","button","class","workflow-link",3,"click",4,"ngFor","ngForOf"],["open","",1,"runs-details"],["class","run-row",3,"routerLink",4,"ngFor","ngForOf"],["class","muted",4,"ngIf"],[1,"workspace"],[1,"toolbar"],[1,"toolbar-actions"],["type","button",1,"ghost-button",3,"click"],["type","button",1,"primary-button",3,"click","disabled"],["type","button",1,"run-button",3,"click","disabled"],["class","status-row",3,"error",4,"ngIf"],[1,"workspace-split"],["storageKey","wf-builder-split","leftTitle","Canvas","rightTitle","Workflow YAML"],["sp-left","",1,"canvas-wrap"],[1,"canvas-grid"],[1,"canvas-zoom"],["type","button","aria-label","Zoom out",3,"click"],["type","button","aria-label","Zoom in",3,"click"],["type","button","aria-label","Fit to view",1,"fit",3,"click"],[1,"canvas",3,"dragover","drop","wheel"],["class","empty-state",4,"ngIf"],[1,"canvas-content"],["aria-hidden","true",1,"edges"],[4,"ngFor","ngForOf"],["type","button","class","node-card","draggable","true",3,"selected","left","top","click","dragstart",4,"ngFor","ngForOf"],["class","inspector-drawer",4,"ngIf"],["sp-right","",1,"yaml-wrap"],[1,"yaml-fontctl"],["type","button","aria-label","Decrease YAML font size","title","Smaller",3,"click"],["type","button","aria-label","Increase YAML font size","title","Larger",3,"click"],[1,"yaml-editor",3,"ngModelChange","ngModel"],["type","button","draggable","true",1,"palette-item",3,"dragstart","click"],[1,"palette-icon"],["type","button",1,"workflow-link",3,"click"],[1,"run-row",3,"routerLink"],[1,"muted"],[1,"status-row"],[1,"empty-state"],["type","button","draggable","true",1,"node-card",3,"click","dragstart"],[1,"node-kind"],[1,"node-copy"],[1,"inspector-drawer"],[1,"drawer-hd"],[1,"panel-title"],["type","button","title","Close",1,"icon-button",3,"click"],["for","node-id",1,"field-label"],["id","node-id",1,"text-input",3,"ngModelChange","ngModel"],["for","node-type",1,"field-label"],["id","node-type",1,"text-input",3,"ngModelChange","ngModel"],["value","bash"],["value","command"],["value","prompt"],["for","node-content",1,"field-label"],["id","node-content","rows","7",1,"text-area","mono",3,"ngModelChange","ngModel"],["for","node-provider",1,"field-label"],["id","node-provider",1,"text-input",3,"ngModelChange","ngModel"],["value",""],[3,"value","disabled",4,"ngFor","ngForOf"],["for","node-model",1,"field-label"],["id","node-model","list","builder-model-suggestions","placeholder","(inherit)",1,"text-input",3,"ngModelChange","ngModel"],["id","builder-model-suggestions"],[3,"value",4,"ngFor","ngForOf"],[1,"field-label"],["class","check-row",4,"ngFor","ngForOf"],["type","button",1,"danger-button",3,"click"],[3,"value","disabled"],[3,"value"],[1,"check-row"],["type","checkbox",3,"change","checked"]],template:function(e,t){if(e&1){let i=w();o(0,"section",1)(1,"aside",2)(2,"div",3)(3,"div",4),s(4,"V"),r(),o(5,"div")(6,"div",5),s(7,"VSAF Builder"),r(),o(8,"div",6),s(9,"Workflow canvas"),r()()(),o(10,"label",7),s(11,"Folder"),r(),o(12,"input",8),y("ngModelChange",function(p){return g(i),v(t.workflowFolder,p)||(t.workflowFolder=p),f(p)}),r(),o(13,"label",9),s(14,"Workflow name"),r(),o(15,"input",10),y("ngModelChange",function(p){return g(i),v(t.workflowName,p)||(t.workflowName=p),f(p)}),c("ngModelChange",function(){return t.refreshYaml()}),r(),o(16,"label",11),s(17,"Description"),r(),o(18,"textarea",12),y("ngModelChange",function(p){return g(i),v(t.description,p)||(t.description=p),f(p)}),c("ngModelChange",function(){return t.refreshYaml()}),r(),o(19,"div",13),s(20,"Node Palette"),r(),_(21,Be,8,3,"button",14),o(22,"div",13),s(23,"Existing"),r(),_(24,Ie,5,2,"button",15),o(25,"details",16)(26,"summary",13),s(27,"Recent Runs"),r(),_(28,Ve,8,8,"a",17)(29,De,2,0,"p",18),r()(),o(30,"main",19)(31,"header",20)(32,"div")(33,"h1"),s(34),r(),o(35,"p"),s(36),r()(),o(37,"div",21)(38,"button",22),c("click",function(){return t.resetBuilder()}),s(39,"New"),r(),o(40,"button",22),c("click",function(){return t.refreshData()}),s(41,"Reload"),r(),o(42,"button",22),c("click",function(){return t.arrangeVertical()}),s(43,"Arrange"),r(),o(44,"button",23),c("click",function(){return t.saveWorkflow()}),s(45),r(),o(46,"button",24),c("click",function(){return t.runWorkflow()}),s(47,"Run"),r()()(),_(48,Fe,2,3,"div",25),o(49,"div",26)(50,"app-split-pane",27)(51,"div",28),B(52,"div",29),o(53,"div",30)(54,"button",31),c("click",function(){return t.zoomBy(.8)}),s(55,"\u2212"),r(),o(56,"span"),s(57),Z(58,"number"),r(),o(59,"button",32),c("click",function(){return t.zoomBy(1.25)}),s(60,"+"),r(),o(61,"button",33),c("click",function(){return t.zoomFit()}),s(62,"fit"),r()(),o(63,"section",34),c("dragover",function(p){return t.onCanvasDragOver(p)})("drop",function(p){return t.onCanvasDrop(p)})("wheel",function(p){return t.onCanvasWheel(p)}),_(64,ze,5,0,"div",35),o(65,"div",36,0),Y(),o(67,"svg",37),_(68,Re,1,4,"line",38),r(),_(69,Le,8,10,"button",39),r()(),_(70,He,37,8,"aside",40),r(),X(),o(71,"div",41)(72,"div",42)(73,"button",43),c("click",function(){return t.setYamlFont(-1)}),s(74,"A\u2212"),r(),o(75,"button",44),c("click",function(){return t.setYamlFont(1)}),s(76,"A+"),r()(),o(77,"textarea",45),y("ngModelChange",function(p){return g(i),v(t.yamlPreview,p)||(t.yamlPreview=p),f(p)}),r()()()()()()}e&2&&(d(12),C("ngModel",t.workflowFolder),d(3),C("ngModel",t.workflowName),d(3),C("ngModel",t.description),d(3),m("ngForOf",t.palette),d(3),m("ngForOf",t.workflows),d(4),m("ngForOf",t.runs),d(),m("ngIf",t.runs.length===0),d(5),h(t.workflowId||"untitled-workflow"),d(2),P("",t.nodes.length," nodes \xB7 drag from palette or click a node to edit"),d(8),m("disabled",t.saveState==="saving"),d(),P(" ",t.saveState==="saving"?"Saving...":"Save Workflow"," "),d(),m("disabled",t.nodes.length===0),d(2),m("ngIf",t.statusMessage),d(9),P("",ee(58,25,t.canvasScale*100,"1.0-0"),"%"),d(7),m("ngIf",t.nodes.length===0),d(),M("transform","scale("+t.canvasScale+")"),d(3),m("ngForOf",t.edges),d(),m("ngForOf",t.nodes),d(),m("ngIf",t.selectedNode),d(7),M("font-size",t.yamlFontPx,"px")("line-height",1.5),C("ngModel",t.yamlPreview))},dependencies:[z,te,F,me,pe,ce,ae,de,le,se,re,L,ne],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}button[_ngcontent-%COMP%], input[_ngcontent-%COMP%], textarea[_ngcontent-%COMP%], select[_ngcontent-%COMP%]{font:inherit}.builder-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:280px minmax(0,1fr);min-height:calc(100vh - 56px)}.sidebar[_ngcontent-%COMP%]{border-right:1px solid #2b2d33;background:#17181d;padding:16px;overflow:auto}.brand-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;margin-bottom:22px}.brand-mark[_ngcontent-%COMP%]{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;background:#6366f1;color:#fff;font-weight:700}.brand-title[_ngcontent-%COMP%]{font-size:15px;font-weight:700}.brand-subtitle[_ngcontent-%COMP%], .muted[_ngcontent-%COMP%], small[_ngcontent-%COMP%]{color:#9ca3af}.field-label[_ngcontent-%COMP%], .section-title[_ngcontent-%COMP%]{display:block;margin:14px 0 7px;color:#a1a1aa;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.text-input[_ngcontent-%COMP%], .text-area[_ngcontent-%COMP%]{width:100%;box-sizing:border-box;border:1px solid #333640;border-radius:7px;background:#101114;color:#f4f4f5;padding:9px 10px;outline:none}.text-input[_ngcontent-%COMP%]:focus, .text-area[_ngcontent-%COMP%]:focus, .yaml-editor[_ngcontent-%COMP%]:focus{border-color:#6366f1;box-shadow:0 0 0 2px #6366f12e}.text-area[_ngcontent-%COMP%]{resize:vertical}.mono[_ngcontent-%COMP%], .yaml-editor[_ngcontent-%COMP%]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.palette-item[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;width:100%;border:1px solid #2b2d33;border-radius:8px;background:#1f2128;color:#e7e7ea;padding:10px;margin-bottom:8px;text-align:left;cursor:grab}.palette-item[_ngcontent-%COMP%]:hover, .workflow-link[_ngcontent-%COMP%]:hover{border-color:#4f46e5;background:#242633}.palette-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:28px;height:28px;border-radius:7px;background:#111827;color:#a5b4fc}.palette-item[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;font-size:13px}.palette-item[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .workflow-link[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block;font-size:11px;margin-top:2px}.workflow-link[_ngcontent-%COMP%]{justify-content:space-between;cursor:pointer}.runs-details[_ngcontent-%COMP%]{margin-top:8px}.runs-details[_ngcontent-%COMP%] > summary[_ngcontent-%COMP%]{cursor:pointer;list-style:revert}.workspace[_ngcontent-%COMP%]{min-width:0;padding:18px;display:flex;flex-direction:column;min-height:0}.toolbar[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:12px}.toolbar[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0;font-size:20px}.toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0 0;color:#9ca3af;font-size:13px}.toolbar-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-wrap:wrap}.ghost-button[_ngcontent-%COMP%], .primary-button[_ngcontent-%COMP%], .run-button[_ngcontent-%COMP%], .danger-button[_ngcontent-%COMP%]{border:1px solid #333640;border-radius:7px;padding:8px 12px;color:#f4f4f5;background:#20222a;cursor:pointer}.primary-button[_ngcontent-%COMP%]{background:#4f46e5;border-color:#4f46e5}.run-button[_ngcontent-%COMP%]{background:#059669;border-color:#059669}.danger-button[_ngcontent-%COMP%]{width:100%;margin-top:14px;background:#3f1d24;border-color:#7f1d1d;color:#fecaca}.primary-button[_ngcontent-%COMP%]:disabled, .run-button[_ngcontent-%COMP%]:disabled{opacity:.55;cursor:not-allowed}.status-row[_ngcontent-%COMP%]{border:1px solid #1f5f45;border-radius:8px;background:#092d22;color:#a7f3d0;padding:10px 12px;margin-bottom:12px;font-size:13px}.status-row.error[_ngcontent-%COMP%]{border-color:#7f1d1d;background:#2a1217;color:#fecaca}.workspace-split[_ngcontent-%COMP%]{flex:1;min-height:470px}.canvas-wrap[_ngcontent-%COMP%]{position:relative;height:100%;min-height:470px;background:#15161b}.canvas[_ngcontent-%COMP%]{position:absolute;inset:0;overflow:auto;border:0;border-radius:0;background:transparent;z-index:1}.canvas-content[_ngcontent-%COMP%]{position:relative;width:3000px;height:2000px;transform-origin:0 0}.canvas-zoom[_ngcontent-%COMP%]{position:absolute;top:8px;left:8px;z-index:6;display:flex;align-items:center;gap:4px;background:#17181dd9;border:1px solid #2b2d33;border-radius:8px;padding:4px 6px}.canvas-zoom[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #333640;background:#20222a;color:#e7e7ea;border-radius:6px;min-width:24px;height:24px;cursor:pointer;font-size:13px}.canvas-zoom[_ngcontent-%COMP%] .fit[_ngcontent-%COMP%]{width:auto;padding:0 8px;font-size:11px}.canvas-zoom[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#9ca3af;font-size:11px;min-width:34px;text-align:center;font-family:ui-monospace,monospace}.inspector-drawer[_ngcontent-%COMP%]{position:absolute;top:0;right:0;bottom:0;width:min(360px,72%);background:#17181d;border-left:1px solid #2b2d33;box-shadow:-14px 0 30px #0006;padding:14px;overflow:auto;z-index:5}.drawer-hd[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.icon-button[_ngcontent-%COMP%]{border:0;background:transparent;color:#9ca3af;cursor:pointer;font-size:15px;line-height:1}.icon-button[_ngcontent-%COMP%]:hover{color:#e7e7ea}.canvas-grid[_ngcontent-%COMP%]{position:absolute;inset:0;z-index:0;pointer-events:none;background-image:linear-gradient(#24262e 1px,transparent 1px),linear-gradient(90deg,#24262e 1px,transparent 1px);background-size:28px 28px;opacity:.45}.empty-state[_ngcontent-%COMP%]{position:absolute;inset:0;display:grid;place-content:center;text-align:center;color:#9ca3af;pointer-events:none}.empty-state[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0 0 6px;color:#e7e7ea}.edges[_ngcontent-%COMP%]{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.edges[_ngcontent-%COMP%] line[_ngcontent-%COMP%]{stroke:#6366f1;stroke-width:2;stroke-dasharray:5 5;opacity:.8}.node-card[_ngcontent-%COMP%]{position:absolute;z-index:2;display:flex;align-items:center;gap:10px;width:190px;border:1px solid #3f4250;border-radius:8px;background:#20222a;color:#f4f4f5;padding:11px;cursor:move;text-align:left;box-shadow:0 12px 28px #00000038}.node-card.selected[_ngcontent-%COMP%]{border-color:#818cf8;box-shadow:0 0 0 2px #6366f147,0 12px 28px #00000038}.node-kind[_ngcontent-%COMP%]{display:grid;place-items:center;width:30px;height:30px;border-radius:7px;background:#111827;color:#a5b4fc}.node-copy[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .node-copy[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.node-copy[_ngcontent-%COMP%]{min-width:0}.panel-title[_ngcontent-%COMP%]{margin-bottom:12px;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:#d4d4d8}.check-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:8px 0;color:#d4d4d8;font-size:13px}.yaml-editor[_ngcontent-%COMP%]{width:100%;min-height:260px;box-sizing:border-box;border:1px solid #333640;border-radius:7px;background:#0f1014;color:#d4d4d8;padding:12px;resize:vertical}.yaml-wrap[_ngcontent-%COMP%]{height:100%;position:relative}.yaml-fontctl[_ngcontent-%COMP%]{position:absolute;top:6px;right:10px;z-index:6;display:flex;gap:4px}.yaml-fontctl[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #333640;background:#17181dd9;color:#e7e7ea;border-radius:6px;min-width:28px;height:24px;cursor:pointer;font-size:12px}.yaml-wrap[_ngcontent-%COMP%] .yaml-editor[_ngcontent-%COMP%]{width:100%;height:100%;min-height:0;box-sizing:border-box;border:0;border-radius:0;resize:none}.run-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:10px 0;color:#e7e7ea;text-decoration:none;border-bottom:1px solid #252730}.run-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .run-row[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block}.run-row[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.status-completed[_ngcontent-%COMP%]{color:#34d399}.status-failed[_ngcontent-%COMP%]{color:#f87171}.status-running[_ngcontent-%COMP%]{color:#60a5fa}.status-default[_ngcontent-%COMP%]{color:#a1a1aa}@media(max-width:980px){.builder-shell[_ngcontent-%COMP%]{grid-template-columns:1fr}.sidebar[_ngcontent-%COMP%]{border-right:0;border-bottom:1px solid #2b2d33}.toolbar[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}}"]})};function je(a,n){switch(a){case"bash":return`echo "${n}"`;case"command":return n;case"prompt":return`Complete ${n} and summarize the result.`}}var be={nodeW:190,nodeH:56,gapX:40,gapY:48},j=190,K=56,xe="claude";function Ke(a,n,e){let t=[`name: ${O(a)||"new-workflow"}`,`description: ${Q(n||"Draft workflow")}`,`provider: ${xe}`,"model: sonnet","nodes:"];for(let i of e)if(t.push(` - id: ${i.id}`),i.dependsOn.length>0&&t.push(` depends_on: [${i.dependsOn.join(", ")}]`),i.provider&&t.push(` provider: ${i.provider}`),i.model&&t.push(` model: ${i.model}`),i.type==="bash")t.push(` bash: ${Q(i.content||"echo ok")}`);else if(i.type==="command")t.push(` command: ${Q(i.content||i.id)}`);else{t.push(" prompt: |");for(let l of(i.content||`Complete ${i.id}`).split(`
2
2
  `))t.push(` ${l}`)}return`${t.join(`
3
3
  `)}
4
4
  `}function O(a){return a.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function q(a){return a.split("/").map(O).filter(Boolean).join("/")}function qe(a,n){let e=O(n)||"node";if(!a.includes(e))return e;let t=2;for(;a.includes(`${e}-${t}`);)t++;return`${e}-${t}`}function Q(a){return JSON.stringify(a)}export{_e as WorkflowBuilderComponent};
@@ -1 +1 @@
1
- import{e as j}from"./chunk-N3FOQ3O5.js";import{a as U,b as W,e as H,g as q,h as G,i as J,j as K,k as Q}from"./chunk-7ELOO4IC.js";import{Ba as F,Fa as u,Ka as h,Lb as N,Mb as $,Nb as z,O as A,Ob as B,Qa as l,Qb as V,Ra as r,Sa as a,T as x,Ta as L,U as f,Wa as S,Xa as y,Ya as v,Za as p,eb as b,gb as R,ib as o,jb as c,kb as I,mb as k,nb as E,ob as D,qa as s,rb as _,sb as C,tb as O,ub as M,z as P}from"./chunk-4R37VVI4.js";function Z(n){switch(n){case"running":return["view","cancel"];case"paused":return["view","answer","approve","reject","abandon"];case"completed":return["view","delete"];case"failed":return["view","resume","delete"];case"cancelled":return["view","delete"];default:return["view"]}}function T(n,e){return e==="history"?[]:Z(n)}var w=n=>["/runs",n],Y=n=>({$implicit:n});function tt(n,e){if(n&1&&(r(0,"div",28),o(1),a()),n&2){let t=p();s(),c(t.error)}}function et(n,e){if(n&1){let t=y();r(0,"button",29),v("click",function(){let d=x(t).$implicit,g=p();return f(g.filter=d.status)}),L(1,"span",30),r(2,"span"),o(3),a(),r(4,"strong"),o(5),a()()}if(n&2){let t=e.$implicit,i=p();R("active",i.filter===t.status),s(),h("data-status",t.status),s(2),c(t.label),s(2),c(i.count(t.status))}}function nt(n,e){n&1&&S(0)}function rt(n,e){if(n&1&&(r(0,"article",33)(1,"div",34)(2,"div")(3,"a",35),o(4),a(),r(5,"code"),o(6),a()(),r(7,"span",36),o(8),a()(),r(9,"div",37)(10,"span"),o(11),C(12,"date"),a(),r(13,"span"),o(14),a()(),u(15,nt,1,0,"ng-container",38),a()),n&2){let t=e.$implicit,i=p(2),d=b(66);s(3),l("routerLink",_(12,w,t.runId)),s(),c(t.workflow),s(2),c(t.runId),s(),h("data-status",t.status),s(),c(t.status),s(3),I("Started ",O(12,9,t.startedAt,"medium")),s(3),c(i.elapsed(t)),s(),l("ngTemplateOutlet",d)("ngTemplateOutletContext",_(14,Y,t))}}function at(n,e){if(n&1&&(r(0,"div",31),u(1,rt,16,16,"article",32),a()),n&2){let t=p();s(),l("ngForOf",t.activeRuns)("ngForTrackBy",t.trackRun)}}function it(n,e){n&1&&(r(0,"div",39),o(1,"No active runs."),a())}function ot(n,e){if(n&1&&(r(0,"a",35),o(1),a()),n&2){let t=p().$implicit;l("routerLink",_(2,w,t.runId)),s(),c(t.workflow)}}function st(n,e){if(n&1&&(r(0,"span",42),o(1),a()),n&2){let t=p().$implicit;s(),c(t.workflow)}}function lt(n,e){n&1&&(r(0,"span",43),o(1,"history"),a())}function ct(n,e){n&1&&S(0)}function dt(n,e){if(n&1&&(r(0,"tr")(1,"td"),u(2,ot,2,4,"a",40)(3,st,2,1,"ng-template",null,2,M),r(5,"code"),o(6),a()(),r(7,"td")(8,"span",36),o(9),a(),u(10,lt,2,0,"span",41),a(),r(11,"td"),o(12),C(13,"date"),a(),r(14,"td"),o(15),a(),r(16,"td"),u(17,ct,1,0,"ng-container",38),a()()),n&2){let t=e.$implicit,i=b(4),d=p(),g=b(66);s(2),l("ngIf",t.source!=="history")("ngIfElse",i),s(4),c(t.runId),s(2),h("data-status",t.status),s(),c(t.status),s(),l("ngIf",t.source==="history"),s(2),c(O(13,10,t.startedAt,"medium")),s(3),c(d.elapsed(t)),s(2),l("ngTemplateOutlet",g)("ngTemplateOutletContext",_(13,Y,t))}}function pt(n,e){n&1&&(r(0,"tr")(1,"td",44),o(2,"No runs match the current filters."),a()())}function ut(n,e){if(n&1&&(r(0,"a",49),o(1,"View"),a()),n&2){let t=p().$implicit;l("routerLink",_(1,w,t.runId))}}function mt(n,e){if(n&1&&(r(0,"a",50),o(1,"Answer"),a()),n&2){let t=p().$implicit;l("routerLink",_(1,w,t.runId))}}function gt(n,e){if(n&1){let t=y();r(0,"button",51),v("click",function(){let d=x(t).$implicit,g=p().$implicit,m=p();return f(m.perform(g,d))}),o(1),a()}if(n&2){let t=e.$implicit,i=p().$implicit,d=p();R("danger",t==="delete"),l("disabled",d.busyRun===i.runId),s(),c(d.actionLabels[t])}}function _t(n,e){if(n&1&&(r(0,"div",45),u(1,ut,2,3,"a",46)(2,mt,2,3,"a",47)(3,gt,2,4,"button",48),a()),n&2){let t=e.$implicit,i=p();s(),l("ngIf",i.can(t,"view")),s(),l("ngIf",i.can(t,"answer")),s(),l("ngForOf",i.buttonActions(t))}}var X=class n{api=A(Q);refreshTimer;runs=[];filter="all";search="";dateRange="all";loading=!1;error="";busyRun="";lastUpdated;statusItems=[{status:"all",label:"All"},{status:"running",label:"Running"},{status:"paused",label:"Paused"},{status:"completed",label:"Completed"},{status:"failed",label:"Failed"},{status:"cancelled",label:"Cancelled"}];ngOnInit(){this.loadRuns(),this.refreshTimer=setInterval(()=>this.loadRuns(!1),5e3)}ngOnDestroy(){this.refreshTimer&&clearInterval(this.refreshTimer)}get filteredRuns(){let e=this.search.trim().toLowerCase(),t=this.cutoffDate();return this.runs.filter(i=>(this.filter==="all"||i.status===this.filter)&&(!e||i.workflow.toLowerCase().includes(e)||i.runId.toLowerCase().includes(e))&&(!t||new Date(i.startedAt)>=t))}get activeRuns(){return this.filteredRuns.filter(e=>e.status==="running"||e.status==="paused")}get historyRuns(){return this.filteredRuns.filter(e=>e.status!=="running"&&e.status!=="paused")}loadRuns(e=!0){e&&(this.loading=!0),this.api.getRuns().pipe(P(()=>this.loading=!1)).subscribe({next:t=>{this.runs=t,this.lastUpdated=new Date,this.error=""},error:t=>this.error=t?.error?.error??"Unable to load workflow runs."})}count(e){return e==="all"?this.runs.length:this.runs.filter(t=>t.status===e).length}trackRun(e,t){return t.runId}elapsed(e){let t=e.durationMs??new Date(e.completedAt??Date.now()).getTime()-new Date(e.startedAt).getTime();return t<6e4?`${Math.max(0,Math.round(t/1e3))}s`:t<36e5?`${Math.round(t/6e4)}m`:`${(t/36e5).toFixed(1)}h`}actionLabels={cancel:"Cancel",abandon:"Abandon",approve:"Approve",reject:"Reject",resume:"Resume",delete:"Delete"};buttonActions(e){return T(e.status,e.source).filter(t=>t!=="view"&&t!=="answer")}can(e,t){return T(e.status,e.source).includes(t)}perform(e,t){if(!this.can(e,t)||["cancel","abandon","delete","reject"].includes(t)&&!confirm(`${t} run ${e.runId}?`))return;let i=t==="reject"?prompt("Rejection reason","Rejected by operator")??void 0:void 0;t==="reject"&&i===void 0||(this.busyRun=e.runId,this.error="",this.api.runAction(e.runId,t,i).pipe(P(()=>this.busyRun="")).subscribe({next:()=>this.loadRuns(!1),error:d=>this.error=d?.error?.error??`Unable to ${t} run.`}))}cutoffDate(){if(this.dateRange==="all")return;let e=new Date;return this.dateRange==="today"?e.setHours(0,0,0,0):e.setDate(e.getDate()-Number(this.dateRange.slice(0,-1))),e}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=F({type:n,selectors:[["app-dashboard"]],decls:67,vars:17,consts:[["noActive",""],["actions",""],["plainName",""],[1,"dashboard"],[1,"page-header"],[1,"eyebrow"],[1,"subtitle"],[1,"header-actions"],[1,"updated"],["type","button",1,"button","secondary",3,"click","disabled"],["routerLink","/workflows/builder",1,"button","primary"],["class","error-banner",4,"ngIf"],["role","group","aria-label","Run status filters",1,"summary"],["type","button","class","summary-item",3,"active","click",4,"ngFor","ngForOf"],[1,"controls"],["type","search","placeholder","Search workflow or run ID",1,"search",3,"ngModelChange","ngModel"],["aria-label","Date range",3,"ngModelChange","ngModel"],["value","all"],["value","today"],["value","7d"],["value","30d"],[1,"capacity"],[1,"run-section"],[1,"section-heading"],["class","active-grid",4,"ngIf","ngIfElse"],[1,"table-wrap"],[4,"ngFor","ngForOf","ngForTrackBy"],[4,"ngIf"],[1,"error-banner"],["type","button",1,"summary-item",3,"click"],[1,"status-dot"],[1,"active-grid"],["class","run-card",4,"ngFor","ngForOf","ngForTrackBy"],[1,"run-card"],[1,"run-title"],[3,"routerLink"],[1,"badge"],[1,"run-meta"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"empty"],[3,"routerLink",4,"ngIf","ngIfElse"],["class","history-tag",4,"ngIf"],[1,"run-name"],[1,"history-tag"],["colspan","5",1,"empty"],[1,"actions"],["class","icon-button","title","Open run",3,"routerLink",4,"ngIf"],["class","icon-button answer","fragment","answer","title","Answer the pending question",3,"routerLink",4,"ngIf"],["type","button",3,"danger","disabled","click",4,"ngFor","ngForOf"],["title","Open run",1,"icon-button",3,"routerLink"],["fragment","answer","title","Answer the pending question",1,"icon-button","answer",3,"routerLink"],["type","button",3,"click","disabled"]],template:function(t,i){if(t&1){let d=y();r(0,"section",3)(1,"header",4)(2,"div")(3,"p",5),o(4,"Mission Control"),a(),r(5,"h1"),o(6,"Dashboard"),a(),r(7,"p",6),o(8,"Monitor workflow execution and control run lifecycle."),a()(),r(9,"div",7)(10,"span",8),o(11),C(12,"date"),a(),r(13,"button",9),v("click",function(){return i.loadRuns()}),o(14,"Refresh"),a(),r(15,"a",10),o(16,"New workflow"),a()()(),u(17,tt,2,1,"div",11),r(18,"div",12),u(19,et,6,5,"button",13),a(),r(20,"div",14)(21,"input",15),D("ngModelChange",function(m){return x(d),E(i.search,m)||(i.search=m),f(m)}),a(),r(22,"select",16),D("ngModelChange",function(m){return x(d),E(i.dateRange,m)||(i.dateRange=m),f(m)}),r(23,"option",17),o(24,"All time"),a(),r(25,"option",18),o(26,"Today"),a(),r(27,"option",19),o(28,"Last 7 days"),a(),r(29,"option",20),o(30,"Last 30 days"),a()(),r(31,"span",21),o(32),a()(),r(33,"section",22)(34,"div",23)(35,"h2"),o(36,"Active runs"),a(),r(37,"span"),o(38),a()(),u(39,at,2,2,"div",24)(40,it,2,0,"ng-template",null,0,M),a(),r(42,"section",22)(43,"div",23)(44,"h2"),o(45,"Run history"),a(),r(46,"span"),o(47),a()(),r(48,"div",25)(49,"table")(50,"thead")(51,"tr")(52,"th"),o(53,"Workflow"),a(),r(54,"th"),o(55,"Status"),a(),r(56,"th"),o(57,"Started"),a(),r(58,"th"),o(59,"Duration"),a(),r(60,"th"),o(61,"Actions"),a()()(),r(62,"tbody"),u(63,dt,18,15,"tr",26)(64,pt,3,0,"tr",27),a()()()()(),u(65,_t,4,3,"ng-template",null,1,M)}if(t&2){let d=b(41);s(11),c(i.lastUpdated?"Updated "+O(12,14,i.lastUpdated,"HH:mm:ss"):"Not updated"),s(2),l("disabled",i.loading),s(4),l("ngIf",i.error),s(2),l("ngForOf",i.statusItems),s(2),k("ngModel",i.search),s(),k("ngModel",i.dateRange),s(10),I("",i.activeRuns.length," active"),s(6),c(i.activeRuns.length),s(),l("ngIf",i.activeRuns.length)("ngIfElse",d),s(8),c(i.historyRuns.length),s(16),l("ngForOf",i.historyRuns)("ngForTrackBy",i.trackRun),s(),l("ngIf",!i.historyRuns.length)}},dependencies:[V,N,$,z,K,G,J,U,q,W,H,j,B],styles:["[_nghost-%COMP%]{display:block}.dashboard[_ngcontent-%COMP%]{max-width:1440px;margin:0 auto;padding:28px 32px 56px}.page-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:24px;align-items:flex-end;margin-bottom:24px}.eyebrow[_ngcontent-%COMP%]{color:var(--primary);font-size:12px;font-weight:700;text-transform:uppercase;margin:0 0 5px}.page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:28px;line-height:1.2;margin:0}.subtitle[_ngcontent-%COMP%]{color:var(--text-secondary);margin:7px 0 0}.header-actions[_ngcontent-%COMP%], .controls[_ngcontent-%COMP%], .actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.updated[_ngcontent-%COMP%]{font-size:12px;color:var(--text-tertiary)}.button[_ngcontent-%COMP%], .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .icon-button[_ngcontent-%COMP%]{border:1px solid var(--border-bright);background:var(--surface);color:var(--text-primary);padding:8px 11px;font:inherit;font-size:12px;text-decoration:none;cursor:pointer;border-radius:5px}.button.primary[_ngcontent-%COMP%]{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground);font-weight:700}.button[_ngcontent-%COMP%]:disabled, .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{opacity:.34;cursor:not-allowed}.error-banner[_ngcontent-%COMP%]{border:1px solid var(--error);background:color-mix(in oklch,var(--error) 12%,var(--surface));padding:10px 12px;margin-bottom:16px;border-radius:5px}.summary[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border:1px solid var(--border);background:var(--surface);border-radius:7px;overflow:hidden}.summary-item[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:8px;min-height:54px;border:0;border-right:1px solid var(--border);background:transparent;color:var(--text-secondary);padding:0 14px;cursor:pointer}.summary-item[_ngcontent-%COMP%]:last-child{border:0}.summary-item.active[_ngcontent-%COMP%]{background:var(--surface-elevated);color:var(--text-primary);box-shadow:inset 0 -2px var(--primary)}.status-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;background:var(--text-tertiary)}.status-dot[data-status=running][_ngcontent-%COMP%], .badge[data-status=running][_ngcontent-%COMP%]{color:var(--primary)}.status-dot[data-status=running][_ngcontent-%COMP%]{background:var(--primary)}.status-dot[data-status=paused][_ngcontent-%COMP%], .badge[data-status=paused][_ngcontent-%COMP%]{color:var(--warning)}.status-dot[data-status=paused][_ngcontent-%COMP%]{background:var(--warning)}.status-dot[data-status=completed][_ngcontent-%COMP%], .badge[data-status=completed][_ngcontent-%COMP%]{color:var(--success)}.status-dot[data-status=completed][_ngcontent-%COMP%]{background:var(--success)}.status-dot[data-status=failed][_ngcontent-%COMP%], .status-dot[data-status=cancelled][_ngcontent-%COMP%]{background:var(--error)}.badge[data-status=failed][_ngcontent-%COMP%], .badge[data-status=cancelled][_ngcontent-%COMP%]{color:var(--error)}.controls[_ngcontent-%COMP%]{margin:18px 0}.search[_ngcontent-%COMP%], select[_ngcontent-%COMP%]{height:38px;border:1px solid var(--border);background:var(--surface);color:var(--text-primary);padding:0 11px;border-radius:5px}.search[_ngcontent-%COMP%]{width:min(390px,100%)}.capacity[_ngcontent-%COMP%]{margin-left:auto;color:var(--text-secondary);font-size:13px}.run-section[_ngcontent-%COMP%]{margin-top:28px}.section-heading[_ngcontent-%COMP%]{display:flex;align-items:center;gap:9px;margin-bottom:12px}.section-heading[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:16px;margin:0}.section-heading[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--text-tertiary);font-size:12px}.active-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:12px}.run-card[_ngcontent-%COMP%]{border:1px solid var(--border);background:var(--surface);padding:16px;border-radius:7px}.run-title[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px}.run-title[_ngcontent-%COMP%] a[_ngcontent-%COMP%], td[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:700;text-decoration:none}.run-title[_ngcontent-%COMP%] code[_ngcontent-%COMP%], td[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;color:var(--text-tertiary);font-size:11px;margin-top:4px}.badge[_ngcontent-%COMP%]{border:1px solid currentColor;height:fit-content;padding:3px 7px;border-radius:4px;font-size:11px;text-transform:uppercase}.history-tag[_ngcontent-%COMP%]{border:1px dashed var(--border-bright);color:var(--text-tertiary);padding:2px 6px;border-radius:4px;font-size:10px;text-transform:uppercase;margin-left:6px}td[_ngcontent-%COMP%] .run-name[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:700}.run-meta[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--text-secondary);font-size:12px;margin:18px 0 14px}.actions[_ngcontent-%COMP%]{flex-wrap:wrap}.actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .icon-button[_ngcontent-%COMP%]{padding:5px 7px}.actions[_ngcontent-%COMP%] .danger[_ngcontent-%COMP%]{color:var(--error)}.icon-button.answer[_ngcontent-%COMP%]{border-color:var(--warning);color:var(--warning);font-weight:700}.table-wrap[_ngcontent-%COMP%]{overflow:auto;border:1px solid var(--border);border-radius:7px}table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background:var(--surface);font-size:13px}th[_ngcontent-%COMP%]{text-align:left;color:var(--text-secondary);font-size:11px;text-transform:uppercase;font-weight:600}th[_ngcontent-%COMP%], td[_ngcontent-%COMP%]{padding:12px 14px;border-bottom:1px solid var(--border);white-space:nowrap}tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%]{border-bottom:0}.empty[_ngcontent-%COMP%]{padding:24px;color:var(--text-tertiary);text-align:center;border:1px dashed var(--border);border-radius:7px}td.empty[_ngcontent-%COMP%]{border:0}.table-wrap[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{min-width:220px}@media(max-width:800px){.dashboard[_ngcontent-%COMP%]{padding:20px 16px}.page-header[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}.summary[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.summary-item[_ngcontent-%COMP%]{border-bottom:1px solid var(--border)}.controls[_ngcontent-%COMP%]{align-items:stretch;flex-wrap:wrap}.search[_ngcontent-%COMP%]{width:100%}.capacity[_ngcontent-%COMP%]{margin-left:0}.active-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}"]})};export{X as DashboardComponent};
1
+ import{e as j}from"./chunk-ZZWA24BS.js";import{a as U,b as W,e as H,g as q,h as G,i as J,j as K,k as Q}from"./chunk-OYL4KDHJ.js";import{Ba as F,Fa as u,Ka as h,Mb as N,Nb as $,O as A,Ob as z,Pb as B,Qa as l,Ra as r,Rb as V,Sa as a,T as x,Ta as L,U as f,Wa as S,Xa as y,Ya as v,Za as p,eb as b,gb as R,ib as o,jb as c,kb as I,nb as k,ob as E,pb as D,qa as s,sb as _,tb as C,ub as O,vb as M,z as P}from"./chunk-RM7DW5FD.js";function Z(n){switch(n){case"running":return["view","cancel"];case"paused":return["view","answer","approve","reject","abandon"];case"completed":return["view","delete"];case"failed":return["view","resume","delete"];case"cancelled":return["view","delete"];default:return["view"]}}function T(n,e){return e==="history"?[]:Z(n)}var w=n=>["/runs",n],Y=n=>({$implicit:n});function tt(n,e){if(n&1&&(r(0,"div",28),o(1),a()),n&2){let t=p();s(),c(t.error)}}function et(n,e){if(n&1){let t=y();r(0,"button",29),v("click",function(){let d=x(t).$implicit,g=p();return f(g.filter=d.status)}),L(1,"span",30),r(2,"span"),o(3),a(),r(4,"strong"),o(5),a()()}if(n&2){let t=e.$implicit,i=p();R("active",i.filter===t.status),s(),h("data-status",t.status),s(2),c(t.label),s(2),c(i.count(t.status))}}function nt(n,e){n&1&&S(0)}function rt(n,e){if(n&1&&(r(0,"article",33)(1,"div",34)(2,"div")(3,"a",35),o(4),a(),r(5,"code"),o(6),a()(),r(7,"span",36),o(8),a()(),r(9,"div",37)(10,"span"),o(11),C(12,"date"),a(),r(13,"span"),o(14),a()(),u(15,nt,1,0,"ng-container",38),a()),n&2){let t=e.$implicit,i=p(2),d=b(66);s(3),l("routerLink",_(12,w,t.runId)),s(),c(t.workflow),s(2),c(t.runId),s(),h("data-status",t.status),s(),c(t.status),s(3),I("Started ",O(12,9,t.startedAt,"medium")),s(3),c(i.elapsed(t)),s(),l("ngTemplateOutlet",d)("ngTemplateOutletContext",_(14,Y,t))}}function at(n,e){if(n&1&&(r(0,"div",31),u(1,rt,16,16,"article",32),a()),n&2){let t=p();s(),l("ngForOf",t.activeRuns)("ngForTrackBy",t.trackRun)}}function it(n,e){n&1&&(r(0,"div",39),o(1,"No active runs."),a())}function ot(n,e){if(n&1&&(r(0,"a",35),o(1),a()),n&2){let t=p().$implicit;l("routerLink",_(2,w,t.runId)),s(),c(t.workflow)}}function st(n,e){if(n&1&&(r(0,"span",42),o(1),a()),n&2){let t=p().$implicit;s(),c(t.workflow)}}function lt(n,e){n&1&&(r(0,"span",43),o(1,"history"),a())}function ct(n,e){n&1&&S(0)}function dt(n,e){if(n&1&&(r(0,"tr")(1,"td"),u(2,ot,2,4,"a",40)(3,st,2,1,"ng-template",null,2,M),r(5,"code"),o(6),a()(),r(7,"td")(8,"span",36),o(9),a(),u(10,lt,2,0,"span",41),a(),r(11,"td"),o(12),C(13,"date"),a(),r(14,"td"),o(15),a(),r(16,"td"),u(17,ct,1,0,"ng-container",38),a()()),n&2){let t=e.$implicit,i=b(4),d=p(),g=b(66);s(2),l("ngIf",t.source!=="history")("ngIfElse",i),s(4),c(t.runId),s(2),h("data-status",t.status),s(),c(t.status),s(),l("ngIf",t.source==="history"),s(2),c(O(13,10,t.startedAt,"medium")),s(3),c(d.elapsed(t)),s(2),l("ngTemplateOutlet",g)("ngTemplateOutletContext",_(13,Y,t))}}function pt(n,e){n&1&&(r(0,"tr")(1,"td",44),o(2,"No runs match the current filters."),a()())}function ut(n,e){if(n&1&&(r(0,"a",49),o(1,"View"),a()),n&2){let t=p().$implicit;l("routerLink",_(1,w,t.runId))}}function mt(n,e){if(n&1&&(r(0,"a",50),o(1,"Answer"),a()),n&2){let t=p().$implicit;l("routerLink",_(1,w,t.runId))}}function gt(n,e){if(n&1){let t=y();r(0,"button",51),v("click",function(){let d=x(t).$implicit,g=p().$implicit,m=p();return f(m.perform(g,d))}),o(1),a()}if(n&2){let t=e.$implicit,i=p().$implicit,d=p();R("danger",t==="delete"),l("disabled",d.busyRun===i.runId),s(),c(d.actionLabels[t])}}function _t(n,e){if(n&1&&(r(0,"div",45),u(1,ut,2,3,"a",46)(2,mt,2,3,"a",47)(3,gt,2,4,"button",48),a()),n&2){let t=e.$implicit,i=p();s(),l("ngIf",i.can(t,"view")),s(),l("ngIf",i.can(t,"answer")),s(),l("ngForOf",i.buttonActions(t))}}var X=class n{api=A(Q);refreshTimer;runs=[];filter="all";search="";dateRange="all";loading=!1;error="";busyRun="";lastUpdated;statusItems=[{status:"all",label:"All"},{status:"running",label:"Running"},{status:"paused",label:"Paused"},{status:"completed",label:"Completed"},{status:"failed",label:"Failed"},{status:"cancelled",label:"Cancelled"}];ngOnInit(){this.loadRuns(),this.refreshTimer=setInterval(()=>this.loadRuns(!1),5e3)}ngOnDestroy(){this.refreshTimer&&clearInterval(this.refreshTimer)}get filteredRuns(){let e=this.search.trim().toLowerCase(),t=this.cutoffDate();return this.runs.filter(i=>(this.filter==="all"||i.status===this.filter)&&(!e||i.workflow.toLowerCase().includes(e)||i.runId.toLowerCase().includes(e))&&(!t||new Date(i.startedAt)>=t))}get activeRuns(){return this.filteredRuns.filter(e=>e.status==="running"||e.status==="paused")}get historyRuns(){return this.filteredRuns.filter(e=>e.status!=="running"&&e.status!=="paused")}loadRuns(e=!0){e&&(this.loading=!0),this.api.getRuns().pipe(P(()=>this.loading=!1)).subscribe({next:t=>{this.runs=t,this.lastUpdated=new Date,this.error=""},error:t=>this.error=t?.error?.error??"Unable to load workflow runs."})}count(e){return e==="all"?this.runs.length:this.runs.filter(t=>t.status===e).length}trackRun(e,t){return t.runId}elapsed(e){let t=e.durationMs??new Date(e.completedAt??Date.now()).getTime()-new Date(e.startedAt).getTime();return t<6e4?`${Math.max(0,Math.round(t/1e3))}s`:t<36e5?`${Math.round(t/6e4)}m`:`${(t/36e5).toFixed(1)}h`}actionLabels={cancel:"Cancel",abandon:"Abandon",approve:"Approve",reject:"Reject",resume:"Resume",delete:"Delete"};buttonActions(e){return T(e.status,e.source).filter(t=>t!=="view"&&t!=="answer")}can(e,t){return T(e.status,e.source).includes(t)}perform(e,t){if(!this.can(e,t)||["cancel","abandon","delete","reject"].includes(t)&&!confirm(`${t} run ${e.runId}?`))return;let i=t==="reject"?prompt("Rejection reason","Rejected by operator")??void 0:void 0;t==="reject"&&i===void 0||(this.busyRun=e.runId,this.error="",this.api.runAction(e.runId,t,i).pipe(P(()=>this.busyRun="")).subscribe({next:()=>this.loadRuns(!1),error:d=>this.error=d?.error?.error??`Unable to ${t} run.`}))}cutoffDate(){if(this.dateRange==="all")return;let e=new Date;return this.dateRange==="today"?e.setHours(0,0,0,0):e.setDate(e.getDate()-Number(this.dateRange.slice(0,-1))),e}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=F({type:n,selectors:[["app-dashboard"]],decls:67,vars:17,consts:[["noActive",""],["actions",""],["plainName",""],[1,"dashboard"],[1,"page-header"],[1,"eyebrow"],[1,"subtitle"],[1,"header-actions"],[1,"updated"],["type","button",1,"button","secondary",3,"click","disabled"],["routerLink","/workflows/builder",1,"button","primary"],["class","error-banner",4,"ngIf"],["role","group","aria-label","Run status filters",1,"summary"],["type","button","class","summary-item",3,"active","click",4,"ngFor","ngForOf"],[1,"controls"],["type","search","placeholder","Search workflow or run ID",1,"search",3,"ngModelChange","ngModel"],["aria-label","Date range",3,"ngModelChange","ngModel"],["value","all"],["value","today"],["value","7d"],["value","30d"],[1,"capacity"],[1,"run-section"],[1,"section-heading"],["class","active-grid",4,"ngIf","ngIfElse"],[1,"table-wrap"],[4,"ngFor","ngForOf","ngForTrackBy"],[4,"ngIf"],[1,"error-banner"],["type","button",1,"summary-item",3,"click"],[1,"status-dot"],[1,"active-grid"],["class","run-card",4,"ngFor","ngForOf","ngForTrackBy"],[1,"run-card"],[1,"run-title"],[3,"routerLink"],[1,"badge"],[1,"run-meta"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"empty"],[3,"routerLink",4,"ngIf","ngIfElse"],["class","history-tag",4,"ngIf"],[1,"run-name"],[1,"history-tag"],["colspan","5",1,"empty"],[1,"actions"],["class","icon-button","title","Open run",3,"routerLink",4,"ngIf"],["class","icon-button answer","fragment","answer","title","Answer the pending question",3,"routerLink",4,"ngIf"],["type","button",3,"danger","disabled","click",4,"ngFor","ngForOf"],["title","Open run",1,"icon-button",3,"routerLink"],["fragment","answer","title","Answer the pending question",1,"icon-button","answer",3,"routerLink"],["type","button",3,"click","disabled"]],template:function(t,i){if(t&1){let d=y();r(0,"section",3)(1,"header",4)(2,"div")(3,"p",5),o(4,"Mission Control"),a(),r(5,"h1"),o(6,"Dashboard"),a(),r(7,"p",6),o(8,"Monitor workflow execution and control run lifecycle."),a()(),r(9,"div",7)(10,"span",8),o(11),C(12,"date"),a(),r(13,"button",9),v("click",function(){return i.loadRuns()}),o(14,"Refresh"),a(),r(15,"a",10),o(16,"New workflow"),a()()(),u(17,tt,2,1,"div",11),r(18,"div",12),u(19,et,6,5,"button",13),a(),r(20,"div",14)(21,"input",15),D("ngModelChange",function(m){return x(d),E(i.search,m)||(i.search=m),f(m)}),a(),r(22,"select",16),D("ngModelChange",function(m){return x(d),E(i.dateRange,m)||(i.dateRange=m),f(m)}),r(23,"option",17),o(24,"All time"),a(),r(25,"option",18),o(26,"Today"),a(),r(27,"option",19),o(28,"Last 7 days"),a(),r(29,"option",20),o(30,"Last 30 days"),a()(),r(31,"span",21),o(32),a()(),r(33,"section",22)(34,"div",23)(35,"h2"),o(36,"Active runs"),a(),r(37,"span"),o(38),a()(),u(39,at,2,2,"div",24)(40,it,2,0,"ng-template",null,0,M),a(),r(42,"section",22)(43,"div",23)(44,"h2"),o(45,"Run history"),a(),r(46,"span"),o(47),a()(),r(48,"div",25)(49,"table")(50,"thead")(51,"tr")(52,"th"),o(53,"Workflow"),a(),r(54,"th"),o(55,"Status"),a(),r(56,"th"),o(57,"Started"),a(),r(58,"th"),o(59,"Duration"),a(),r(60,"th"),o(61,"Actions"),a()()(),r(62,"tbody"),u(63,dt,18,15,"tr",26)(64,pt,3,0,"tr",27),a()()()()(),u(65,_t,4,3,"ng-template",null,1,M)}if(t&2){let d=b(41);s(11),c(i.lastUpdated?"Updated "+O(12,14,i.lastUpdated,"HH:mm:ss"):"Not updated"),s(2),l("disabled",i.loading),s(4),l("ngIf",i.error),s(2),l("ngForOf",i.statusItems),s(2),k("ngModel",i.search),s(),k("ngModel",i.dateRange),s(10),I("",i.activeRuns.length," active"),s(6),c(i.activeRuns.length),s(),l("ngIf",i.activeRuns.length)("ngIfElse",d),s(8),c(i.historyRuns.length),s(16),l("ngForOf",i.historyRuns)("ngForTrackBy",i.trackRun),s(),l("ngIf",!i.historyRuns.length)}},dependencies:[V,N,$,z,K,G,J,U,q,W,H,j,B],styles:["[_nghost-%COMP%]{display:block}.dashboard[_ngcontent-%COMP%]{max-width:1440px;margin:0 auto;padding:28px 32px 56px}.page-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:24px;align-items:flex-end;margin-bottom:24px}.eyebrow[_ngcontent-%COMP%]{color:var(--primary);font-size:12px;font-weight:700;text-transform:uppercase;margin:0 0 5px}.page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:28px;line-height:1.2;margin:0}.subtitle[_ngcontent-%COMP%]{color:var(--text-secondary);margin:7px 0 0}.header-actions[_ngcontent-%COMP%], .controls[_ngcontent-%COMP%], .actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.updated[_ngcontent-%COMP%]{font-size:12px;color:var(--text-tertiary)}.button[_ngcontent-%COMP%], .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .icon-button[_ngcontent-%COMP%]{border:1px solid var(--border-bright);background:var(--surface);color:var(--text-primary);padding:8px 11px;font:inherit;font-size:12px;text-decoration:none;cursor:pointer;border-radius:5px}.button.primary[_ngcontent-%COMP%]{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground);font-weight:700}.button[_ngcontent-%COMP%]:disabled, .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{opacity:.34;cursor:not-allowed}.error-banner[_ngcontent-%COMP%]{border:1px solid var(--error);background:color-mix(in oklch,var(--error) 12%,var(--surface));padding:10px 12px;margin-bottom:16px;border-radius:5px}.summary[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border:1px solid var(--border);background:var(--surface);border-radius:7px;overflow:hidden}.summary-item[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:8px;min-height:54px;border:0;border-right:1px solid var(--border);background:transparent;color:var(--text-secondary);padding:0 14px;cursor:pointer}.summary-item[_ngcontent-%COMP%]:last-child{border:0}.summary-item.active[_ngcontent-%COMP%]{background:var(--surface-elevated);color:var(--text-primary);box-shadow:inset 0 -2px var(--primary)}.status-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;background:var(--text-tertiary)}.status-dot[data-status=running][_ngcontent-%COMP%], .badge[data-status=running][_ngcontent-%COMP%]{color:var(--primary)}.status-dot[data-status=running][_ngcontent-%COMP%]{background:var(--primary)}.status-dot[data-status=paused][_ngcontent-%COMP%], .badge[data-status=paused][_ngcontent-%COMP%]{color:var(--warning)}.status-dot[data-status=paused][_ngcontent-%COMP%]{background:var(--warning)}.status-dot[data-status=completed][_ngcontent-%COMP%], .badge[data-status=completed][_ngcontent-%COMP%]{color:var(--success)}.status-dot[data-status=completed][_ngcontent-%COMP%]{background:var(--success)}.status-dot[data-status=failed][_ngcontent-%COMP%], .status-dot[data-status=cancelled][_ngcontent-%COMP%]{background:var(--error)}.badge[data-status=failed][_ngcontent-%COMP%], .badge[data-status=cancelled][_ngcontent-%COMP%]{color:var(--error)}.controls[_ngcontent-%COMP%]{margin:18px 0}.search[_ngcontent-%COMP%], select[_ngcontent-%COMP%]{height:38px;border:1px solid var(--border);background:var(--surface);color:var(--text-primary);padding:0 11px;border-radius:5px}.search[_ngcontent-%COMP%]{width:min(390px,100%)}.capacity[_ngcontent-%COMP%]{margin-left:auto;color:var(--text-secondary);font-size:13px}.run-section[_ngcontent-%COMP%]{margin-top:28px}.section-heading[_ngcontent-%COMP%]{display:flex;align-items:center;gap:9px;margin-bottom:12px}.section-heading[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:16px;margin:0}.section-heading[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--text-tertiary);font-size:12px}.active-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:12px}.run-card[_ngcontent-%COMP%]{border:1px solid var(--border);background:var(--surface);padding:16px;border-radius:7px}.run-title[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px}.run-title[_ngcontent-%COMP%] a[_ngcontent-%COMP%], td[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:700;text-decoration:none}.run-title[_ngcontent-%COMP%] code[_ngcontent-%COMP%], td[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;color:var(--text-tertiary);font-size:11px;margin-top:4px}.badge[_ngcontent-%COMP%]{border:1px solid currentColor;height:fit-content;padding:3px 7px;border-radius:4px;font-size:11px;text-transform:uppercase}.history-tag[_ngcontent-%COMP%]{border:1px dashed var(--border-bright);color:var(--text-tertiary);padding:2px 6px;border-radius:4px;font-size:10px;text-transform:uppercase;margin-left:6px}td[_ngcontent-%COMP%] .run-name[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:700}.run-meta[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--text-secondary);font-size:12px;margin:18px 0 14px}.actions[_ngcontent-%COMP%]{flex-wrap:wrap}.actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .icon-button[_ngcontent-%COMP%]{padding:5px 7px}.actions[_ngcontent-%COMP%] .danger[_ngcontent-%COMP%]{color:var(--error)}.icon-button.answer[_ngcontent-%COMP%]{border-color:var(--warning);color:var(--warning);font-weight:700}.table-wrap[_ngcontent-%COMP%]{overflow:auto;border:1px solid var(--border);border-radius:7px}table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background:var(--surface);font-size:13px}th[_ngcontent-%COMP%]{text-align:left;color:var(--text-secondary);font-size:11px;text-transform:uppercase;font-weight:600}th[_ngcontent-%COMP%], td[_ngcontent-%COMP%]{padding:12px 14px;border-bottom:1px solid var(--border);white-space:nowrap}tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%]{border-bottom:0}.empty[_ngcontent-%COMP%]{padding:24px;color:var(--text-tertiary);text-align:center;border:1px dashed var(--border);border-radius:7px}td.empty[_ngcontent-%COMP%]{border:0}.table-wrap[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{min-width:220px}@media(max-width:800px){.dashboard[_ngcontent-%COMP%]{padding:20px 16px}.page-header[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column}.summary[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.summary-item[_ngcontent-%COMP%]{border-bottom:1px solid var(--border)}.controls[_ngcontent-%COMP%]{align-items:stretch;flex-wrap:wrap}.search[_ngcontent-%COMP%]{width:100%}.capacity[_ngcontent-%COMP%]{margin-left:0}.active-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}"]})};export{X as DashboardComponent};
@@ -1 +1 @@
1
- import{b as K,d as Q,e as U}from"./chunk-N3FOQ3O5.js";import{a as X,b as Z,e as ee,g as te,h as ne,i as ie,j as oe,k as re}from"./chunk-7ELOO4IC.js";import{$ as k,Ba as w,Fa as f,Ka as y,La as F,Lb as q,Ma as L,Mb as G,Na as A,O as C,Oa as S,Ob as H,Pa as E,Qa as s,Qb as J,Ra as n,Sa as t,T as g,Ta as B,U as x,Ua as j,Va as $,Xa as b,Ya as _,Za as p,gb as v,ib as i,jb as c,k as N,kb as u,lb as Y,mb as h,nb as M,ob as P,qa as o,rb as I,sb as D,tb as R,u as V,w as z}from"./chunk-4R37VVI4.js";var me=(r,a)=>a.name;function ge(r,a){if(r&1&&(n(0,"option",9),i(1),t()),r&2){let e=a.$implicit;s("value",e.name)("disabled",!e.available),o(),Y(" ",e.name,"",e.available?"":" \u2014 not available on this machine"," ")}}function xe(r,a){if(r&1&&(n(0,"option",10),i(1),t()),r&2){let e=a.$implicit;s("value",e),o(),c(e)}}function _e(r,a){if(r&1){let e=b();n(0,"div",1),_("click",function(){g(e);let l=p();return x(l.close())}),n(1,"div",2),_("click",function(l){return l.stopPropagation()}),n(2,"h3",3),i(3),t(),n(4,"label",4),i(5,"Arguments"),t(),n(6,"input",5),P("ngModelChange",function(l){g(e);let m=p();return M(m.args,l)||(m.args=l),x(l)}),_("keydown.enter",function(){g(e);let l=p();return x(l.submit())}),t(),n(7,"div",6)(8,"div")(9,"label",4),i(10,"Provider"),t(),n(11,"select",7),P("ngModelChange",function(l){g(e);let m=p();return M(m.provider,l)||(m.provider=l),x(l)}),_("ngModelChange",function(){g(e);let l=p();return x(l.onProviderChange())}),n(12,"option",8),i(13,"(workflow default)"),t(),S(14,ge,2,4,"option",9,me),t()(),n(16,"div")(17,"label",4),i(18,"Model"),t(),n(19,"select",7),P("ngModelChange",function(l){g(e);let m=p();return M(m.model,l)||(m.model=l),x(l)}),n(20,"option",8),i(21,"(workflow default)"),t(),S(22,xe,2,2,"option",10,A),t()()(),n(24,"div",11)(25,"button",12),_("click",function(){g(e);let l=p();return x(l.close())}),i(26,"Cancel"),t(),n(27,"button",13),_("click",function(){g(e);let l=p();return x(l.submit())}),i(28,"Start \u25B6"),t()()()()}if(r&2){let e=p();o(3),u("Run ",e.workflowName),o(3),h("ngModel",e.args),o(5),h("ngModel",e.provider),o(3),E(e.providers),o(5),h("ngModel",e.model),o(3),E(e.modelOptions)}}var O=class r{visible=!1;workflowName="";providers=[];run=new k;closed=new k;args="";provider="";model="";get modelOptions(){return this.provider?this.providers.find(a=>a.name===this.provider)?.defaultModels??[]:[...new Set(this.providers.flatMap(a=>a.defaultModels))]}onProviderChange(){this.model&&!this.modelOptions.includes(this.model)&&(this.model="")}submit(){this.run.emit({args:this.args,provider:this.provider||void 0,model:this.model||void 0}),this.reset()}close(){this.visible=!1,this.reset(),this.closed.emit()}reset(){this.args="",this.provider="",this.model=""}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=w({type:r,selectors:[["app-run-dialog"]],inputs:{visible:"visible",workflowName:"workflowName",providers:"providers"},outputs:{run:"run",closed:"closed"},decls:1,vars:1,consts:[[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50"],[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50",3,"click"],[1,"bg-slate-800","rounded-lg","p-6","w-full","max-w-md","border","border-slate-700",3,"click"],[1,"text-lg","font-semibold","text-slate-100","mb-4"],[1,"block","text-sm","text-slate-400","mb-1"],["placeholder",'e.g. "fix #42"',1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500","mb-4",3,"ngModelChange","keydown.enter","ngModel"],[1,"grid","grid-cols-2","gap-3","mb-4"],[1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500",3,"ngModelChange","ngModel"],["value",""],[3,"value","disabled"],[3,"value"],[1,"flex","justify-end","gap-3"],[1,"px-4","py-2","text-sm","text-slate-400","hover:text-slate-200",3,"click"],[1,"px-4","py-2","text-sm","bg-blue-600","text-white","rounded","hover:bg-blue-500",3,"click"]],template:function(e,d){e&1&&F(0,_e,29,4,"div",0),e&2&&L(d.visible?0:-1)},dependencies:[oe,ne,ie,X,te,Z,ee],encapsulation:2})};function ae(r,a,e={}){let d=r.provider||a.provider||e.provider||"default",l=r.model||a.model||e.model||"";return{name:l?`${d}/${l}`:d,inherited:!r.provider&&!r.model}}var fe=r=>({edit:r}),ue=r=>["/runs",r];function be(r,a){if(r&1&&(n(0,"div",4),i(1),t()),r&2){let e=p();o(),c(e.error)}}function ve(r,a){r&1&&(n(0,"div",5),i(1,"Loading workflow definition..."),t())}function Ce(r,a){if(r&1&&(n(0,"span"),i(1),t()),r&2){let e=p(3);o(),c(e.runs.length)}}function we(r,a){if(r&1){let e=b();n(0,"button",24),_("click",function(){let l=g(e).$implicit,m=p(2);return x(m.tab=l.id)}),i(1),f(2,Ce,2,1,"span",3),t()}if(r&2){let e=a.$implicit,d=p(2);v("active",d.tab===e.id),o(),u(" ",e.label," "),o(),s("ngIf",e.id==="runs")}}function ye(r,a){if(r&1){let e=b();n(0,"button",30),_("click",function(){let l=g(e).$implicit,m=p(3);return x(m.selectedNode=l)}),n(1,"span",31),i(2),t(),n(3,"span",32),i(4),t(),n(5,"span",33)(6,"strong"),i(7),n(8,"span",34),i(9),t()(),n(10,"small"),i(11),t()(),n(12,"span",35),i(13),t()()}if(r&2){let e=a.$implicit,d=a.index,l=p(3);v("selected",(l.selectedNode==null?null:l.selectedNode.id)===e.id),o(2),c(d+1),o(),y("data-type",e.type),o(),c(l.typeLabel(e.type)),o(3),u("",e.id," "),o(),v("inherited",l.nodeProvider(e).inherited),o(),c(l.providerBadgeLabel(e)),o(2),c(e.content),o(2),c(e.dependsOn.length?"After "+e.dependsOn.join(", "):"Entry point")}}function he(r,a){if(r&1&&(n(0,"aside",36)(1,"div",37),i(2,"Node inspector"),t(),n(3,"h3"),i(4),t(),n(5,"span",38),i(6),t(),n(7,"dl")(8,"div")(9,"dt"),i(10,"Depends on"),t(),n(11,"dd"),i(12),t()(),n(13,"div")(14,"dt"),i(15,"Trigger"),t(),n(16,"dd"),i(17),t()(),n(18,"div")(19,"dt"),i(20,"Context"),t(),n(21,"dd"),i(22),t()(),n(23,"div")(24,"dt"),i(25,"Condition"),t(),n(26,"dd"),i(27),t()(),n(28,"div")(29,"dt"),i(30,"Provider"),t(),n(31,"dd"),i(32),t()(),n(33,"div")(34,"dt"),i(35,"Model"),t(),n(36,"dd"),i(37),t()()(),n(38,"label"),i(39,"Content"),t(),n(40,"pre"),i(41),t()()),r&2){let e=p(3);o(4),c(e.selectedNode.id),o(2),c(e.selectedNode.type),o(6),c(e.selectedNode.dependsOn.join(", ")||"None"),o(5),c(e.selectedNode.triggerRule),o(5),c(e.selectedNode.context),o(5),c(e.selectedNode.when||"Always"),o(5),c(e.selectedNode.provider||e.workflow.defaultProvider||"Default"),o(5),c(e.selectedNode.model||e.workflow.defaultModel||"Default"),o(4),c(e.selectedNode.content)}}function Me(r,a){if(r&1&&(n(0,"div",25)(1,"main",26)(2,"div",27)(3,"div")(4,"h2"),i(5,"Workflow steps"),t(),n(6,"p"),i(7,"Execution order and node configuration."),t()()(),f(8,ye,14,11,"button",28),t(),f(9,he,42,9,"aside",29),t()),r&2){let e=p(2);o(8),s("ngForOf",e.workflow.nodes),o(),s("ngIf",e.selectedNode)}}function Pe(r,a){if(r&1&&(n(0,"article")(1,"div")(2,"span",32),i(3),t(),n(4,"strong"),i(5),t()(),n(6,"span",34),i(7),t()()),r&2){let e=a.$implicit,d=p(4);o(2),y("data-type",e.type),o(),c(d.typeLabel(e.type)),o(2),c(e.id),o(),v("inherited",d.nodeProvider(e).inherited),o(),c(d.providerBadgeLabel(e))}}function Oe(r,a){if(r&1&&(n(0,"div",44)(1,"span",45),i(2),t(),f(3,Pe,8,6,"article",46),t()),r&2){let e=a.$implicit,d=a.index;o(2),u("Stage ",d+1),o(),s("ngForOf",e)}}function ke(r,a){if(r&1&&(n(0,"div",39)(1,"div",40)(2,"div")(3,"h2"),i(4,"DAG topology"),t(),n(5,"p"),i(6,"Dependencies flow from left to right."),t()(),n(7,"span"),i(8),t()(),n(9,"div",41)(10,"div",42),f(11,Oe,4,2,"div",43),t()()()),r&2){let e=p(2);o(8),u("",e.dagLayers.length," stages"),o(3),s("ngForOf",e.dagLayers)}}function Se(r,a){if(r&1){let e=b();n(0,"div",47)(1,"div",48)(2,"span"),i(3,"Read-only YAML definition"),t(),n(4,"button",24),_("click",function(){g(e);let l=p(2);return x(l.copyYaml())}),i(5),t()(),n(6,"pre"),i(7),t()()}if(r&2){let e=p(2);o(5),c(e.copied?"Copied":"Copy"),o(2),c(e.workflow.yaml)}}function Ee(r,a){r&1&&(n(0,"span",53),i(1,"history"),t())}function Ie(r,a){if(r&1&&(n(0,"a",54),i(1,"Open"),t()),r&2){let e=p().$implicit;s("routerLink",I(1,ue,e.runId))}}function De(r,a){if(r&1&&(n(0,"tr")(1,"td")(2,"code"),i(3),t()(),n(4,"td")(5,"span",50),i(6),t(),f(7,Ee,2,0,"span",51),t(),n(8,"td"),i(9),D(10,"date"),t(),n(11,"td"),i(12),D(13,"date"),t(),n(14,"td"),f(15,Ie,2,3,"a",52),t()()),r&2){let e=a.$implicit;o(3),c(e.runId),o(2),y("data-status",e.status),o(),c(e.status),o(),s("ngIf",e.source==="history"),o(2),c(R(10,7,e.startedAt,"medium")),o(3),c(e.completedAt?R(13,10,e.completedAt,"medium"):"In progress"),o(3),s("ngIf",e.source!=="history")}}function Re(r,a){r&1&&(n(0,"tr")(1,"td",55),i(2,"This workflow has not been run yet."),t()())}function We(r,a){if(r&1&&(n(0,"div",49)(1,"table")(2,"thead")(3,"tr")(4,"th"),i(5,"Run ID"),t(),n(6,"th"),i(7,"Status"),t(),n(8,"th"),i(9,"Started"),t(),n(10,"th"),i(11,"Completed"),t(),B(12,"th"),t()(),n(13,"tbody"),f(14,De,16,13,"tr",46)(15,Re,3,0,"tr",3),t()()()),r&2){let e=p(2);o(14),s("ngForOf",e.runs),o(),s("ngIf",!e.runs.length)}}function Te(r,a){if(r&1){let e=b();j(0),n(1,"nav",6)(2,"a",7),i(3,"Workflows"),t(),n(4,"span"),i(5,"/"),t(),n(6,"span"),i(7),t()(),n(8,"header",8)(9,"div",9),i(10,"Y"),t(),n(11,"div",10)(12,"span",11),i(13),t(),n(14,"h1"),i(15),t(),n(16,"p"),i(17),t()(),n(18,"div",12)(19,"a",13),i(20,"Edit"),t(),n(21,"button",14),_("click",function(){g(e);let l=p();return x(l.showRunDialog=!0)}),i(22,"Run workflow"),t()()(),n(23,"div",15)(24,"div")(25,"span"),i(26,"Nodes"),t(),n(27,"strong"),i(28),t()(),n(29,"div")(30,"span"),i(31,"Dependencies"),t(),n(32,"strong"),i(33),t()(),n(34,"div")(35,"span"),i(36,"Provider"),t(),n(37,"strong"),i(38),t()(),n(39,"div")(40,"span"),i(41,"Model"),t(),n(42,"strong"),i(43),t()(),n(44,"div")(45,"span"),i(46,"Runs"),t(),n(47,"strong"),i(48),t()()(),n(49,"div",16)(50,"span"),i(51,"Definition"),t(),n(52,"code"),i(53),t()(),n(54,"nav",17),f(55,we,3,4,"button",18),t(),f(56,Me,10,2,"div",19)(57,ke,12,2,"div",20)(58,Se,8,2,"div",21)(59,We,16,2,"div",22),n(60,"app-run-dialog",23),_("run",function(l){g(e);let m=p();return x(m.onStartRun(l))})("closed",function(){g(e);let l=p();return x(l.showRunDialog=!1)}),t(),$()}if(r&2){let e=p();o(7),c(e.workflow.id),o(6),c(e.workflow.id),o(2),c(e.workflow.name),o(2),c(e.workflow.description||"No description provided."),o(2),s("queryParams",I(19,fe,e.workflow.id)),o(9),c(e.workflow.nodeCount),o(5),c(e.dependencyCount),o(5),c(e.workflow.defaultProvider||"default"),o(5),c(e.workflow.defaultModel||"default"),o(5),c(e.runs.length),o(5),u(".vsaf/workflows/",e.workflow.file),o(2),s("ngForOf",e.tabs),o(),s("ngIf",e.tab==="overview"),o(),s("ngIf",e.tab==="dag"),o(),s("ngIf",e.tab==="yaml"),o(),s("ngIf",e.tab==="runs"),o(),s("visible",e.showRunDialog)("workflowName",e.workflow.id)("providers",e.providers)}}var le=class r{route=C(K);api=C(re);router=C(Q);workflow;runs=[];providers=[];selectedNode;tab="overview";showRunDialog=!1;loading=!0;error="";copied=!1;tabs=[{id:"overview",label:"Overview"},{id:"dag",label:"DAG"},{id:"yaml",label:"YAML"},{id:"runs",label:"Runs"}];ngOnInit(){let a=this.route.snapshot.queryParamMap.get("id");if(!a){this.loading=!1,this.error="Missing workflow id.";return}V({workflow:this.api.getWorkflow(a),runs:this.api.getRuns(),providers:this.api.getProviders().pipe(z(()=>N({providers:[]})))}).subscribe({next:e=>{this.workflow=e.workflow,this.selectedNode=e.workflow.nodes[0],this.runs=e.runs.filter(d=>d.workflow===a).reverse(),this.providers=e.providers.providers??[],this.loading=!1},error:e=>{this.loading=!1,this.error=e?.error?.error??"Failed to load workflow."}})}nodeProvider(a){return ae(a,{provider:this.workflow?.defaultProvider,model:this.workflow?.defaultModel})}providerBadgeLabel(a){let e=this.nodeProvider(a);return e.inherited?`\u2192 ${e.name}`:e.name}get dependencyCount(){return this.workflow?.nodes.reduce((a,e)=>a+e.dependsOn.length,0)??0}get dagLayers(){if(!this.workflow)return[];let a=new Map,e=(l,m=new Set)=>{if(a.has(l.id))return a.get(l.id);if(m.has(l.id)||!l.dependsOn.length)return 0;m.add(l.id);let W=1+Math.max(...l.dependsOn.map(de=>{let T=this.workflow.nodes.find(ce=>ce.id===de);return T?e(T,m):0}));return m.delete(l.id),a.set(l.id,W),W};for(let l of this.workflow.nodes)a.set(l.id,e(l));let d=[];for(let l of this.workflow.nodes)(d[a.get(l.id)??0]??=[]).push(l);return d}typeLabel(a){return a==="command"?"CMD":a==="prompt"?"AI":"SH"}onStartRun(a){this.showRunDialog=!1,this.api.startRun(this.workflow.id,a.args,{provider:a.provider,model:a.model}).subscribe(e=>this.router.navigate(["/runs",e.runId]))}copyYaml(){this.workflow&&navigator.clipboard.writeText(this.workflow.yaml).then(()=>{this.copied=!0,setTimeout(()=>this.copied=!1,1500)})}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=w({type:r,selectors:[["app-workflow-detail"]],decls:4,vars:3,consts:[[1,"detail-page"],["class","state error",4,"ngIf"],["class","state",4,"ngIf"],[4,"ngIf"],[1,"state","error"],[1,"state"],[1,"breadcrumb"],["routerLink","/workflows"],[1,"hero"],[1,"workflow-icon"],[1,"hero-copy"],[1,"namespace"],[1,"hero-actions"],["routerLink","/workflows/builder",1,"button","secondary",3,"queryParams"],["type","button",1,"button","primary",3,"click"],[1,"stats"],[1,"file-strip"],["aria-label","Workflow detail sections",1,"tabs"],["type","button",3,"active","click",4,"ngFor","ngForOf"],["class","tab-content",4,"ngIf"],["class","dag-panel",4,"ngIf"],["class","yaml-panel",4,"ngIf"],["class","runs-panel",4,"ngIf"],[3,"run","closed","visible","workflowName","providers"],["type","button",3,"click"],[1,"tab-content"],[1,"node-list"],[1,"section-heading"],["type","button","class","node-row",3,"selected","click",4,"ngFor","ngForOf"],["class","inspector",4,"ngIf"],["type","button",1,"node-row",3,"click"],[1,"step-index"],[1,"type-icon"],[1,"node-main"],[1,"provider-badge"],[1,"dependency"],[1,"inspector"],[1,"inspector-title"],[1,"badge"],[1,"dag-panel"],[1,"dag-toolbar"],[1,"dag-scroll"],[1,"dag-canvas"],["class","dag-layer",4,"ngFor","ngForOf"],[1,"dag-layer"],[1,"layer-label"],[4,"ngFor","ngForOf"],[1,"yaml-panel"],[1,"yaml-toolbar"],[1,"runs-panel"],[1,"status"],["class","history-tag",4,"ngIf"],[3,"routerLink",4,"ngIf"],[1,"history-tag"],[3,"routerLink"],["colspan","5",1,"empty"]],template:function(e,d){e&1&&(n(0,"section",0),f(1,be,2,1,"div",1)(2,ve,2,0,"div",2)(3,Te,61,21,"ng-container",3),t()),e&2&&(o(),s("ngIf",d.error),o(),s("ngIf",d.loading),o(),s("ngIf",d.workflow))},dependencies:[J,q,G,U,O,H],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}.detail-page[_ngcontent-%COMP%]{max-width:1320px;margin:auto;padding:24px 28px 60px}.breadcrumb[_ngcontent-%COMP%]{display:flex;gap:7px;color:#737a87;font-size:12px;margin-bottom:18px}.breadcrumb[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#9ca3af;text-decoration:none}.hero[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:15px}.workflow-icon[_ngcontent-%COMP%]{display:grid;place-items:center;flex:0 0 46px;height:52px;border:1px solid #454957;border-radius:6px;color:#a5b4fc;font-weight:900}.hero-copy[_ngcontent-%COMP%]{min-width:0}.namespace[_ngcontent-%COMP%]{font:11px ui-monospace,monospace;color:#818cf8}.hero[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:26px;margin:4px 0}.hero[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9ba1ad;margin:5px 0;line-height:1.5;max-width:800px}.hero-actions[_ngcontent-%COMP%]{display:flex;gap:8px;margin-left:auto}.button[_ngcontent-%COMP%]{padding:9px 13px;border-radius:5px;text-decoration:none;font:inherit;font-size:12px;font-weight:700;cursor:pointer}.button.secondary[_ngcontent-%COMP%]{border:1px solid #3b3e48;background:#1c1e24;color:#e5e7eb}.button.primary[_ngcontent-%COMP%]{border:1px solid #6366f1;background:#6366f1;color:#fff}.stats[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid #2d3038;border-radius:7px;margin-top:24px;background:#16171c}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{padding:13px 16px;border-right:1px solid #2d3038}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]:last-child{border:0}.stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .file-strip[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;color:#777e8b;font-size:10px;text-transform:uppercase;font-weight:700}.stats[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-top:5px;font-size:14px}.file-strip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:14px;padding:10px 14px;border:1px solid #2d3038;border-top:0;background:#131419}.file-strip[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{color:#aab0bb;font-size:11px}.tabs[_ngcontent-%COMP%]{display:flex;border-bottom:1px solid #2d3038;margin-top:24px}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:0;background:transparent;color:#858c98;padding:10px 14px;font-weight:700;cursor:pointer}.tabs[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{color:#fff;box-shadow:inset 0 -2px #6366f1}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{background:#292c34;padding:1px 5px;border-radius:8px;font-size:10px}.tab-content[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:16px;margin-top:18px}.section-heading[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:15px;margin:0}.section-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font-size:12px;color:#7f8692;margin:4px 0 12px}.node-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:28px 38px minmax(180px,1fr) minmax(120px,.5fr);align-items:center;gap:11px;width:100%;border:1px solid #292c34;border-bottom:0;background:#16171c;color:#e5e7eb;padding:11px;text-align:left;cursor:pointer}.node-row[_ngcontent-%COMP%]:first-of-type{border-radius:6px 6px 0 0}.node-row[_ngcontent-%COMP%]:last-child{border-bottom:1px solid #292c34;border-radius:0 0 6px 6px}.node-row[_ngcontent-%COMP%]:hover, .node-row.selected[_ngcontent-%COMP%]{background:#1e2027;border-color:#494d5a}.step-index[_ngcontent-%COMP%]{color:#676e7a;font-size:11px;text-align:center}.type-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:34px;height:28px;border-radius:4px;background:#242630;color:#c4b5fd;font-size:9px;font-weight:900;text-transform:uppercase}.type-icon[data-type=bash][_ngcontent-%COMP%]{color:#fbbf24}.type-icon[data-type=command][_ngcontent-%COMP%]{color:#67e8f9}.node-main[_ngcontent-%COMP%]{min-width:0}.node-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block}.node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{color:#777e8b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:4px}.dependency[_ngcontent-%COMP%]{color:#858c98;font-size:11px;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%]{border:1px solid #2d3038;background:#16171c;border-radius:6px;padding:15px}.inspector-title[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px;font-weight:800}.inspector[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:8px 0;font-size:16px}.badge[_ngcontent-%COMP%]{display:inline-block;border:1px solid #4b4f5c;padding:2px 6px;border-radius:4px;font-size:10px;color:#a5b4fc}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{margin:14px 0}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:7px 0;border-bottom:1px solid #282a31;font-size:11px}.inspector[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:#777e8b}.inspector[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;text-align:right;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:10px;color:#777e8b;text-transform:uppercase}.inspector[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{white-space:pre-wrap;overflow-wrap:anywhere;background:#0d0e11;padding:10px;border-radius:5px;font-size:11px;max-height:240px;overflow:auto}.dag-panel[_ngcontent-%COMP%], .yaml-panel[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%]{margin-top:18px;border:1px solid #2d3038;border-radius:7px;overflow:hidden}.dag-toolbar[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid #2d3038;background:#16171c}.dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:0}.dag-toolbar[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{font-size:11px;color:#858c98}.dag-scroll[_ngcontent-%COMP%]{overflow-x:auto;background-color:var(--background)}.dag-canvas[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:20px;width:max-content;min-width:100%;box-sizing:border-box;padding:14px 16px;background-image:radial-gradient(#30333b 1px,transparent 1px);background-size:16px 16px}.dag-layer[_ngcontent-%COMP%]{display:flex;flex:0 0 auto;min-width:200px;flex-direction:column;gap:8px}.layer-label[_ngcontent-%COMP%]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%]{border:1px solid var(--border-bright);background:var(--surface);border-radius:6px;padding:8px 10px}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:12px;overflow-wrap:anywhere}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] .provider-badge[_ngcontent-%COMP%]{margin:7px 0 0}.yaml-toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #3a3d47;background:#22242b;color:#ddd;border-radius:4px;padding:5px 9px}.yaml-panel[_ngcontent-%COMP%] > pre[_ngcontent-%COMP%]{margin:0;padding:18px;min-height:420px;max-height:65vh;overflow:auto;background:#0d0e11;color:#cdd6f4;font:12px/1.6 ui-monospace,monospace;white-space:pre-wrap}.runs-panel[_ngcontent-%COMP%] table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background:#16171c;font-size:12px}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:12px;text-align:left;border-bottom:1px solid #292c34}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px}.runs-panel[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#a5b4fc}.status[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase}.status[data-status=completed][_ngcontent-%COMP%]{color:#34d399}.status[data-status=failed][_ngcontent-%COMP%], .status[data-status=cancelled][_ngcontent-%COMP%]{color:#f87171}.status[data-status=running][_ngcontent-%COMP%]{color:#60a5fa}.provider-badge[_ngcontent-%COMP%]{display:inline-block;border:1px solid var(--border-bright);border-radius:4px;background:var(--surface-elevated);color:#c4b5fd;font:10px ui-monospace,monospace;padding:1px 6px;margin-left:8px;vertical-align:1px}.provider-badge.inherited[_ngcontent-%COMP%]{color:var(--text-tertiary);border-style:dashed;background:transparent}.history-tag[_ngcontent-%COMP%]{border:1px dashed var(--border-bright);color:var(--text-tertiary);padding:1px 5px;border-radius:4px;font-size:9px;text-transform:uppercase;margin-left:6px}.empty[_ngcontent-%COMP%], .state[_ngcontent-%COMP%]{padding:24px;text-align:center;color:#858c98}.state.error[_ngcontent-%COMP%]{color:#fca5a5}@media(max-width:900px){.detail-page[_ngcontent-%COMP%]{padding:18px 14px}.hero[_ngcontent-%COMP%]{flex-wrap:wrap}.hero-actions[_ngcontent-%COMP%]{width:100%;margin-left:61px}.stats[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{border-bottom:1px solid #2d3038}.tab-content[_ngcontent-%COMP%]{grid-template-columns:1fr}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 38px 1fr}.dependency[_ngcontent-%COMP%]{grid-column:3}.inspector[_ngcontent-%COMP%]{position:static}}@media(max-width:600px){.stats[_ngcontent-%COMP%]{grid-template-columns:1fr}.hero-actions[_ngcontent-%COMP%]{margin-left:0}.tabs[_ngcontent-%COMP%]{overflow:auto}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 1fr}.type-icon[_ngcontent-%COMP%]{display:none}.node-main[_ngcontent-%COMP%], .dependency[_ngcontent-%COMP%]{grid-column:2}.dag-canvas[_ngcontent-%COMP%]{padding:18px}}"]})};export{le as WorkflowDetailComponent};
1
+ import{b as K,d as Q,e as U}from"./chunk-ZZWA24BS.js";import{a as X,b as Z,e as ee,g as te,h as ne,i as ie,j as oe,k as re}from"./chunk-OYL4KDHJ.js";import{$ as k,Ba as w,Fa as f,Ka as y,La as F,Ma as L,Mb as q,Na as A,Nb as G,O as C,Oa as S,Pa as E,Pb as H,Qa as s,Ra as n,Rb as J,Sa as t,T as g,Ta as B,U as x,Ua as j,Va as $,Xa as b,Ya as _,Za as p,gb as v,ib as i,jb as c,k as N,kb as u,lb as Y,nb as h,ob as M,pb as P,qa as o,sb as I,tb as D,u as V,ub as R,w as z}from"./chunk-RM7DW5FD.js";var me=(r,a)=>a.name;function ge(r,a){if(r&1&&(n(0,"option",9),i(1),t()),r&2){let e=a.$implicit;s("value",e.name)("disabled",!e.available),o(),Y(" ",e.name,"",e.available?"":" \u2014 not available on this machine"," ")}}function xe(r,a){if(r&1&&(n(0,"option",10),i(1),t()),r&2){let e=a.$implicit;s("value",e),o(),c(e)}}function _e(r,a){if(r&1){let e=b();n(0,"div",1),_("click",function(){g(e);let l=p();return x(l.close())}),n(1,"div",2),_("click",function(l){return l.stopPropagation()}),n(2,"h3",3),i(3),t(),n(4,"label",4),i(5,"Arguments"),t(),n(6,"input",5),P("ngModelChange",function(l){g(e);let m=p();return M(m.args,l)||(m.args=l),x(l)}),_("keydown.enter",function(){g(e);let l=p();return x(l.submit())}),t(),n(7,"div",6)(8,"div")(9,"label",4),i(10,"Provider"),t(),n(11,"select",7),P("ngModelChange",function(l){g(e);let m=p();return M(m.provider,l)||(m.provider=l),x(l)}),_("ngModelChange",function(){g(e);let l=p();return x(l.onProviderChange())}),n(12,"option",8),i(13,"(workflow default)"),t(),S(14,ge,2,4,"option",9,me),t()(),n(16,"div")(17,"label",4),i(18,"Model"),t(),n(19,"select",7),P("ngModelChange",function(l){g(e);let m=p();return M(m.model,l)||(m.model=l),x(l)}),n(20,"option",8),i(21,"(workflow default)"),t(),S(22,xe,2,2,"option",10,A),t()()(),n(24,"div",11)(25,"button",12),_("click",function(){g(e);let l=p();return x(l.close())}),i(26,"Cancel"),t(),n(27,"button",13),_("click",function(){g(e);let l=p();return x(l.submit())}),i(28,"Start \u25B6"),t()()()()}if(r&2){let e=p();o(3),u("Run ",e.workflowName),o(3),h("ngModel",e.args),o(5),h("ngModel",e.provider),o(3),E(e.providers),o(5),h("ngModel",e.model),o(3),E(e.modelOptions)}}var O=class r{visible=!1;workflowName="";providers=[];run=new k;closed=new k;args="";provider="";model="";get modelOptions(){return this.provider?this.providers.find(a=>a.name===this.provider)?.defaultModels??[]:[...new Set(this.providers.flatMap(a=>a.defaultModels))]}onProviderChange(){this.model&&!this.modelOptions.includes(this.model)&&(this.model="")}submit(){this.run.emit({args:this.args,provider:this.provider||void 0,model:this.model||void 0}),this.reset()}close(){this.visible=!1,this.reset(),this.closed.emit()}reset(){this.args="",this.provider="",this.model=""}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=w({type:r,selectors:[["app-run-dialog"]],inputs:{visible:"visible",workflowName:"workflowName",providers:"providers"},outputs:{run:"run",closed:"closed"},decls:1,vars:1,consts:[[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50"],[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50",3,"click"],[1,"bg-slate-800","rounded-lg","p-6","w-full","max-w-md","border","border-slate-700",3,"click"],[1,"text-lg","font-semibold","text-slate-100","mb-4"],[1,"block","text-sm","text-slate-400","mb-1"],["placeholder",'e.g. "fix #42"',1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500","mb-4",3,"ngModelChange","keydown.enter","ngModel"],[1,"grid","grid-cols-2","gap-3","mb-4"],[1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500",3,"ngModelChange","ngModel"],["value",""],[3,"value","disabled"],[3,"value"],[1,"flex","justify-end","gap-3"],[1,"px-4","py-2","text-sm","text-slate-400","hover:text-slate-200",3,"click"],[1,"px-4","py-2","text-sm","bg-blue-600","text-white","rounded","hover:bg-blue-500",3,"click"]],template:function(e,d){e&1&&F(0,_e,29,4,"div",0),e&2&&L(d.visible?0:-1)},dependencies:[oe,ne,ie,X,te,Z,ee],encapsulation:2})};function ae(r,a,e={}){let d=r.provider||a.provider||e.provider||"default",l=r.model||a.model||e.model||"";return{name:l?`${d}/${l}`:d,inherited:!r.provider&&!r.model}}var fe=r=>({edit:r}),ue=r=>["/runs",r];function be(r,a){if(r&1&&(n(0,"div",4),i(1),t()),r&2){let e=p();o(),c(e.error)}}function ve(r,a){r&1&&(n(0,"div",5),i(1,"Loading workflow definition..."),t())}function Ce(r,a){if(r&1&&(n(0,"span"),i(1),t()),r&2){let e=p(3);o(),c(e.runs.length)}}function we(r,a){if(r&1){let e=b();n(0,"button",24),_("click",function(){let l=g(e).$implicit,m=p(2);return x(m.tab=l.id)}),i(1),f(2,Ce,2,1,"span",3),t()}if(r&2){let e=a.$implicit,d=p(2);v("active",d.tab===e.id),o(),u(" ",e.label," "),o(),s("ngIf",e.id==="runs")}}function ye(r,a){if(r&1){let e=b();n(0,"button",30),_("click",function(){let l=g(e).$implicit,m=p(3);return x(m.selectedNode=l)}),n(1,"span",31),i(2),t(),n(3,"span",32),i(4),t(),n(5,"span",33)(6,"strong"),i(7),n(8,"span",34),i(9),t()(),n(10,"small"),i(11),t()(),n(12,"span",35),i(13),t()()}if(r&2){let e=a.$implicit,d=a.index,l=p(3);v("selected",(l.selectedNode==null?null:l.selectedNode.id)===e.id),o(2),c(d+1),o(),y("data-type",e.type),o(),c(l.typeLabel(e.type)),o(3),u("",e.id," "),o(),v("inherited",l.nodeProvider(e).inherited),o(),c(l.providerBadgeLabel(e)),o(2),c(e.content),o(2),c(e.dependsOn.length?"After "+e.dependsOn.join(", "):"Entry point")}}function he(r,a){if(r&1&&(n(0,"aside",36)(1,"div",37),i(2,"Node inspector"),t(),n(3,"h3"),i(4),t(),n(5,"span",38),i(6),t(),n(7,"dl")(8,"div")(9,"dt"),i(10,"Depends on"),t(),n(11,"dd"),i(12),t()(),n(13,"div")(14,"dt"),i(15,"Trigger"),t(),n(16,"dd"),i(17),t()(),n(18,"div")(19,"dt"),i(20,"Context"),t(),n(21,"dd"),i(22),t()(),n(23,"div")(24,"dt"),i(25,"Condition"),t(),n(26,"dd"),i(27),t()(),n(28,"div")(29,"dt"),i(30,"Provider"),t(),n(31,"dd"),i(32),t()(),n(33,"div")(34,"dt"),i(35,"Model"),t(),n(36,"dd"),i(37),t()()(),n(38,"label"),i(39,"Content"),t(),n(40,"pre"),i(41),t()()),r&2){let e=p(3);o(4),c(e.selectedNode.id),o(2),c(e.selectedNode.type),o(6),c(e.selectedNode.dependsOn.join(", ")||"None"),o(5),c(e.selectedNode.triggerRule),o(5),c(e.selectedNode.context),o(5),c(e.selectedNode.when||"Always"),o(5),c(e.selectedNode.provider||e.workflow.defaultProvider||"Default"),o(5),c(e.selectedNode.model||e.workflow.defaultModel||"Default"),o(4),c(e.selectedNode.content)}}function Me(r,a){if(r&1&&(n(0,"div",25)(1,"main",26)(2,"div",27)(3,"div")(4,"h2"),i(5,"Workflow steps"),t(),n(6,"p"),i(7,"Execution order and node configuration."),t()()(),f(8,ye,14,11,"button",28),t(),f(9,he,42,9,"aside",29),t()),r&2){let e=p(2);o(8),s("ngForOf",e.workflow.nodes),o(),s("ngIf",e.selectedNode)}}function Pe(r,a){if(r&1&&(n(0,"article")(1,"div")(2,"span",32),i(3),t(),n(4,"strong"),i(5),t()(),n(6,"span",34),i(7),t()()),r&2){let e=a.$implicit,d=p(4);o(2),y("data-type",e.type),o(),c(d.typeLabel(e.type)),o(2),c(e.id),o(),v("inherited",d.nodeProvider(e).inherited),o(),c(d.providerBadgeLabel(e))}}function Oe(r,a){if(r&1&&(n(0,"div",44)(1,"span",45),i(2),t(),f(3,Pe,8,6,"article",46),t()),r&2){let e=a.$implicit,d=a.index;o(2),u("Stage ",d+1),o(),s("ngForOf",e)}}function ke(r,a){if(r&1&&(n(0,"div",39)(1,"div",40)(2,"div")(3,"h2"),i(4,"DAG topology"),t(),n(5,"p"),i(6,"Dependencies flow from left to right."),t()(),n(7,"span"),i(8),t()(),n(9,"div",41)(10,"div",42),f(11,Oe,4,2,"div",43),t()()()),r&2){let e=p(2);o(8),u("",e.dagLayers.length," stages"),o(3),s("ngForOf",e.dagLayers)}}function Se(r,a){if(r&1){let e=b();n(0,"div",47)(1,"div",48)(2,"span"),i(3,"Read-only YAML definition"),t(),n(4,"button",24),_("click",function(){g(e);let l=p(2);return x(l.copyYaml())}),i(5),t()(),n(6,"pre"),i(7),t()()}if(r&2){let e=p(2);o(5),c(e.copied?"Copied":"Copy"),o(2),c(e.workflow.yaml)}}function Ee(r,a){r&1&&(n(0,"span",53),i(1,"history"),t())}function Ie(r,a){if(r&1&&(n(0,"a",54),i(1,"Open"),t()),r&2){let e=p().$implicit;s("routerLink",I(1,ue,e.runId))}}function De(r,a){if(r&1&&(n(0,"tr")(1,"td")(2,"code"),i(3),t()(),n(4,"td")(5,"span",50),i(6),t(),f(7,Ee,2,0,"span",51),t(),n(8,"td"),i(9),D(10,"date"),t(),n(11,"td"),i(12),D(13,"date"),t(),n(14,"td"),f(15,Ie,2,3,"a",52),t()()),r&2){let e=a.$implicit;o(3),c(e.runId),o(2),y("data-status",e.status),o(),c(e.status),o(),s("ngIf",e.source==="history"),o(2),c(R(10,7,e.startedAt,"medium")),o(3),c(e.completedAt?R(13,10,e.completedAt,"medium"):"In progress"),o(3),s("ngIf",e.source!=="history")}}function Re(r,a){r&1&&(n(0,"tr")(1,"td",55),i(2,"This workflow has not been run yet."),t()())}function We(r,a){if(r&1&&(n(0,"div",49)(1,"table")(2,"thead")(3,"tr")(4,"th"),i(5,"Run ID"),t(),n(6,"th"),i(7,"Status"),t(),n(8,"th"),i(9,"Started"),t(),n(10,"th"),i(11,"Completed"),t(),B(12,"th"),t()(),n(13,"tbody"),f(14,De,16,13,"tr",46)(15,Re,3,0,"tr",3),t()()()),r&2){let e=p(2);o(14),s("ngForOf",e.runs),o(),s("ngIf",!e.runs.length)}}function Te(r,a){if(r&1){let e=b();j(0),n(1,"nav",6)(2,"a",7),i(3,"Workflows"),t(),n(4,"span"),i(5,"/"),t(),n(6,"span"),i(7),t()(),n(8,"header",8)(9,"div",9),i(10,"Y"),t(),n(11,"div",10)(12,"span",11),i(13),t(),n(14,"h1"),i(15),t(),n(16,"p"),i(17),t()(),n(18,"div",12)(19,"a",13),i(20,"Edit"),t(),n(21,"button",14),_("click",function(){g(e);let l=p();return x(l.showRunDialog=!0)}),i(22,"Run workflow"),t()()(),n(23,"div",15)(24,"div")(25,"span"),i(26,"Nodes"),t(),n(27,"strong"),i(28),t()(),n(29,"div")(30,"span"),i(31,"Dependencies"),t(),n(32,"strong"),i(33),t()(),n(34,"div")(35,"span"),i(36,"Provider"),t(),n(37,"strong"),i(38),t()(),n(39,"div")(40,"span"),i(41,"Model"),t(),n(42,"strong"),i(43),t()(),n(44,"div")(45,"span"),i(46,"Runs"),t(),n(47,"strong"),i(48),t()()(),n(49,"div",16)(50,"span"),i(51,"Definition"),t(),n(52,"code"),i(53),t()(),n(54,"nav",17),f(55,we,3,4,"button",18),t(),f(56,Me,10,2,"div",19)(57,ke,12,2,"div",20)(58,Se,8,2,"div",21)(59,We,16,2,"div",22),n(60,"app-run-dialog",23),_("run",function(l){g(e);let m=p();return x(m.onStartRun(l))})("closed",function(){g(e);let l=p();return x(l.showRunDialog=!1)}),t(),$()}if(r&2){let e=p();o(7),c(e.workflow.id),o(6),c(e.workflow.id),o(2),c(e.workflow.name),o(2),c(e.workflow.description||"No description provided."),o(2),s("queryParams",I(19,fe,e.workflow.id)),o(9),c(e.workflow.nodeCount),o(5),c(e.dependencyCount),o(5),c(e.workflow.defaultProvider||"default"),o(5),c(e.workflow.defaultModel||"default"),o(5),c(e.runs.length),o(5),u(".vsaf/workflows/",e.workflow.file),o(2),s("ngForOf",e.tabs),o(),s("ngIf",e.tab==="overview"),o(),s("ngIf",e.tab==="dag"),o(),s("ngIf",e.tab==="yaml"),o(),s("ngIf",e.tab==="runs"),o(),s("visible",e.showRunDialog)("workflowName",e.workflow.id)("providers",e.providers)}}var le=class r{route=C(K);api=C(re);router=C(Q);workflow;runs=[];providers=[];selectedNode;tab="overview";showRunDialog=!1;loading=!0;error="";copied=!1;tabs=[{id:"overview",label:"Overview"},{id:"dag",label:"DAG"},{id:"yaml",label:"YAML"},{id:"runs",label:"Runs"}];ngOnInit(){let a=this.route.snapshot.queryParamMap.get("id");if(!a){this.loading=!1,this.error="Missing workflow id.";return}V({workflow:this.api.getWorkflow(a),runs:this.api.getRuns(),providers:this.api.getProviders().pipe(z(()=>N({providers:[]})))}).subscribe({next:e=>{this.workflow=e.workflow,this.selectedNode=e.workflow.nodes[0],this.runs=e.runs.filter(d=>d.workflow===a).reverse(),this.providers=e.providers.providers??[],this.loading=!1},error:e=>{this.loading=!1,this.error=e?.error?.error??"Failed to load workflow."}})}nodeProvider(a){return ae(a,{provider:this.workflow?.defaultProvider,model:this.workflow?.defaultModel})}providerBadgeLabel(a){let e=this.nodeProvider(a);return e.inherited?`\u2192 ${e.name}`:e.name}get dependencyCount(){return this.workflow?.nodes.reduce((a,e)=>a+e.dependsOn.length,0)??0}get dagLayers(){if(!this.workflow)return[];let a=new Map,e=(l,m=new Set)=>{if(a.has(l.id))return a.get(l.id);if(m.has(l.id)||!l.dependsOn.length)return 0;m.add(l.id);let W=1+Math.max(...l.dependsOn.map(de=>{let T=this.workflow.nodes.find(ce=>ce.id===de);return T?e(T,m):0}));return m.delete(l.id),a.set(l.id,W),W};for(let l of this.workflow.nodes)a.set(l.id,e(l));let d=[];for(let l of this.workflow.nodes)(d[a.get(l.id)??0]??=[]).push(l);return d}typeLabel(a){return a==="command"?"CMD":a==="prompt"?"AI":"SH"}onStartRun(a){this.showRunDialog=!1,this.api.startRun(this.workflow.id,a.args,{provider:a.provider,model:a.model}).subscribe(e=>this.router.navigate(["/runs",e.runId]))}copyYaml(){this.workflow&&navigator.clipboard.writeText(this.workflow.yaml).then(()=>{this.copied=!0,setTimeout(()=>this.copied=!1,1500)})}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=w({type:r,selectors:[["app-workflow-detail"]],decls:4,vars:3,consts:[[1,"detail-page"],["class","state error",4,"ngIf"],["class","state",4,"ngIf"],[4,"ngIf"],[1,"state","error"],[1,"state"],[1,"breadcrumb"],["routerLink","/workflows"],[1,"hero"],[1,"workflow-icon"],[1,"hero-copy"],[1,"namespace"],[1,"hero-actions"],["routerLink","/workflows/builder",1,"button","secondary",3,"queryParams"],["type","button",1,"button","primary",3,"click"],[1,"stats"],[1,"file-strip"],["aria-label","Workflow detail sections",1,"tabs"],["type","button",3,"active","click",4,"ngFor","ngForOf"],["class","tab-content",4,"ngIf"],["class","dag-panel",4,"ngIf"],["class","yaml-panel",4,"ngIf"],["class","runs-panel",4,"ngIf"],[3,"run","closed","visible","workflowName","providers"],["type","button",3,"click"],[1,"tab-content"],[1,"node-list"],[1,"section-heading"],["type","button","class","node-row",3,"selected","click",4,"ngFor","ngForOf"],["class","inspector",4,"ngIf"],["type","button",1,"node-row",3,"click"],[1,"step-index"],[1,"type-icon"],[1,"node-main"],[1,"provider-badge"],[1,"dependency"],[1,"inspector"],[1,"inspector-title"],[1,"badge"],[1,"dag-panel"],[1,"dag-toolbar"],[1,"dag-scroll"],[1,"dag-canvas"],["class","dag-layer",4,"ngFor","ngForOf"],[1,"dag-layer"],[1,"layer-label"],[4,"ngFor","ngForOf"],[1,"yaml-panel"],[1,"yaml-toolbar"],[1,"runs-panel"],[1,"status"],["class","history-tag",4,"ngIf"],[3,"routerLink",4,"ngIf"],[1,"history-tag"],[3,"routerLink"],["colspan","5",1,"empty"]],template:function(e,d){e&1&&(n(0,"section",0),f(1,be,2,1,"div",1)(2,ve,2,0,"div",2)(3,Te,61,21,"ng-container",3),t()),e&2&&(o(),s("ngIf",d.error),o(),s("ngIf",d.loading),o(),s("ngIf",d.workflow))},dependencies:[J,q,G,U,O,H],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}.detail-page[_ngcontent-%COMP%]{max-width:1320px;margin:auto;padding:24px 28px 60px}.breadcrumb[_ngcontent-%COMP%]{display:flex;gap:7px;color:#737a87;font-size:12px;margin-bottom:18px}.breadcrumb[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#9ca3af;text-decoration:none}.hero[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:15px}.workflow-icon[_ngcontent-%COMP%]{display:grid;place-items:center;flex:0 0 46px;height:52px;border:1px solid #454957;border-radius:6px;color:#a5b4fc;font-weight:900}.hero-copy[_ngcontent-%COMP%]{min-width:0}.namespace[_ngcontent-%COMP%]{font:11px ui-monospace,monospace;color:#818cf8}.hero[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:26px;margin:4px 0}.hero[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9ba1ad;margin:5px 0;line-height:1.5;max-width:800px}.hero-actions[_ngcontent-%COMP%]{display:flex;gap:8px;margin-left:auto}.button[_ngcontent-%COMP%]{padding:9px 13px;border-radius:5px;text-decoration:none;font:inherit;font-size:12px;font-weight:700;cursor:pointer}.button.secondary[_ngcontent-%COMP%]{border:1px solid #3b3e48;background:#1c1e24;color:#e5e7eb}.button.primary[_ngcontent-%COMP%]{border:1px solid #6366f1;background:#6366f1;color:#fff}.stats[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid #2d3038;border-radius:7px;margin-top:24px;background:#16171c}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{padding:13px 16px;border-right:1px solid #2d3038}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]:last-child{border:0}.stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .file-strip[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;color:#777e8b;font-size:10px;text-transform:uppercase;font-weight:700}.stats[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-top:5px;font-size:14px}.file-strip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:14px;padding:10px 14px;border:1px solid #2d3038;border-top:0;background:#131419}.file-strip[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{color:#aab0bb;font-size:11px}.tabs[_ngcontent-%COMP%]{display:flex;border-bottom:1px solid #2d3038;margin-top:24px}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:0;background:transparent;color:#858c98;padding:10px 14px;font-weight:700;cursor:pointer}.tabs[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{color:#fff;box-shadow:inset 0 -2px #6366f1}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{background:#292c34;padding:1px 5px;border-radius:8px;font-size:10px}.tab-content[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:16px;margin-top:18px}.section-heading[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:15px;margin:0}.section-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font-size:12px;color:#7f8692;margin:4px 0 12px}.node-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:28px 38px minmax(180px,1fr) minmax(120px,.5fr);align-items:center;gap:11px;width:100%;border:1px solid #292c34;border-bottom:0;background:#16171c;color:#e5e7eb;padding:11px;text-align:left;cursor:pointer}.node-row[_ngcontent-%COMP%]:first-of-type{border-radius:6px 6px 0 0}.node-row[_ngcontent-%COMP%]:last-child{border-bottom:1px solid #292c34;border-radius:0 0 6px 6px}.node-row[_ngcontent-%COMP%]:hover, .node-row.selected[_ngcontent-%COMP%]{background:#1e2027;border-color:#494d5a}.step-index[_ngcontent-%COMP%]{color:#676e7a;font-size:11px;text-align:center}.type-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:34px;height:28px;border-radius:4px;background:#242630;color:#c4b5fd;font-size:9px;font-weight:900;text-transform:uppercase}.type-icon[data-type=bash][_ngcontent-%COMP%]{color:#fbbf24}.type-icon[data-type=command][_ngcontent-%COMP%]{color:#67e8f9}.node-main[_ngcontent-%COMP%]{min-width:0}.node-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block}.node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{color:#777e8b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:4px}.dependency[_ngcontent-%COMP%]{color:#858c98;font-size:11px;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%]{border:1px solid #2d3038;background:#16171c;border-radius:6px;padding:15px}.inspector-title[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px;font-weight:800}.inspector[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:8px 0;font-size:16px}.badge[_ngcontent-%COMP%]{display:inline-block;border:1px solid #4b4f5c;padding:2px 6px;border-radius:4px;font-size:10px;color:#a5b4fc}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{margin:14px 0}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:7px 0;border-bottom:1px solid #282a31;font-size:11px}.inspector[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:#777e8b}.inspector[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;text-align:right;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:10px;color:#777e8b;text-transform:uppercase}.inspector[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{white-space:pre-wrap;overflow-wrap:anywhere;background:#0d0e11;padding:10px;border-radius:5px;font-size:11px;max-height:240px;overflow:auto}.dag-panel[_ngcontent-%COMP%], .yaml-panel[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%]{margin-top:18px;border:1px solid #2d3038;border-radius:7px;overflow:hidden}.dag-toolbar[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid #2d3038;background:#16171c}.dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:0}.dag-toolbar[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{font-size:11px;color:#858c98}.dag-scroll[_ngcontent-%COMP%]{overflow-x:auto;background-color:var(--background)}.dag-canvas[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:20px;width:max-content;min-width:100%;box-sizing:border-box;padding:14px 16px;background-image:radial-gradient(#30333b 1px,transparent 1px);background-size:16px 16px}.dag-layer[_ngcontent-%COMP%]{display:flex;flex:0 0 auto;min-width:200px;flex-direction:column;gap:8px}.layer-label[_ngcontent-%COMP%]{font-size:10px;color:var(--text-tertiary);text-transform:uppercase}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%]{border:1px solid var(--border-bright);background:var(--surface);border-radius:6px;padding:8px 10px}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:12px;overflow-wrap:anywhere}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] .provider-badge[_ngcontent-%COMP%]{margin:7px 0 0}.yaml-toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #3a3d47;background:#22242b;color:#ddd;border-radius:4px;padding:5px 9px}.yaml-panel[_ngcontent-%COMP%] > pre[_ngcontent-%COMP%]{margin:0;padding:18px;min-height:420px;max-height:65vh;overflow:auto;background:#0d0e11;color:#cdd6f4;font:12px/1.6 ui-monospace,monospace;white-space:pre-wrap}.runs-panel[_ngcontent-%COMP%] table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background:#16171c;font-size:12px}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:12px;text-align:left;border-bottom:1px solid #292c34}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px}.runs-panel[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#a5b4fc}.status[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase}.status[data-status=completed][_ngcontent-%COMP%]{color:#34d399}.status[data-status=failed][_ngcontent-%COMP%], .status[data-status=cancelled][_ngcontent-%COMP%]{color:#f87171}.status[data-status=running][_ngcontent-%COMP%]{color:#60a5fa}.provider-badge[_ngcontent-%COMP%]{display:inline-block;border:1px solid var(--border-bright);border-radius:4px;background:var(--surface-elevated);color:#c4b5fd;font:10px ui-monospace,monospace;padding:1px 6px;margin-left:8px;vertical-align:1px}.provider-badge.inherited[_ngcontent-%COMP%]{color:var(--text-tertiary);border-style:dashed;background:transparent}.history-tag[_ngcontent-%COMP%]{border:1px dashed var(--border-bright);color:var(--text-tertiary);padding:1px 5px;border-radius:4px;font-size:9px;text-transform:uppercase;margin-left:6px}.empty[_ngcontent-%COMP%], .state[_ngcontent-%COMP%]{padding:24px;text-align:center;color:#858c98}.state.error[_ngcontent-%COMP%]{color:#fca5a5}@media(max-width:900px){.detail-page[_ngcontent-%COMP%]{padding:18px 14px}.hero[_ngcontent-%COMP%]{flex-wrap:wrap}.hero-actions[_ngcontent-%COMP%]{width:100%;margin-left:61px}.stats[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{border-bottom:1px solid #2d3038}.tab-content[_ngcontent-%COMP%]{grid-template-columns:1fr}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 38px 1fr}.dependency[_ngcontent-%COMP%]{grid-column:3}.inspector[_ngcontent-%COMP%]{position:static}}@media(max-width:600px){.stats[_ngcontent-%COMP%]{grid-template-columns:1fr}.hero-actions[_ngcontent-%COMP%]{margin-left:0}.tabs[_ngcontent-%COMP%]{overflow:auto}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 1fr}.type-icon[_ngcontent-%COMP%]{display:none}.node-main[_ngcontent-%COMP%], .dependency[_ngcontent-%COMP%]{grid-column:2}.dag-canvas[_ngcontent-%COMP%]{padding:18px}}"]})};export{le as WorkflowDetailComponent};