@ngocsangairvds/vsaf 5.1.18 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -1
- package/package.json +1 -1
- package/packages/cli/dist/commands/abandon.d.ts +6 -0
- package/packages/cli/dist/commands/abandon.d.ts.map +1 -0
- package/packages/cli/dist/commands/abandon.js +42 -0
- package/packages/cli/dist/commands/abandon.js.map +1 -0
- package/packages/cli/dist/commands/ai.d.ts +21 -0
- package/packages/cli/dist/commands/ai.d.ts.map +1 -0
- package/packages/cli/dist/commands/ai.js +76 -0
- package/packages/cli/dist/commands/ai.js.map +1 -0
- package/packages/cli/dist/commands/approve.d.ts +19 -0
- package/packages/cli/dist/commands/approve.d.ts.map +1 -0
- package/packages/cli/dist/commands/approve.js +115 -0
- package/packages/cli/dist/commands/approve.js.map +1 -0
- package/packages/cli/dist/commands/chat.d.ts +41 -0
- package/packages/cli/dist/commands/chat.d.ts.map +1 -0
- package/packages/cli/dist/commands/chat.js +129 -0
- package/packages/cli/dist/commands/chat.js.map +1 -0
- package/packages/cli/dist/commands/isolation.d.ts +20 -0
- package/packages/cli/dist/commands/isolation.d.ts.map +1 -0
- package/packages/cli/dist/commands/isolation.js +104 -0
- package/packages/cli/dist/commands/isolation.js.map +1 -0
- package/packages/cli/dist/commands/run.d.ts +37 -1
- package/packages/cli/dist/commands/run.d.ts.map +1 -1
- package/packages/cli/dist/commands/run.js +165 -15
- package/packages/cli/dist/commands/run.js.map +1 -1
- package/packages/cli/dist/commands/telemetry.d.ts +10 -0
- package/packages/cli/dist/commands/telemetry.d.ts.map +1 -0
- package/packages/cli/dist/commands/telemetry.js +51 -0
- package/packages/cli/dist/commands/telemetry.js.map +1 -0
- package/packages/cli/dist/commands/validate.d.ts +12 -0
- package/packages/cli/dist/commands/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/validate.js +83 -0
- package/packages/cli/dist/commands/validate.js.map +1 -0
- package/packages/cli/dist/commands/workflow.d.ts +29 -0
- package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
- package/packages/cli/dist/commands/workflow.js +147 -0
- package/packages/cli/dist/commands/workflow.js.map +1 -0
- package/packages/cli/dist/index.js +253 -6
- package/packages/cli/dist/index.js.map +1 -1
- package/packages/cli/dist/mcp/server.d.ts +9 -0
- package/packages/cli/dist/mcp/server.d.ts.map +1 -1
- package/packages/cli/dist/mcp/server.js +40 -2
- package/packages/cli/dist/mcp/server.js.map +1 -1
- package/packages/cli/dist/server/app.d.ts.map +1 -1
- package/packages/cli/dist/server/app.js +2 -0
- package/packages/cli/dist/server/app.js.map +1 -1
- package/packages/cli/dist/server/routes/conversations.d.ts +6 -0
- package/packages/cli/dist/server/routes/conversations.d.ts.map +1 -0
- package/packages/cli/dist/server/routes/conversations.js +145 -0
- package/packages/cli/dist/server/routes/conversations.js.map +1 -0
- package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
- package/packages/cli/dist/server/routes/runs.js +15 -3
- package/packages/cli/dist/server/routes/runs.js.map +1 -1
- package/packages/cli/dist/server/services/execution-manager.d.ts +25 -0
- package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
- package/packages/cli/dist/server/services/execution-manager.js +257 -95
- package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
- package/packages/core/dist/config/ai-config.d.ts +24 -0
- package/packages/core/dist/config/ai-config.d.ts.map +1 -0
- package/packages/core/dist/config/ai-config.js +170 -0
- package/packages/core/dist/config/ai-config.js.map +1 -0
- package/packages/core/dist/engine/dag-executor.d.ts +29 -1
- package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
- package/packages/core/dist/engine/dag-executor.js +210 -8
- package/packages/core/dist/engine/dag-executor.js.map +1 -1
- package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
- package/packages/core/dist/engine/dag-parser.js +32 -1
- package/packages/core/dist/engine/dag-parser.js.map +1 -1
- package/packages/core/dist/engine/loop-signal.d.ts +7 -0
- package/packages/core/dist/engine/loop-signal.d.ts.map +1 -0
- package/packages/core/dist/engine/loop-signal.js +21 -0
- package/packages/core/dist/engine/loop-signal.js.map +1 -0
- package/packages/core/dist/engine/node-runner.d.ts +4 -1
- package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
- package/packages/core/dist/engine/node-runner.js +14 -6
- package/packages/core/dist/engine/node-runner.js.map +1 -1
- package/packages/core/dist/index.d.ts +5 -2
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +25 -1
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/providers/default-adapters.d.ts.map +1 -1
- package/packages/core/dist/providers/default-adapters.js +9 -1
- package/packages/core/dist/providers/default-adapters.js.map +1 -1
- package/packages/core/dist/runtime/executor.d.ts +1 -1
- package/packages/core/dist/runtime/executor.d.ts.map +1 -1
- package/packages/core/dist/runtime/executor.js +14 -8
- package/packages/core/dist/runtime/executor.js.map +1 -1
- package/packages/core/dist/schema/workflow-schema.d.ts +94 -14
- package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/schema/workflow-schema.js +38 -6
- package/packages/core/dist/schema/workflow-schema.js.map +1 -1
- package/packages/core/dist/store/recovery.d.ts.map +1 -1
- package/packages/core/dist/store/recovery.js +7 -0
- package/packages/core/dist/store/recovery.js.map +1 -1
- package/packages/core/dist/store/run-store.d.ts +5 -3
- package/packages/core/dist/store/run-store.d.ts.map +1 -1
- package/packages/core/dist/store/run-store.js +12 -4
- package/packages/core/dist/store/run-store.js.map +1 -1
- package/packages/core/dist/store/sqlite-schema.d.ts +1 -1
- package/packages/core/dist/store/sqlite-schema.d.ts.map +1 -1
- package/packages/core/dist/store/sqlite-schema.js +20 -0
- package/packages/core/dist/store/sqlite-schema.js.map +1 -1
- package/packages/core/dist/store/sqlite-workflow-store.d.ts +26 -0
- package/packages/core/dist/store/sqlite-workflow-store.d.ts.map +1 -1
- package/packages/core/dist/store/sqlite-workflow-store.js +106 -0
- package/packages/core/dist/store/sqlite-workflow-store.js.map +1 -1
- package/packages/core/dist/store/types.d.ts +17 -0
- package/packages/core/dist/store/types.d.ts.map +1 -1
- package/packages/core/dist/store/types.js.map +1 -1
- package/packages/core/dist/telemetry/telemetry.d.ts +31 -0
- package/packages/core/dist/telemetry/telemetry.d.ts.map +1 -0
- package/packages/core/dist/telemetry/telemetry.js +177 -0
- package/packages/core/dist/telemetry/telemetry.js.map +1 -0
- package/packages/core/dist/types/dag.d.ts +16 -0
- package/packages/core/dist/types/dag.d.ts.map +1 -1
- package/packages/core/dist/types/provider.d.ts +4 -0
- package/packages/core/dist/types/provider.d.ts.map +1 -1
- package/packages/core/dist/types/workflow.d.ts +18 -1
- package/packages/core/dist/types/workflow.d.ts.map +1 -1
- package/packages/web/dist/web/browser/chunk-2JHYGCCN.js +1 -0
- package/packages/web/dist/web/browser/chunk-BMQT4ZPK.js +1 -0
- package/packages/web/dist/web/browser/chunk-GWHJRWJM.js +1 -0
- package/packages/web/dist/web/browser/chunk-OZ6BRCXC.js +1 -0
- package/packages/web/dist/web/browser/chunk-Q7N6DAKT.js +1 -0
- package/packages/web/dist/web/browser/chunk-SEBU2SK7.js +1 -0
- package/packages/web/dist/web/browser/chunk-SOS4TH5D.js +4 -0
- package/packages/web/dist/web/browser/chunk-WSAVMPNK.js +5 -0
- package/packages/web/dist/web/browser/index.html +1 -1
- package/packages/web/dist/web/browser/main-UPZIVGM6.js +1 -0
- package/packages/web/dist/web/browser/chunk-5WD7R336.js +0 -1
- package/packages/web/dist/web/browser/chunk-FXYDTGOX.js +0 -1
- package/packages/web/dist/web/browser/chunk-K4DHLOOA.js +0 -1
- package/packages/web/dist/web/browser/chunk-V2CDNNWN.js +0 -1
- package/packages/web/dist/web/browser/chunk-WJT4QH2P.js +0 -4
- package/packages/web/dist/web/browser/chunk-WMJLW2L6.js +0 -5
- package/packages/web/dist/web/browser/chunk-XHOL7AER.js +0 -1
- package/packages/web/dist/web/browser/chunk-YBYFKZWR.js +0 -1
- package/packages/web/dist/web/browser/main-SYHKSBNJ.js +0 -1
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { NodeStatus } from '../types/dag.js';
|
|
2
2
|
export type RunStatus = 'running' | 'completed' | 'failed' | 'paused' | 'cancelled';
|
|
3
|
+
/** Why a run is paused: an approval gate or an interactive until-loop gate. */
|
|
4
|
+
export interface PauseMetadata {
|
|
5
|
+
type: 'approval' | 'interactive_loop';
|
|
6
|
+
nodeId: string;
|
|
7
|
+
iteration?: number;
|
|
8
|
+
message?: string;
|
|
9
|
+
/** AI provider session of the paused until-loop node, resumed on the next iteration. */
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
}
|
|
3
12
|
export interface NodeResult {
|
|
4
13
|
status: NodeStatus;
|
|
5
14
|
output?: string;
|
|
@@ -24,6 +33,8 @@ export interface WorkflowRun {
|
|
|
24
33
|
startedAt: string;
|
|
25
34
|
completedAt?: string;
|
|
26
35
|
nodes: Record<string, NodeResult>;
|
|
36
|
+
pauseMetadata?: PauseMetadata;
|
|
37
|
+
loopUserInput?: string;
|
|
27
38
|
}
|
|
28
39
|
export interface HistoryEntry {
|
|
29
40
|
runId: string;
|
|
@@ -78,6 +89,8 @@ export interface WALEvent {
|
|
|
78
89
|
startedAt?: string;
|
|
79
90
|
completedAt?: string;
|
|
80
91
|
durationMs?: number;
|
|
92
|
+
pauseMetadata?: PauseMetadata;
|
|
93
|
+
loopUserInput?: string;
|
|
81
94
|
};
|
|
82
95
|
}
|
|
83
96
|
export interface CompactSnapshot {
|
|
@@ -93,6 +106,8 @@ export interface CompactSnapshot {
|
|
|
93
106
|
branchName?: string;
|
|
94
107
|
startedAt: string;
|
|
95
108
|
completedAt?: string;
|
|
109
|
+
pauseMetadata?: PauseMetadata;
|
|
110
|
+
loopUserInput?: string;
|
|
96
111
|
nodes: Record<string, {
|
|
97
112
|
status: NodeStatus;
|
|
98
113
|
outputRef?: string | {
|
|
@@ -138,5 +153,7 @@ export interface RecoveredState {
|
|
|
138
153
|
nodeResults: Record<string, NodeResult>;
|
|
139
154
|
retryCounts: Map<string, number>;
|
|
140
155
|
walSeq: number;
|
|
156
|
+
pauseMetadata?: PauseMetadata;
|
|
157
|
+
loopUserInput?: string;
|
|
141
158
|
}
|
|
142
159
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":";;;AA6IA,MAAa,YAAa,SAAQ,KAAK;IAGnB;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAA0D,EAC1D,IAAY,EACZ,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAsD;QAC1D,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAVD,oCAUC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DAGGraph } from '../types/dag.js';
|
|
2
|
+
export declare const TELEMETRY_ID_FILE = "telemetry-id";
|
|
3
|
+
export declare const TELEMETRY_NOTICE_FILE = "telemetry-notice-shown";
|
|
4
|
+
/**
|
|
5
|
+
* No default collector is embedded yet: telemetry stays off until an
|
|
6
|
+
* endpoint is configured via VSAF_TELEMETRY_ENDPOINT or telemetry.endpoint
|
|
7
|
+
* in ~/.vsaf/config.yaml. Once a release embeds one here, DO_NOT_TRACK,
|
|
8
|
+
* VSAF_TELEMETRY_DISABLED, and CI remain the opt-outs.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_TELEMETRY_ENDPOINT = "";
|
|
11
|
+
export interface TelemetryStatus {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
reason?: string;
|
|
14
|
+
telemetryId: string;
|
|
15
|
+
endpoint?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function getTelemetryId(homeDir?: string): string;
|
|
18
|
+
export declare function resetTelemetryId(homeDir?: string): string;
|
|
19
|
+
export declare function resolveTelemetryEndpoint(homeDir?: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
20
|
+
export declare function getTelemetryStatus(homeDir?: string, env?: NodeJS.ProcessEnv): TelemetryStatus;
|
|
21
|
+
/** Fire-and-forget: never throws, never blocks the workflow on failures. */
|
|
22
|
+
export declare function captureEvent(event: string, properties: Record<string, unknown>, homeDir?: string, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
23
|
+
export declare function sanitizeModelName(model: string): string;
|
|
24
|
+
export interface WorkflowEventOptions {
|
|
25
|
+
workflowName: string;
|
|
26
|
+
provider: string;
|
|
27
|
+
model: string;
|
|
28
|
+
bundledNames: Iterable<string>;
|
|
29
|
+
}
|
|
30
|
+
export declare function buildWorkflowEventProperties(graph: DAGGraph, options: WorkflowEventOptions): Record<string, unknown>;
|
|
31
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,MAAmB,GAAG,MAAM,CASnE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAmB,GAAG,MAAM,CAErE;AAWD,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,MAAmB,EAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAcpB;AAmBD,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,MAAmB,EAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CAOjB;AAED,4EAA4E;AAC5E,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,GAAE,MAAmB,EAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAiBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBzB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_TELEMETRY_ENDPOINT = exports.TELEMETRY_NOTICE_FILE = exports.TELEMETRY_ID_FILE = void 0;
|
|
7
|
+
exports.getTelemetryId = getTelemetryId;
|
|
8
|
+
exports.resetTelemetryId = resetTelemetryId;
|
|
9
|
+
exports.resolveTelemetryEndpoint = resolveTelemetryEndpoint;
|
|
10
|
+
exports.getTelemetryStatus = getTelemetryStatus;
|
|
11
|
+
exports.captureEvent = captureEvent;
|
|
12
|
+
exports.sanitizeModelName = sanitizeModelName;
|
|
13
|
+
exports.buildWorkflowEventProperties = buildWorkflowEventProperties;
|
|
14
|
+
// packages/core/src/telemetry/telemetry.ts
|
|
15
|
+
//
|
|
16
|
+
// Opt-out anonymous usage telemetry. Only shape data is ever sent —
|
|
17
|
+
// workflow name (bundled names only; user workflows report as 'custom'),
|
|
18
|
+
// node type counts, provider/model, and run outcome. Never prompts, node
|
|
19
|
+
// content, file paths, or arguments.
|
|
20
|
+
const fs_1 = require("fs");
|
|
21
|
+
const crypto_1 = require("crypto");
|
|
22
|
+
const path_1 = require("path");
|
|
23
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
24
|
+
const ai_config_js_1 = require("../config/ai-config.js");
|
|
25
|
+
exports.TELEMETRY_ID_FILE = 'telemetry-id';
|
|
26
|
+
exports.TELEMETRY_NOTICE_FILE = 'telemetry-notice-shown';
|
|
27
|
+
/**
|
|
28
|
+
* No default collector is embedded yet: telemetry stays off until an
|
|
29
|
+
* endpoint is configured via VSAF_TELEMETRY_ENDPOINT or telemetry.endpoint
|
|
30
|
+
* in ~/.vsaf/config.yaml. Once a release embeds one here, DO_NOT_TRACK,
|
|
31
|
+
* VSAF_TELEMETRY_DISABLED, and CI remain the opt-outs.
|
|
32
|
+
*/
|
|
33
|
+
exports.DEFAULT_TELEMETRY_ENDPOINT = '';
|
|
34
|
+
function getTelemetryId(homeDir = (0, ai_config_js_1.vsafHome)()) {
|
|
35
|
+
const idPath = (0, path_1.join)(homeDir, exports.TELEMETRY_ID_FILE);
|
|
36
|
+
try {
|
|
37
|
+
if ((0, fs_1.existsSync)(idPath)) {
|
|
38
|
+
const stored = (0, fs_1.readFileSync)(idPath, 'utf-8').trim();
|
|
39
|
+
if (stored)
|
|
40
|
+
return stored;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch { /* unreadable — fall through to a fresh id */ }
|
|
44
|
+
return writeTelemetryId(homeDir);
|
|
45
|
+
}
|
|
46
|
+
function resetTelemetryId(homeDir = (0, ai_config_js_1.vsafHome)()) {
|
|
47
|
+
return writeTelemetryId(homeDir);
|
|
48
|
+
}
|
|
49
|
+
function writeTelemetryId(homeDir) {
|
|
50
|
+
const id = (0, crypto_1.randomUUID)();
|
|
51
|
+
try {
|
|
52
|
+
(0, fs_1.mkdirSync)(homeDir, { recursive: true });
|
|
53
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(homeDir, exports.TELEMETRY_ID_FILE), `${id}\n`, 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
catch { /* session-only id when the home dir is not writable */ }
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
function resolveTelemetryEndpoint(homeDir = (0, ai_config_js_1.vsafHome)(), env = process.env) {
|
|
59
|
+
const fromEnv = env.VSAF_TELEMETRY_ENDPOINT;
|
|
60
|
+
if (fromEnv?.trim())
|
|
61
|
+
return fromEnv.trim();
|
|
62
|
+
const configPath = (0, path_1.join)(homeDir, 'config.yaml');
|
|
63
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
64
|
+
try {
|
|
65
|
+
const raw = js_yaml_1.default.load((0, fs_1.readFileSync)(configPath, 'utf-8'));
|
|
66
|
+
if (isRecord(raw) && isRecord(raw.telemetry) && typeof raw.telemetry.endpoint === 'string' && raw.telemetry.endpoint.trim()) {
|
|
67
|
+
return raw.telemetry.endpoint.trim();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch { /* malformed global config — fall through */ }
|
|
71
|
+
}
|
|
72
|
+
return exports.DEFAULT_TELEMETRY_ENDPOINT.trim() || undefined;
|
|
73
|
+
}
|
|
74
|
+
function disabledReason(homeDir, env) {
|
|
75
|
+
const endpoint = resolveTelemetryEndpoint(homeDir, env);
|
|
76
|
+
if (isTruthyFlag(env.VSAF_TELEMETRY_DISABLED)) {
|
|
77
|
+
return { reason: 'VSAF_TELEMETRY_DISABLED is set', endpoint };
|
|
78
|
+
}
|
|
79
|
+
if (isTruthyFlag(env.DO_NOT_TRACK)) {
|
|
80
|
+
return { reason: 'DO_NOT_TRACK is set', endpoint };
|
|
81
|
+
}
|
|
82
|
+
if (isTruthyFlag(env.CI)) {
|
|
83
|
+
return { reason: 'CI environment detected', endpoint };
|
|
84
|
+
}
|
|
85
|
+
if (!endpoint) {
|
|
86
|
+
return { reason: 'no telemetry endpoint configured' };
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
function getTelemetryStatus(homeDir = (0, ai_config_js_1.vsafHome)(), env = process.env) {
|
|
91
|
+
const telemetryId = getTelemetryId(homeDir);
|
|
92
|
+
const disabled = disabledReason(homeDir, env);
|
|
93
|
+
if (disabled) {
|
|
94
|
+
return { enabled: false, reason: disabled.reason, telemetryId, endpoint: disabled.endpoint };
|
|
95
|
+
}
|
|
96
|
+
return { enabled: true, telemetryId, endpoint: resolveTelemetryEndpoint(homeDir, env) };
|
|
97
|
+
}
|
|
98
|
+
/** Fire-and-forget: never throws, never blocks the workflow on failures. */
|
|
99
|
+
async function captureEvent(event, properties, homeDir = (0, ai_config_js_1.vsafHome)(), env = process.env) {
|
|
100
|
+
// Check opt-outs before touching the filesystem so disabled runs never
|
|
101
|
+
// create a telemetry id.
|
|
102
|
+
if (disabledReason(homeDir, env))
|
|
103
|
+
return;
|
|
104
|
+
const endpoint = resolveTelemetryEndpoint(homeDir, env);
|
|
105
|
+
maybeShowFirstRunNotice(homeDir);
|
|
106
|
+
const payload = {
|
|
107
|
+
event,
|
|
108
|
+
distinct_id: getTelemetryId(homeDir),
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
properties: {
|
|
111
|
+
os: process.platform,
|
|
112
|
+
arch: process.arch,
|
|
113
|
+
runtime_version: typeof Bun !== 'undefined' ? `bun-${Bun.version}` : process.version,
|
|
114
|
+
...properties,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
try {
|
|
118
|
+
await fetch(endpoint, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: { 'content-type': 'application/json' },
|
|
121
|
+
body: JSON.stringify(payload),
|
|
122
|
+
signal: AbortSignal.timeout(3_000),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch { /* telemetry is best-effort */ }
|
|
126
|
+
}
|
|
127
|
+
function maybeShowFirstRunNotice(homeDir) {
|
|
128
|
+
const noticePath = (0, path_1.join)(homeDir, exports.TELEMETRY_NOTICE_FILE);
|
|
129
|
+
try {
|
|
130
|
+
if ((0, fs_1.existsSync)(noticePath))
|
|
131
|
+
return;
|
|
132
|
+
(0, fs_1.mkdirSync)(homeDir, { recursive: true });
|
|
133
|
+
(0, fs_1.writeFileSync)(noticePath, new Date().toISOString(), 'utf-8');
|
|
134
|
+
console.error('[vsaf] Anonymous usage telemetry is enabled: workflow name (bundled only), '
|
|
135
|
+
+ 'node types, provider/model, and run outcome. Never prompts, code, or file paths. '
|
|
136
|
+
+ 'Opt out anytime with DO_NOT_TRACK=1 or VSAF_TELEMETRY_DISABLED=1. '
|
|
137
|
+
+ 'Inspect with: vsaf telemetry status');
|
|
138
|
+
}
|
|
139
|
+
catch { /* notice is best-effort */ }
|
|
140
|
+
}
|
|
141
|
+
function sanitizeModelName(model) {
|
|
142
|
+
return model.replace(/[^a-zA-Z0-9./:_-]/g, '').slice(0, 64);
|
|
143
|
+
}
|
|
144
|
+
function buildWorkflowEventProperties(graph, options) {
|
|
145
|
+
const bundled = new Set(options.bundledNames).has(options.workflowName);
|
|
146
|
+
const nodeTypes = {};
|
|
147
|
+
let usesLoop = false;
|
|
148
|
+
let usesHooks = false;
|
|
149
|
+
let usesOutputFormat = false;
|
|
150
|
+
for (const node of graph.nodes.values()) {
|
|
151
|
+
nodeTypes[node.type] = (nodeTypes[node.type] ?? 0) + 1;
|
|
152
|
+
if (node.loop)
|
|
153
|
+
usesLoop = true;
|
|
154
|
+
if (node.hooks?.pre?.length || node.hooks?.post?.length)
|
|
155
|
+
usesHooks = true;
|
|
156
|
+
if (node.outputFormat)
|
|
157
|
+
usesOutputFormat = true;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
workflow_name: bundled ? options.workflowName : 'custom',
|
|
161
|
+
workflow_source: bundled ? 'bundled' : 'custom',
|
|
162
|
+
node_count: graph.nodes.size,
|
|
163
|
+
node_types: nodeTypes,
|
|
164
|
+
uses_loop: usesLoop,
|
|
165
|
+
uses_hooks: usesHooks,
|
|
166
|
+
uses_output_format: usesOutputFormat,
|
|
167
|
+
provider: sanitizeModelName(options.provider),
|
|
168
|
+
model: sanitizeModelName(options.model),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function isTruthyFlag(value) {
|
|
172
|
+
return value === '1' || value?.toLowerCase() === 'true';
|
|
173
|
+
}
|
|
174
|
+
function isRecord(value) {
|
|
175
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { ErrorStrategy, OutputFormat, InputParamDef } from './workflow.js';
|
|
2
2
|
export type NodeStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
|
|
3
|
+
export interface NodeHook {
|
|
4
|
+
run: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface NodeHooks {
|
|
9
|
+
pre?: NodeHook[];
|
|
10
|
+
post?: NodeHook[];
|
|
11
|
+
}
|
|
3
12
|
export interface DAGNode {
|
|
4
13
|
id: string;
|
|
5
14
|
description?: string;
|
|
@@ -28,9 +37,16 @@ export interface DAGNode {
|
|
|
28
37
|
injectError: boolean;
|
|
29
38
|
backoffMs?: number;
|
|
30
39
|
};
|
|
40
|
+
untilLoop?: {
|
|
41
|
+
until: string;
|
|
42
|
+
interactive: boolean;
|
|
43
|
+
gateMessage?: string;
|
|
44
|
+
maxIterations: number;
|
|
45
|
+
};
|
|
31
46
|
runtime?: 'bun' | 'uv';
|
|
32
47
|
deps?: string[];
|
|
33
48
|
cancel?: string;
|
|
49
|
+
hooks?: NodeHooks;
|
|
34
50
|
approval?: {
|
|
35
51
|
message: string;
|
|
36
52
|
capture_response?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/types/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE;YACV,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B"}
|
|
1
|
+
{"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/types/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE;YACV,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B"}
|
|
@@ -6,12 +6,16 @@ export interface AIProviderConfig {
|
|
|
6
6
|
freshContext?: boolean;
|
|
7
7
|
/** CLI permission mode (e.g. acceptEdits) — lets non-interactive AI nodes write files. */
|
|
8
8
|
permissionMode?: string;
|
|
9
|
+
/** Continue a prior provider session (e.g. `claude --resume <id>`) so the model keeps its memory. */
|
|
10
|
+
resumeSessionId?: string;
|
|
9
11
|
}
|
|
10
12
|
export interface AIProviderResult {
|
|
11
13
|
output: string;
|
|
12
14
|
structuredOutput?: Record<string, unknown>;
|
|
13
15
|
tokensUsed: number;
|
|
14
16
|
durationMs: number;
|
|
17
|
+
/** Provider session id (e.g. claude CLI session_id) that can resume this conversation. */
|
|
18
|
+
sessionId?: string;
|
|
15
19
|
}
|
|
16
20
|
export interface AIProvider {
|
|
17
21
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7E,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC"}
|
|
@@ -20,6 +20,22 @@ export interface LoopConfig {
|
|
|
20
20
|
inject_error?: boolean;
|
|
21
21
|
backoff_ms?: number;
|
|
22
22
|
}
|
|
23
|
+
/** Iterate a prompt node until its output contains the signal (Archon-style). */
|
|
24
|
+
export interface UntilLoopConfig {
|
|
25
|
+
until: string;
|
|
26
|
+
interactive?: boolean;
|
|
27
|
+
gate_message?: string;
|
|
28
|
+
max_iterations?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface NodeHookDefinition {
|
|
31
|
+
run: string;
|
|
32
|
+
name?: string;
|
|
33
|
+
timeout?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface NodeHooksDefinition {
|
|
36
|
+
pre?: NodeHookDefinition[];
|
|
37
|
+
post?: NodeHookDefinition[];
|
|
38
|
+
}
|
|
23
39
|
export interface NodeDefinition {
|
|
24
40
|
id: string;
|
|
25
41
|
description?: string;
|
|
@@ -47,10 +63,11 @@ export interface NodeDefinition {
|
|
|
47
63
|
allowed_tools?: string[];
|
|
48
64
|
output_format?: OutputFormat;
|
|
49
65
|
workspace?: boolean;
|
|
50
|
-
loop?: LoopConfig;
|
|
66
|
+
loop?: LoopConfig | UntilLoopConfig;
|
|
51
67
|
on_error?: ErrorStrategy;
|
|
52
68
|
idempotent?: boolean;
|
|
53
69
|
timeout?: number;
|
|
70
|
+
hooks?: NodeHooksDefinition;
|
|
54
71
|
}
|
|
55
72
|
export interface WorkflowDefinition {
|
|
56
73
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/types/workflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE;YACV,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/types/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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-OZ6BRCXC.js";import{$ as _,Aa as G,C as o,Ca as H,Da as J,G as w,Ha as K,Ja as Q,K as f,Ka as U,N as y,O as F,P as L,Q as A,R as S,S as E,T as s,U as n,V as t,W as B,X as j,Y as $,_ as b,aa as p,da as v,f as N,fa as i,ga as c,h as V,ha as u,i as z,ia as Y,ja as h,ka as M,la as P,oa as I,p as C,pa as D,q as g,qa as R,r as x,v as k,za as q}from"./chunk-WSAVMPNK.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as B,b as j,c as q,d as $,e as D,f as Q,g as G,h as J,i as Y,j as H,k as K}from"./chunk-OZ6BRCXC.js";import{$ as _,Aa as N,C as l,Da as L,G as W,Ja as A,K as u,Ka as R,T as c,U as n,V as t,X as v,Y as M,_ as x,aa as s,ba as F,ca as I,da as h,f as O,fa as o,ga as g,h as S,ha as V,i as E,ia as y,ja as w,ka as b,la as C,oa as k,p as P,q as m,r as f,ra as T,za as z}from"./chunk-WSAVMPNK.js";var X=a=>({folder:a}),Z=a=>({id:a});function te(a,i){a&1&&(n(0,"div",7),o(1,"Loading workflows..."),t())}function ne(a,i){if(a&1&&(n(0,"div",8),o(1),t()),a&2){let e=s();l(),g(e.loadError)}}function oe(a,i){if(a&1&&(n(0,"p"),o(1),t()),a&2){let e=s(3);l(),g(e.folderError)}}function re(a,i){if(a&1){let e=x();n(0,"form",30),_("ngSubmit",function(){m(e);let d=s(2);return f(d.createFolder())}),n(1,"span"),o(2),t(),n(3,"input",31),C("ngModelChange",function(d){m(e);let p=s(2);return b(p.newFolderName,d)||(p.newFolderName=d),f(d)}),t(),n(4,"div")(5,"button",32),o(6,"Create"),t(),n(7,"button",22),_("click",function(){m(e);let d=s(2);return f(d.cancelFolder())}),o(8,"Cancel"),t()(),u(9,oe,2,1,"p",33),t()}if(a&2){let e=s(2);l(2),g(e.selectedFolder?e.selectedFolder+"/":""),l(),w("ngModel",e.newFolderName),l(2),c("disabled",e.creatingFolder),l(4),c("ngIf",e.folderError)}}function ie(a,i){if(a&1){let e=x();n(0,"button",34),_("click",function(){let d=m(e).$implicit,p=s(2);return f(p.selectFolder(d.path))}),n(1,"span",16),o(2,"\u203A"),t(),n(3,"span"),o(4),t(),n(5,"strong"),o(6),t()()}if(a&2){let e=i.$implicit,r=s(2);I("padding-left",14+e.depth*16,"px"),h("active",r.selectedFolder===e.path),l(4),g(e.name),l(2),g(e.count)}}function le(a,i){if(a&1){let e=x();v(0),n(1,"span"),o(2,"/"),t(),n(3,"button",22),_("click",function(){let d=m(e).$implicit,p=s(2);return f(p.selectFolder(d.path))}),o(4),t(),M()}if(a&2){let e=i.$implicit,r=i.last;l(3),h("current",r),l(),g(e.name)}}function ae(a,i){if(a&1){let e=x();n(0,"article",35),_("click",function(){let d=m(e).$implicit,p=s(2);return f(p.selectWorkflow(d))}),n(1,"div",36)(2,"span",37),o(3,"Y"),t(),n(4,"div")(5,"strong"),o(6),t(),n(7,"p"),o(8),t()()(),n(9,"span",38),o(10),t(),n(11,"code"),o(12),t(),n(13,"div",39)(14,"a",40),_("click",function(d){return d.stopPropagation()}),o(15,"Details"),t(),n(16,"button",22),_("click",function(d){let p=m(e).$implicit,ee=s(2);return d.stopPropagation(),f(ee.selectWorkflow(p))}),o(17,"Run"),t()()()}if(a&2){let e=i.$implicit,r=s(2);h("selected",(r.selectedWorkflow==null?null:r.selectedWorkflow.id)===e.id),l(6),g(e.name),l(2),g(e.description||"No description provided."),l(2),g(e.nodeCount),l(2),g(e.file),l(2),c("queryParams",k(7,Z,e.id))}}function de(a,i){a&1&&(n(0,"div",41),o(1,"No workflows match this folder and search."),t())}function ce(a,i){if(a&1&&(n(0,"option",55),o(1),t()),a&2){let e=i.$implicit;c("value",e.name)("disabled",!e.available),l(),y(" ",e.name,"",e.available?"":" \u2014 not available on this machine"," ")}}function se(a,i){if(a&1&&(n(0,"option",56),o(1),t()),a&2){let e=i.$implicit;c("value",e),l(),g(e)}}function pe(a,i){if(a&1){let e=x();v(0),n(1,"label",48),o(2,"Provider"),t(),n(3,"select",49),C("ngModelChange",function(d){m(e);let p=s(3);return b(p.runProvider,d)||(p.runProvider=d),f(d)}),_("ngModelChange",function(){m(e);let d=s(3);return f(d.onRunProviderChange())}),n(4,"option",50),o(5,"(workflow default)"),t(),u(6,ce,2,4,"option",51),t(),n(7,"label",52),o(8,"Model"),t(),n(9,"select",53),C("ngModelChange",function(d){m(e);let p=s(3);return b(p.runModel,d)||(p.runModel=d),f(d)}),n(10,"option",50),o(11,"(workflow default)"),t(),u(12,se,2,2,"option",54),t(),M()}if(a&2){let e=s(3);l(3),w("ngModel",e.runProvider),c("disabled",e.running),l(3),c("ngForOf",e.providers),l(3),w("ngModel",e.runModel),c("disabled",e.running),l(3),c("ngForOf",e.runModelOptions)}}function ge(a,i){if(a&1&&(n(0,"div",57),o(1),t()),a&2){let e=s(3);l(),g(e.runError)}}function me(a,i){if(a&1){let e=x();v(0),n(1,"div",12),o(2,"Run workflow"),t(),n(3,"span",42),o(4),t(),n(5,"h2"),o(6),t(),n(7,"p"),o(8),t(),n(9,"dl")(10,"div")(11,"dt"),o(12,"Nodes"),t(),n(13,"dd"),o(14),t()(),n(15,"div")(16,"dt"),o(17,"File"),t(),n(18,"dd"),o(19),t()()(),n(20,"label",43),o(21,"Arguments"),t(),n(22,"input",44),C("ngModelChange",function(d){m(e);let p=s(2);return b(p.runArgs,d)||(p.runArgs=d),f(d)}),t(),u(23,pe,13,6,"ng-container",33),n(24,"button",45),_("click",function(){m(e);let d=s(2);return f(d.runSelected())}),o(25),t(),n(26,"a",46),o(27,"Open details"),t(),u(28,ge,2,1,"div",47),M()}if(a&2){let e=s(2);l(4),g(e.selectedWorkflow.id),l(2),g(e.selectedWorkflow.name),l(2),g(e.selectedWorkflow.description||"No description provided."),l(6),g(e.selectedWorkflow.nodeCount),l(5),g(e.selectedWorkflow.file),l(3),w("ngModel",e.runArgs),c("disabled",e.running),l(),c("ngIf",e.providers.length),l(),c("disabled",e.running),l(),V(" ",e.running?"Starting...":"Run workflow"," "),l(),c("queryParams",k(12,Z,e.selectedWorkflow.id)),l(2),c("ngIf",e.runError)}}function fe(a,i){a&1&&(n(0,"div",12),o(1,"Inspector"),t(),n(2,"p"),o(3,"Select a workflow to inspect and run it."),t())}function _e(a,i){if(a&1){let e=x();n(0,"div",9)(1,"aside",10)(2,"div",11)(3,"div",12),o(4,"Folders"),t(),n(5,"button",13),_("click",function(){m(e);let d=s();return f(d.showFolderForm=!0)}),o(6,"+"),t()(),u(7,re,10,4,"form",14),n(8,"button",15),_("click",function(){m(e);let d=s();return f(d.selectFolder(""))}),n(9,"span",16),o(10,"\u2302"),t(),n(11,"span"),o(12,".vsaf/workflows"),t(),n(13,"strong"),o(14),t()(),u(15,ie,7,6,"button",17),n(16,"a",18),o(17,"+ Workflow in this folder"),t()(),n(18,"main",19)(19,"div",20)(20,"div")(21,"nav",21)(22,"button",22),_("click",function(){m(e);let d=s();return f(d.selectFolder(""))}),o(23,"workflows"),t(),u(24,le,5,3,"ng-container",23),t(),n(25,"p"),o(26),t()(),n(27,"input",24),C("ngModelChange",function(d){m(e);let p=s();return b(p.searchQuery,d)||(p.searchQuery=d),f(d)}),t()(),n(28,"div",25)(29,"span"),o(30,"Name"),t(),n(31,"span"),o(32,"Nodes"),t(),n(33,"span"),o(34,"Location"),t(),n(35,"span"),o(36,"Actions"),t()(),u(37,ae,18,9,"article",26)(38,de,2,0,"div",27),t(),n(39,"aside",28),u(40,me,29,14,"ng-container",29)(41,fe,4,0,"ng-template",null,0,T),t()()}if(a&2){let e=F(42),r=s();l(7),c("ngIf",r.showFolderForm),l(),h("active",r.selectedFolder===""),l(6),g(r.workflows.length),l(),c("ngForOf",r.folders),l(),c("queryParams",k(15,X,r.selectedFolder||null)),l(8),c("ngForOf",r.breadcrumbs),l(2),y("",r.visibleWorkflows.length," workflow",r.visibleWorkflows.length===1?"":"s"),l(),w("ngModel",r.searchQuery),l(10),c("ngForOf",r.visibleWorkflows)("ngForTrackBy",r.trackWorkflow),l(),c("ngIf",!r.visibleWorkflows.length),l(2),c("ngIf",r.selectedWorkflow)("ngIfElse",e)}}var U=class a{api=P(K);router=P(A);workflows=[];folderPaths=[];providers=[];loading=!0;loadError="";selectedFolder="";selectedWorkflow;searchQuery="";runArgs="";runProvider="";runModel="";running=!1;runError="";showFolderForm=!1;newFolderName="";creatingFolder=!1;folderError="";ngOnInit(){S({workflows:this.api.getWorkflows(),folders:this.api.getWorkflowFolders(),providers:this.api.getProviders().pipe(E(()=>O({providers:[]})))}).subscribe({next:i=>{this.workflows=i.workflows,this.folderPaths=i.folders,this.providers=i.providers.providers??[],this.loading=!1},error:i=>{this.loadError=i?.error?.error??"Failed to load workflows.",this.loading=!1}})}get runModelOptions(){return this.runProvider?this.providers.find(i=>i.name===this.runProvider)?.defaultModels??[]:[...new Set(this.providers.flatMap(i=>i.defaultModels))]}onRunProviderChange(){this.runModel&&!this.runModelOptions.includes(this.runModel)&&(this.runModel="")}get folders(){let i=new Set(this.folderPaths);for(let e of this.workflows){let r=e.directory.split("/").filter(Boolean);r.forEach((d,p)=>i.add(r.slice(0,p+1).join("/")))}return[...i].sort().map(e=>({path:e,name:e.slice(e.lastIndexOf("/")+1),depth:e.split("/").length-1,count:this.workflows.filter(r=>r.directory===e||r.directory.startsWith(`${e}/`)).length}))}get breadcrumbs(){let i=this.selectedFolder.split("/").filter(Boolean);return i.map((e,r)=>({name:e,path:i.slice(0,r+1).join("/")}))}get visibleWorkflows(){let i=this.searchQuery.trim().toLowerCase();return this.workflows.filter(e=>{let r=!this.selectedFolder||e.directory===this.selectedFolder,d=!i||`${e.name} ${e.id} ${e.description}`.toLowerCase().includes(i);return r&&d})}selectFolder(i){this.selectedFolder=i,this.selectedWorkflow=void 0,this.runError=""}createFolder(){let i=this.newFolderName.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");if(!i){this.folderError="Enter a valid folder name.";return}let e=this.selectedFolder?`${this.selectedFolder}/${i}`:i;this.creatingFolder=!0,this.folderError="",this.api.createWorkflowFolder(e).subscribe({next:()=>{this.creatingFolder=!1,this.folderPaths=[...new Set([...this.folderPaths,e])].sort(),this.selectFolder(e),this.cancelFolder()},error:r=>{this.creatingFolder=!1,this.folderError=r?.error?.error??"Failed to create folder."}})}cancelFolder(){this.showFolderForm=!1,this.newFolderName="",this.folderError=""}selectWorkflow(i){this.selectedWorkflow=i,this.runError=""}trackWorkflow(i,e){return e.id}runSelected(){!this.selectedWorkflow||this.running||(this.running=!0,this.api.startRun(this.selectedWorkflow.id,this.runArgs,{provider:this.runProvider||void 0,model:this.runModel||void 0}).subscribe({next:i=>this.router.navigate(["/runs",i.runId]),error:i=>{this.running=!1,this.runError=i?.error?.error??"Failed to start workflow."}}))}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=W({type:a,selectors:[["app-workflows"]],decls:14,vars:6,consts:[["noSelection",""],[1,"page"],[1,"page-header"],["routerLink","/workflows/builder",1,"primary-button",3,"queryParams"],["class","state",4,"ngIf"],["class","state error",4,"ngIf"],["class","explorer",4,"ngIf"],[1,"state"],[1,"state","error"],[1,"explorer"],[1,"folder-panel"],[1,"folder-heading"],[1,"panel-heading"],["type","button","title","Create subfolder",3,"click"],["class","folder-form",3,"ngSubmit",4,"ngIf"],["type","button",1,"folder-row","root",3,"click"],[1,"chevron"],["type","button","class","folder-row",3,"active","padding-left","click",4,"ngFor","ngForOf"],["routerLink","/workflows/builder",1,"folder-new-flow",3,"queryParams"],[1,"content-panel"],[1,"content-toolbar"],["aria-label","Workflow folder",1,"breadcrumb"],["type","button",3,"click"],[4,"ngFor","ngForOf"],["type","search","placeholder","Search this workspace",3,"ngModelChange","ngModel"],[1,"column-head"],["class","workflow-row",3,"selected","click",4,"ngFor","ngForOf","ngForTrackBy"],["class","empty",4,"ngIf"],[1,"run-panel"],[4,"ngIf","ngIfElse"],[1,"folder-form",3,"ngSubmit"],["name","folderName","placeholder","folder-name","autofocus","",3,"ngModelChange","ngModel"],["type","submit",3,"disabled"],[4,"ngIf"],["type","button",1,"folder-row",3,"click"],[1,"workflow-row",3,"click"],[1,"workflow-name"],[1,"file-icon"],[1,"node-count"],[1,"row-actions"],["routerLink","/workflows/detail",3,"click","queryParams"],[1,"empty"],[1,"namespace"],["for","run-args"],["id","run-args","placeholder","Optional run args",3,"ngModelChange","ngModel","disabled"],["type","button",1,"run-button",3,"click","disabled"],["routerLink","/workflows/detail",1,"details-button",3,"queryParams"],["class","run-error",4,"ngIf"],["for","run-provider"],["id","run-provider",1,"run-select",3,"ngModelChange","ngModel","disabled"],["value",""],[3,"value","disabled",4,"ngFor","ngForOf"],["for","run-model"],["id","run-model",1,"run-select",3,"ngModelChange","ngModel","disabled"],[3,"value",4,"ngFor","ngForOf"],[3,"value","disabled"],[3,"value"],[1,"run-error"]],template:function(e,r){e&1&&(n(0,"section",1)(1,"header",2)(2,"div")(3,"h1"),o(4,"Workflows"),t(),n(5,"p"),o(6,"Browse workflow definitions by their directory structure."),t()(),n(7,"a",3)(8,"span"),o(9,"+"),t(),o(10," New workflow"),t()(),u(11,te,2,0,"div",4)(12,ne,2,1,"div",5)(13,_e,43,17,"div",6),t()),e&2&&(l(7),c("queryParams",k(4,X,r.selectedFolder||null)),l(4),c("ngIf",r.loading),l(),c("ngIf",r.loadError),l(),c("ngIf",!r.loading&&!r.loadError))},dependencies:[L,z,N,H,Q,J,Y,B,G,j,q,D,$,R],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}.page[_ngcontent-%COMP%]{padding:22px;max-width:1600px;margin:auto}.page-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:21px;margin:0}.page-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .content-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font-size:13px;color:#8f96a3;margin:4px 0 0}.primary-button[_ngcontent-%COMP%], .details-button[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:7px;background:#6366f1;color:#fff;text-decoration:none;padding:9px 12px;border-radius:6px;font-size:13px;font-weight:700}.explorer[_ngcontent-%COMP%]{display:grid;grid-template-columns:240px minmax(500px,1fr) 280px;min-height:620px;border:1px solid #292c34;border-radius:7px;overflow:hidden;background:#15161a}.folder-panel[_ngcontent-%COMP%], .run-panel[_ngcontent-%COMP%]{background:#131419}.folder-panel[_ngcontent-%COMP%]{border-right:1px solid #292c34;padding:12px 8px}.run-panel[_ngcontent-%COMP%]{border-left:1px solid #292c34;padding:14px}.panel-heading[_ngcontent-%COMP%]{font-size:11px;color:#8f96a3;text-transform:uppercase;font-weight:800;margin:3px 7px 12px}.folder-heading[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.folder-heading[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:24px;height:24px;border:1px solid #353842;border-radius:4px;background:#202229;color:#fff;cursor:pointer}.folder-form[_ngcontent-%COMP%]{border:1px solid #383b45;background:#191b20;padding:8px;margin-bottom:8px;border-radius:5px}.folder-form[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;color:#777e8b;font-size:10px;overflow-wrap:anywhere}.folder-form[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{box-sizing:border-box;width:100%;margin:5px 0;border:1px solid #3b3e49;background:#101114;color:#fff;padding:6px;border-radius:4px}.folder-form[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;gap:5px}.folder-form[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #3b3e49;background:#252731;color:#ddd;padding:4px 6px;border-radius:4px;font-size:10px}.folder-form[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#fca5a5;font-size:10px;margin:6px 0 0}.folder-new-flow[_ngcontent-%COMP%]{display:block;color:#a5b4fc;text-decoration:none;font-size:11px;padding:9px 12px;border-top:1px solid #292c34;margin-top:8px}.folder-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:16px minmax(0,1fr) auto;gap:7px;align-items:center;width:100%;height:34px;border:0;border-radius:5px;background:transparent;color:#b7bbc4;text-align:left;cursor:pointer;padding-right:9px}.folder-row[_ngcontent-%COMP%]:hover, .folder-row.active[_ngcontent-%COMP%]{background:#242630;color:#fff}.folder-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.folder-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:10px;color:#6f7684}.chevron[_ngcontent-%COMP%]{color:#7c83ff}.content-panel[_ngcontent-%COMP%]{min-width:0;padding:0 16px 20px}.content-toolbar[_ngcontent-%COMP%]{min-height:72px;display:flex;justify-content:space-between;align-items:center;gap:20px;border-bottom:1px solid #292c34}.breadcrumb[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px}.breadcrumb[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:0;background:transparent;color:#949ba8;padding:0;cursor:pointer;font-weight:600}.breadcrumb[_ngcontent-%COMP%] button.current[_ngcontent-%COMP%]{color:#fff}.breadcrumb[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#555b67}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{box-sizing:border-box;border:1px solid #343741;background:#101114;color:#eee;border-radius:5px;padding:8px 10px;outline:none}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:260px}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus, .run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus{border-color:#6366f1}.column-head[_ngcontent-%COMP%], .workflow-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(220px,1.4fr) 60px minmax(150px,.8fr) 120px;gap:12px;align-items:center}.column-head[_ngcontent-%COMP%]{height:38px;color:#707784;font-size:10px;text-transform:uppercase;font-weight:800}.workflow-row[_ngcontent-%COMP%]{min-height:68px;border-top:1px solid #25272e;padding:10px 0;cursor:pointer}.workflow-row[_ngcontent-%COMP%]:hover, .workflow-row.selected[_ngcontent-%COMP%]{background:#1b1d23}.workflow-name[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;min-width:0;padding-left:8px}.workflow-name[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{min-width:0}.file-icon[_ngcontent-%COMP%]{display:grid;place-items:center;flex:0 0 28px;width:28px;height:32px;border:1px solid #4b4f5c;border-radius:4px;color:#a5b4fc;font-size:11px;font-weight:900}.workflow-name[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;font-size:13px;overflow-wrap:anywhere}.workflow-name[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0 0;color:#777e8b;font-size:11px;line-height:1.4;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.node-count[_ngcontent-%COMP%]{color:#aeb4bf;font-size:12px}.workflow-row[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-size:10px;color:#777e8b;overflow:hidden;text-overflow:ellipsis}.row-actions[_ngcontent-%COMP%]{display:flex;gap:6px}.row-actions[_ngcontent-%COMP%] a[_ngcontent-%COMP%], .row-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #383b45;background:#202229;color:#c9ccd3;border-radius:4px;padding:5px 7px;text-decoration:none;font:inherit;font-size:11px;cursor:pointer}.run-panel[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:16px;margin:7px 0}.run-panel[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9299a5;font-size:12px;line-height:1.5}.namespace[_ngcontent-%COMP%]{font:10px ui-monospace,monospace;color:#818cf8;overflow-wrap:anywhere}.run-panel[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{border-top:1px solid #292c34;border-bottom:1px solid #292c34;padding:8px 0;margin:14px 0}.run-panel[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-size:11px;padding:4px 0}.run-panel[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:#777e8b}.run-panel[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;max-width:170px;overflow-wrap:anywhere;text-align:right}.run-panel[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:block;font-size:10px;text-transform:uppercase;color:#8f96a3;font-weight:700;margin:12px 0 6px}.run-panel[_ngcontent-%COMP%] label[_ngcontent-%COMP%]:first-of-type{margin-top:0}.run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%}.run-select[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box;border:1px solid #343741;background:#101114;color:#eee;border-radius:5px;padding:8px 10px;outline:none}.run-select[_ngcontent-%COMP%]:focus{border-color:#6366f1}.run-select[_ngcontent-%COMP%]:disabled{opacity:.55}.run-button[_ngcontent-%COMP%], .details-button[_ngcontent-%COMP%]{width:100%;justify-content:center;box-sizing:border-box;margin-top:9px;border:0}.run-button[_ngcontent-%COMP%]{background:#059669;color:#fff;padding:9px;border-radius:5px;font-weight:700;cursor:pointer}.run-button[_ngcontent-%COMP%]:disabled{opacity:.5}.details-button[_ngcontent-%COMP%]{background:#242630}.run-error[_ngcontent-%COMP%], .state.error[_ngcontent-%COMP%]{color:#fecaca}.run-error[_ngcontent-%COMP%]{font-size:11px;margin-top:10px}.state[_ngcontent-%COMP%], .empty[_ngcontent-%COMP%]{border:1px solid #292c34;padding:18px;color:#949ba8;border-radius:6px}.empty[_ngcontent-%COMP%]{text-align:center;margin-top:12px}.state[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:#0b0c0f;padding:2px 5px}@media(max-width:1100px){.explorer[_ngcontent-%COMP%]{grid-template-columns:210px 1fr}.run-panel[_ngcontent-%COMP%]{display:none}}@media(max-width:720px){.page[_ngcontent-%COMP%]{padding:14px}.page-header[_ngcontent-%COMP%]{align-items:flex-start}.explorer[_ngcontent-%COMP%]{display:block}.folder-panel[_ngcontent-%COMP%]{border-right:0;border-bottom:1px solid #292c34}.content-toolbar[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column;padding:14px 0}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%}.column-head[_ngcontent-%COMP%]{display:none}.workflow-row[_ngcontent-%COMP%]{grid-template-columns:1fr auto}.workflow-row[_ngcontent-%COMP%] > code[_ngcontent-%COMP%], .node-count[_ngcontent-%COMP%]{display:none}}"]})};export{U as WorkflowsComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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-OZ6BRCXC.js";import{$ as v,Aa as $,Ba as z,C as s,Ca as B,Da as V,G as F,K as u,Ka as j,N as h,T as l,U as r,V as a,W as L,Z as S,_ as y,aa as p,ba as b,da as R,fa as o,ga as c,ha as I,j as P,ja as k,ka as E,la as D,oa as _,p as A,pa as C,q as x,qa as O,r as f,ra as M,za as N}from"./chunk-WSAVMPNK.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};
|