@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.
Files changed (139) hide show
  1. package/README.md +55 -1
  2. package/package.json +1 -1
  3. package/packages/cli/dist/commands/abandon.d.ts +6 -0
  4. package/packages/cli/dist/commands/abandon.d.ts.map +1 -0
  5. package/packages/cli/dist/commands/abandon.js +42 -0
  6. package/packages/cli/dist/commands/abandon.js.map +1 -0
  7. package/packages/cli/dist/commands/ai.d.ts +21 -0
  8. package/packages/cli/dist/commands/ai.d.ts.map +1 -0
  9. package/packages/cli/dist/commands/ai.js +76 -0
  10. package/packages/cli/dist/commands/ai.js.map +1 -0
  11. package/packages/cli/dist/commands/approve.d.ts +19 -0
  12. package/packages/cli/dist/commands/approve.d.ts.map +1 -0
  13. package/packages/cli/dist/commands/approve.js +115 -0
  14. package/packages/cli/dist/commands/approve.js.map +1 -0
  15. package/packages/cli/dist/commands/chat.d.ts +41 -0
  16. package/packages/cli/dist/commands/chat.d.ts.map +1 -0
  17. package/packages/cli/dist/commands/chat.js +129 -0
  18. package/packages/cli/dist/commands/chat.js.map +1 -0
  19. package/packages/cli/dist/commands/isolation.d.ts +20 -0
  20. package/packages/cli/dist/commands/isolation.d.ts.map +1 -0
  21. package/packages/cli/dist/commands/isolation.js +104 -0
  22. package/packages/cli/dist/commands/isolation.js.map +1 -0
  23. package/packages/cli/dist/commands/run.d.ts +37 -1
  24. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  25. package/packages/cli/dist/commands/run.js +165 -15
  26. package/packages/cli/dist/commands/run.js.map +1 -1
  27. package/packages/cli/dist/commands/telemetry.d.ts +10 -0
  28. package/packages/cli/dist/commands/telemetry.d.ts.map +1 -0
  29. package/packages/cli/dist/commands/telemetry.js +51 -0
  30. package/packages/cli/dist/commands/telemetry.js.map +1 -0
  31. package/packages/cli/dist/commands/validate.d.ts +12 -0
  32. package/packages/cli/dist/commands/validate.d.ts.map +1 -0
  33. package/packages/cli/dist/commands/validate.js +83 -0
  34. package/packages/cli/dist/commands/validate.js.map +1 -0
  35. package/packages/cli/dist/commands/workflow.d.ts +29 -0
  36. package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
  37. package/packages/cli/dist/commands/workflow.js +147 -0
  38. package/packages/cli/dist/commands/workflow.js.map +1 -0
  39. package/packages/cli/dist/index.js +253 -6
  40. package/packages/cli/dist/index.js.map +1 -1
  41. package/packages/cli/dist/mcp/server.d.ts +9 -0
  42. package/packages/cli/dist/mcp/server.d.ts.map +1 -1
  43. package/packages/cli/dist/mcp/server.js +40 -2
  44. package/packages/cli/dist/mcp/server.js.map +1 -1
  45. package/packages/cli/dist/server/app.d.ts.map +1 -1
  46. package/packages/cli/dist/server/app.js +2 -0
  47. package/packages/cli/dist/server/app.js.map +1 -1
  48. package/packages/cli/dist/server/routes/conversations.d.ts +6 -0
  49. package/packages/cli/dist/server/routes/conversations.d.ts.map +1 -0
  50. package/packages/cli/dist/server/routes/conversations.js +145 -0
  51. package/packages/cli/dist/server/routes/conversations.js.map +1 -0
  52. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  53. package/packages/cli/dist/server/routes/runs.js +15 -3
  54. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  55. package/packages/cli/dist/server/services/execution-manager.d.ts +25 -0
  56. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  57. package/packages/cli/dist/server/services/execution-manager.js +257 -95
  58. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  59. package/packages/core/dist/config/ai-config.d.ts +24 -0
  60. package/packages/core/dist/config/ai-config.d.ts.map +1 -0
  61. package/packages/core/dist/config/ai-config.js +170 -0
  62. package/packages/core/dist/config/ai-config.js.map +1 -0
  63. package/packages/core/dist/engine/dag-executor.d.ts +29 -1
  64. package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
  65. package/packages/core/dist/engine/dag-executor.js +210 -8
  66. package/packages/core/dist/engine/dag-executor.js.map +1 -1
  67. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  68. package/packages/core/dist/engine/dag-parser.js +32 -1
  69. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  70. package/packages/core/dist/engine/loop-signal.d.ts +7 -0
  71. package/packages/core/dist/engine/loop-signal.d.ts.map +1 -0
  72. package/packages/core/dist/engine/loop-signal.js +21 -0
  73. package/packages/core/dist/engine/loop-signal.js.map +1 -0
  74. package/packages/core/dist/engine/node-runner.d.ts +4 -1
  75. package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
  76. package/packages/core/dist/engine/node-runner.js +14 -6
  77. package/packages/core/dist/engine/node-runner.js.map +1 -1
  78. package/packages/core/dist/index.d.ts +5 -2
  79. package/packages/core/dist/index.d.ts.map +1 -1
  80. package/packages/core/dist/index.js +25 -1
  81. package/packages/core/dist/index.js.map +1 -1
  82. package/packages/core/dist/providers/default-adapters.d.ts.map +1 -1
  83. package/packages/core/dist/providers/default-adapters.js +9 -1
  84. package/packages/core/dist/providers/default-adapters.js.map +1 -1
  85. package/packages/core/dist/runtime/executor.d.ts +1 -1
  86. package/packages/core/dist/runtime/executor.d.ts.map +1 -1
  87. package/packages/core/dist/runtime/executor.js +14 -8
  88. package/packages/core/dist/runtime/executor.js.map +1 -1
  89. package/packages/core/dist/schema/workflow-schema.d.ts +94 -14
  90. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  91. package/packages/core/dist/schema/workflow-schema.js +38 -6
  92. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  93. package/packages/core/dist/store/recovery.d.ts.map +1 -1
  94. package/packages/core/dist/store/recovery.js +7 -0
  95. package/packages/core/dist/store/recovery.js.map +1 -1
  96. package/packages/core/dist/store/run-store.d.ts +5 -3
  97. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  98. package/packages/core/dist/store/run-store.js +12 -4
  99. package/packages/core/dist/store/run-store.js.map +1 -1
  100. package/packages/core/dist/store/sqlite-schema.d.ts +1 -1
  101. package/packages/core/dist/store/sqlite-schema.d.ts.map +1 -1
  102. package/packages/core/dist/store/sqlite-schema.js +20 -0
  103. package/packages/core/dist/store/sqlite-schema.js.map +1 -1
  104. package/packages/core/dist/store/sqlite-workflow-store.d.ts +26 -0
  105. package/packages/core/dist/store/sqlite-workflow-store.d.ts.map +1 -1
  106. package/packages/core/dist/store/sqlite-workflow-store.js +106 -0
  107. package/packages/core/dist/store/sqlite-workflow-store.js.map +1 -1
  108. package/packages/core/dist/store/types.d.ts +17 -0
  109. package/packages/core/dist/store/types.d.ts.map +1 -1
  110. package/packages/core/dist/store/types.js.map +1 -1
  111. package/packages/core/dist/telemetry/telemetry.d.ts +31 -0
  112. package/packages/core/dist/telemetry/telemetry.d.ts.map +1 -0
  113. package/packages/core/dist/telemetry/telemetry.js +177 -0
  114. package/packages/core/dist/telemetry/telemetry.js.map +1 -0
  115. package/packages/core/dist/types/dag.d.ts +16 -0
  116. package/packages/core/dist/types/dag.d.ts.map +1 -1
  117. package/packages/core/dist/types/provider.d.ts +4 -0
  118. package/packages/core/dist/types/provider.d.ts.map +1 -1
  119. package/packages/core/dist/types/workflow.d.ts +18 -1
  120. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  121. package/packages/web/dist/web/browser/chunk-2JHYGCCN.js +1 -0
  122. package/packages/web/dist/web/browser/chunk-BMQT4ZPK.js +1 -0
  123. package/packages/web/dist/web/browser/chunk-GWHJRWJM.js +1 -0
  124. package/packages/web/dist/web/browser/chunk-OZ6BRCXC.js +1 -0
  125. package/packages/web/dist/web/browser/chunk-Q7N6DAKT.js +1 -0
  126. package/packages/web/dist/web/browser/chunk-SEBU2SK7.js +1 -0
  127. package/packages/web/dist/web/browser/chunk-SOS4TH5D.js +4 -0
  128. package/packages/web/dist/web/browser/chunk-WSAVMPNK.js +5 -0
  129. package/packages/web/dist/web/browser/index.html +1 -1
  130. package/packages/web/dist/web/browser/main-UPZIVGM6.js +1 -0
  131. package/packages/web/dist/web/browser/chunk-5WD7R336.js +0 -1
  132. package/packages/web/dist/web/browser/chunk-FXYDTGOX.js +0 -1
  133. package/packages/web/dist/web/browser/chunk-K4DHLOOA.js +0 -1
  134. package/packages/web/dist/web/browser/chunk-V2CDNNWN.js +0 -1
  135. package/packages/web/dist/web/browser/chunk-WJT4QH2P.js +0 -4
  136. package/packages/web/dist/web/browser/chunk-WMJLW2L6.js +0 -5
  137. package/packages/web/dist/web/browser/chunk-XHOL7AER.js +0 -1
  138. package/packages/web/dist/web/browser/chunk-YBYFKZWR.js +0 -1
  139. package/packages/web/dist/web/browser/main-SYHKSBNJ.js +0 -1
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.execTelemetryStatus = execTelemetryStatus;
4
+ exports.execTelemetryReset = execTelemetryReset;
5
+ exports.formatTelemetryStatus = formatTelemetryStatus;
6
+ exports.listBundledWorkflowNames = listBundledWorkflowNames;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const core_1 = require("@vsaf/core");
10
+ function execTelemetryStatus(homeDir = (0, core_1.vsafHome)()) {
11
+ return (0, core_1.getTelemetryStatus)(homeDir);
12
+ }
13
+ function execTelemetryReset(homeDir = (0, core_1.vsafHome)()) {
14
+ return (0, core_1.resetTelemetryId)(homeDir);
15
+ }
16
+ function formatTelemetryStatus(status) {
17
+ const lines = [
18
+ `Telemetry: ${status.enabled ? 'enabled' : `disabled (${status.reason})`}`,
19
+ `Telemetry ID: ${status.telemetryId}`,
20
+ ];
21
+ if (status.endpoint) {
22
+ lines.push(`Endpoint: ${status.endpoint}`);
23
+ }
24
+ lines.push('Opt out with: DO_NOT_TRACK=1 or VSAF_TELEMETRY_DISABLED=1');
25
+ return lines.join('\n');
26
+ }
27
+ /**
28
+ * Workflow names shipped inside the published package (<root>/workflows/**).
29
+ * Only these names are ever reported in telemetry; anything else is 'custom'.
30
+ */
31
+ function listBundledWorkflowNames() {
32
+ // Package root is 4 levels up from packages/cli/{src,dist}/commands.
33
+ const workflowsDir = (0, path_1.join)(__dirname, '..', '..', '..', '..', 'workflows');
34
+ if (!(0, fs_1.existsSync)(workflowsDir))
35
+ return [];
36
+ const names = [];
37
+ const scan = (dir) => {
38
+ for (const entry of (0, fs_1.readdirSync)(dir)) {
39
+ const fullPath = (0, path_1.join)(dir, entry);
40
+ if ((0, fs_1.statSync)(fullPath).isDirectory()) {
41
+ scan(fullPath);
42
+ }
43
+ else if (/\.ya?ml$/.test(entry)) {
44
+ names.push(entry.replace(/\.ya?ml$/, ''));
45
+ }
46
+ }
47
+ };
48
+ scan(workflowsDir);
49
+ return names;
50
+ }
51
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":";;AASA,kDAEC;AAED,gDAEC;AAED,sDAUC;AAMD,4DAiBC;AAlDD,2BAAuD;AACvD,+BAA4B;AAC5B,qCAKoB;AAEpB,SAAgB,mBAAmB,CAAC,UAAkB,IAAA,eAAQ,GAAE;IAC9D,OAAO,IAAA,yBAAkB,EAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAAkB,IAAA,eAAQ,GAAE;IAC7D,OAAO,IAAA,uBAAgB,EAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAuB;IAC3D,MAAM,KAAK,GAAG;QACZ,iBAAiB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,MAAM,GAAG,EAAE;QAC7E,iBAAiB,MAAM,CAAC,WAAW,EAAE;KACtC,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB;IACtC,qEAAqE;IACrE,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1E,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,IAAA,gBAAW,EAAC,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,YAAY,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface WorkflowValidationIssue {
2
+ workflow: string;
3
+ level: 'error' | 'warning';
4
+ message: string;
5
+ }
6
+ export interface ValidateWorkflowsResult {
7
+ checked: string[];
8
+ issues: WorkflowValidationIssue[];
9
+ ok: boolean;
10
+ }
11
+ export declare function validateWorkflows(projectPath: string, name?: string): ValidateWorkflowsResult;
12
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAClC,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAmD7F"}
@@ -0,0 +1,83 @@
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.validateWorkflows = validateWorkflows;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const js_yaml_1 = __importDefault(require("js-yaml"));
10
+ const core_1 = require("@vsaf/core");
11
+ function validateWorkflows(projectPath, name) {
12
+ const wfDir = (0, path_1.join)(projectPath, '.vsaf', 'workflows');
13
+ const issues = [];
14
+ const checked = [];
15
+ const files = name ? resolveNamed(wfDir, name) : discoverYamlFiles(wfDir);
16
+ if (name && files.length === 0) {
17
+ issues.push({ workflow: name, level: 'error', message: `Workflow not found: ${name}` });
18
+ return { checked, issues, ok: false };
19
+ }
20
+ for (const file of files) {
21
+ const workflowId = (0, path_1.relative)(wfDir, file).split(path_1.sep).join('/').replace(/\.(yaml|yml)$/, '');
22
+ checked.push(workflowId);
23
+ const content = (0, fs_1.readFileSync)(file, 'utf-8');
24
+ let raw;
25
+ try {
26
+ raw = js_yaml_1.default.load(content);
27
+ }
28
+ catch (err) {
29
+ issues.push({ workflow: workflowId, level: 'error', message: `YAML parse error: ${err.message}` });
30
+ continue;
31
+ }
32
+ const schema = (0, core_1.validateWorkflowSchema)(raw);
33
+ if (!schema.valid) {
34
+ for (const error of schema.errors) {
35
+ issues.push({ workflow: workflowId, level: 'error', message: error });
36
+ }
37
+ continue;
38
+ }
39
+ try {
40
+ const graph = (0, core_1.parseWorkflow)(content);
41
+ for (const [nodeId, node] of graph.nodes) {
42
+ if (node.type !== 'command')
43
+ continue;
44
+ const commandFile = (0, path_1.join)(projectPath, '.vsaf', 'commands', `${node.content}.md`);
45
+ if (!(0, fs_1.existsSync)(commandFile)) {
46
+ issues.push({
47
+ workflow: workflowId,
48
+ level: 'error',
49
+ message: `Node "${nodeId}" references command "${node.content}" but ${(0, path_1.join)('.vsaf', 'commands', `${node.content}.md`)} does not exist`,
50
+ });
51
+ }
52
+ }
53
+ }
54
+ catch (err) {
55
+ issues.push({ workflow: workflowId, level: 'error', message: err.message });
56
+ }
57
+ }
58
+ return { checked, issues, ok: !issues.some((i) => i.level === 'error') };
59
+ }
60
+ function resolveNamed(wfDir, name) {
61
+ for (const ext of ['.yaml', '.yml']) {
62
+ const candidate = (0, path_1.join)(wfDir, `${name}${ext}`);
63
+ if ((0, fs_1.existsSync)(candidate))
64
+ return [candidate];
65
+ }
66
+ return [];
67
+ }
68
+ function discoverYamlFiles(dir) {
69
+ if (!(0, fs_1.existsSync)(dir))
70
+ return [];
71
+ const files = [];
72
+ for (const entry of (0, fs_1.readdirSync)(dir).sort()) {
73
+ const fullPath = (0, path_1.join)(dir, entry);
74
+ if ((0, fs_1.statSync)(fullPath).isDirectory()) {
75
+ files.push(...discoverYamlFiles(fullPath));
76
+ }
77
+ else if (/\.(yaml|yml)$/.test(entry)) {
78
+ files.push(fullPath);
79
+ }
80
+ }
81
+ return files;
82
+ }
83
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Git-repo-backed registry: a JSON index pointing at YAML workflow files. */
2
+ export declare const DEFAULT_REGISTRY_INDEX_URL = "https://raw.githubusercontent.com/ngocsangairvds-tech/vsaf-workflows/main/index.json";
3
+ export interface MarketplaceEntry {
4
+ slug: string;
5
+ name: string;
6
+ description: string;
7
+ tags: string[];
8
+ /** Absolute URL of the workflow YAML. Takes precedence over `path`. */
9
+ url?: string;
10
+ /** Path relative to the index URL (typical for a git repo registry). */
11
+ path?: string;
12
+ }
13
+ export interface RegistryOptions {
14
+ indexUrl?: string;
15
+ }
16
+ export interface InstallOptions extends RegistryOptions {
17
+ force?: boolean;
18
+ }
19
+ export interface InstallResult {
20
+ slug: string;
21
+ path: string;
22
+ }
23
+ export declare function resolveRegistryIndexUrl(homeDir?: string): string;
24
+ export declare function fetchRegistryIndex(indexUrl: string): Promise<MarketplaceEntry[]>;
25
+ export declare function searchEntries(entries: MarketplaceEntry[], query?: string): MarketplaceEntry[];
26
+ export declare function execWorkflowSearch(query: string | undefined, options?: RegistryOptions): Promise<MarketplaceEntry[]>;
27
+ export declare function execWorkflowInstall(slug: string, projectPath: string, options?: InstallOptions): Promise<InstallResult>;
28
+ export declare function formatSearchResults(entries: MarketplaceEntry[]): string;
29
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,eAAO,MAAM,0BAA0B,yFACiD,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,MAAmB,GAAG,MAAM,CAc5E;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyBtF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAO7F;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAI9H;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoCjI;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAcvE"}
@@ -0,0 +1,147 @@
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_REGISTRY_INDEX_URL = void 0;
7
+ exports.resolveRegistryIndexUrl = resolveRegistryIndexUrl;
8
+ exports.fetchRegistryIndex = fetchRegistryIndex;
9
+ exports.searchEntries = searchEntries;
10
+ exports.execWorkflowSearch = execWorkflowSearch;
11
+ exports.execWorkflowInstall = execWorkflowInstall;
12
+ exports.formatSearchResults = formatSearchResults;
13
+ const fs_1 = require("fs");
14
+ const path_1 = require("path");
15
+ const js_yaml_1 = __importDefault(require("js-yaml"));
16
+ const core_1 = require("@vsaf/core");
17
+ /** Git-repo-backed registry: a JSON index pointing at YAML workflow files. */
18
+ exports.DEFAULT_REGISTRY_INDEX_URL = 'https://raw.githubusercontent.com/ngocsangairvds-tech/vsaf-workflows/main/index.json';
19
+ const SLUG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/i;
20
+ function resolveRegistryIndexUrl(homeDir = (0, core_1.vsafHome)()) {
21
+ const fromEnv = process.env.VSAF_WORKFLOW_REGISTRY;
22
+ if (fromEnv?.trim())
23
+ return fromEnv.trim();
24
+ const configPath = (0, path_1.join)(homeDir, 'config.yaml');
25
+ if ((0, fs_1.existsSync)(configPath)) {
26
+ try {
27
+ const raw = js_yaml_1.default.load((0, fs_1.readFileSync)(configPath, 'utf-8'));
28
+ if (isRecord(raw) && isRecord(raw.marketplace) && typeof raw.marketplace.index_url === 'string' && raw.marketplace.index_url.trim()) {
29
+ return raw.marketplace.index_url.trim();
30
+ }
31
+ }
32
+ catch { /* malformed global config — fall through to default */ }
33
+ }
34
+ return exports.DEFAULT_REGISTRY_INDEX_URL;
35
+ }
36
+ async function fetchRegistryIndex(indexUrl) {
37
+ let response;
38
+ try {
39
+ response = await fetch(indexUrl, { signal: AbortSignal.timeout(15_000) });
40
+ }
41
+ catch (err) {
42
+ throw new Error(`Failed to fetch registry index from ${indexUrl}: ${err.message}`);
43
+ }
44
+ if (!response.ok) {
45
+ throw new Error(`Failed to fetch registry index from ${indexUrl}: HTTP ${response.status}`);
46
+ }
47
+ let parsed;
48
+ try {
49
+ parsed = await response.json();
50
+ }
51
+ catch {
52
+ throw new Error(`Registry index at ${indexUrl} is not valid JSON`);
53
+ }
54
+ if (!isRecord(parsed) || !Array.isArray(parsed.workflows)) {
55
+ throw new Error(`Registry index at ${indexUrl} has no "workflows" array`);
56
+ }
57
+ const entries = [];
58
+ for (const item of parsed.workflows) {
59
+ const entry = readEntry(item);
60
+ if (entry)
61
+ entries.push(entry);
62
+ }
63
+ return entries;
64
+ }
65
+ function searchEntries(entries, query) {
66
+ const needle = query?.trim().toLowerCase();
67
+ if (!needle)
68
+ return [...entries];
69
+ return entries.filter((entry) => {
70
+ const haystack = [entry.slug, entry.name, entry.description, ...entry.tags].join(' ').toLowerCase();
71
+ return haystack.includes(needle);
72
+ });
73
+ }
74
+ async function execWorkflowSearch(query, options = {}) {
75
+ const indexUrl = options.indexUrl ?? resolveRegistryIndexUrl();
76
+ const entries = await fetchRegistryIndex(indexUrl);
77
+ return searchEntries(entries, query);
78
+ }
79
+ async function execWorkflowInstall(slug, projectPath, options = {}) {
80
+ const indexUrl = options.indexUrl ?? resolveRegistryIndexUrl();
81
+ const entries = await fetchRegistryIndex(indexUrl);
82
+ const entry = entries.find((candidate) => candidate.slug === slug);
83
+ if (!entry) {
84
+ const available = entries.map((candidate) => candidate.slug).join(', ');
85
+ throw new Error(`Workflow "${slug}" not found in registry. Available: ${available || '(none)'}`);
86
+ }
87
+ const communityDir = (0, path_1.join)(projectPath, '.vsaf', 'workflows', 'community');
88
+ const targetPath = (0, path_1.join)(communityDir, `${entry.slug}.yaml`);
89
+ if ((0, fs_1.existsSync)(targetPath) && !options.force) {
90
+ throw new Error(`Workflow "${slug}" is already installed at ${targetPath}. Use --force to overwrite.`);
91
+ }
92
+ const workflowUrl = entry.url ?? new URL(entry.path, indexUrl).href;
93
+ let response;
94
+ try {
95
+ response = await fetch(workflowUrl, { signal: AbortSignal.timeout(15_000) });
96
+ }
97
+ catch (err) {
98
+ throw new Error(`Failed to download workflow from ${workflowUrl}: ${err.message}`);
99
+ }
100
+ if (!response.ok) {
101
+ throw new Error(`Failed to download workflow from ${workflowUrl}: HTTP ${response.status}`);
102
+ }
103
+ const content = await response.text();
104
+ try {
105
+ (0, core_1.parseWorkflow)(content);
106
+ }
107
+ catch (err) {
108
+ throw new Error(`Workflow "${slug}" failed validation: ${err.message}`);
109
+ }
110
+ (0, fs_1.mkdirSync)(communityDir, { recursive: true });
111
+ (0, fs_1.writeFileSync)(targetPath, content, 'utf-8');
112
+ return { slug: entry.slug, path: targetPath };
113
+ }
114
+ function formatSearchResults(entries) {
115
+ if (entries.length === 0) {
116
+ return 'No workflows found in the registry.';
117
+ }
118
+ const lines = ['SLUG'.padEnd(25) + 'NAME'.padEnd(25) + 'TAGS'.padEnd(20) + 'DESCRIPTION'];
119
+ for (const entry of entries) {
120
+ lines.push(entry.slug.padEnd(25)
121
+ + entry.name.padEnd(25)
122
+ + entry.tags.join(',').padEnd(20)
123
+ + entry.description);
124
+ }
125
+ return lines.join('\n');
126
+ }
127
+ function readEntry(value) {
128
+ if (!isRecord(value))
129
+ return undefined;
130
+ const { slug, name, description, tags, url, path } = value;
131
+ if (typeof slug !== 'string' || !SLUG_PATTERN.test(slug))
132
+ return undefined;
133
+ if (typeof url !== 'string' && typeof path !== 'string')
134
+ return undefined;
135
+ return {
136
+ slug,
137
+ name: typeof name === 'string' ? name : slug,
138
+ description: typeof description === 'string' ? description : '',
139
+ tags: Array.isArray(tags) ? tags.filter((tag) => typeof tag === 'string') : [],
140
+ url: typeof url === 'string' ? url : undefined,
141
+ path: typeof path === 'string' ? path : undefined,
142
+ };
143
+ }
144
+ function isRecord(value) {
145
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
146
+ }
147
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"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"}