callman-core 1.26.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/ai-packs/db-queries.md +10 -1
  2. package/ai-packs/diagram-components.md +373 -0
  3. package/dist/curl/bodyFormat.d.ts +4 -0
  4. package/dist/curl/bodyFormat.d.ts.map +1 -0
  5. package/dist/curl/bodyFormat.js +80 -0
  6. package/dist/curl/bodyFormat.js.map +1 -0
  7. package/dist/curl/index.d.ts +5 -0
  8. package/dist/curl/index.d.ts.map +1 -0
  9. package/dist/curl/index.js +4 -0
  10. package/dist/curl/index.js.map +1 -0
  11. package/dist/curl/parseCurl.d.ts +4 -0
  12. package/dist/curl/parseCurl.d.ts.map +1 -0
  13. package/dist/curl/parseCurl.js +288 -0
  14. package/dist/curl/parseCurl.js.map +1 -0
  15. package/dist/curl/rows.d.ts +6 -0
  16. package/dist/curl/rows.d.ts.map +1 -0
  17. package/dist/curl/rows.js +23 -0
  18. package/dist/curl/rows.js.map +1 -0
  19. package/dist/curl/types.d.ts +21 -0
  20. package/dist/curl/types.d.ts.map +1 -0
  21. package/dist/curl/types.js +6 -0
  22. package/dist/curl/types.js.map +1 -0
  23. package/dist/diagram/componentCatalog.d.ts +31 -0
  24. package/dist/diagram/componentCatalog.d.ts.map +1 -0
  25. package/dist/diagram/componentCatalog.data.d.ts +3 -0
  26. package/dist/diagram/componentCatalog.data.d.ts.map +1 -0
  27. package/dist/diagram/componentCatalog.data.js +287 -0
  28. package/dist/diagram/componentCatalog.data.js.map +1 -0
  29. package/dist/diagram/componentCatalog.js +71 -0
  30. package/dist/diagram/componentCatalog.js.map +1 -0
  31. package/dist/diagram/edgeSemantics.d.ts +28 -0
  32. package/dist/diagram/edgeSemantics.d.ts.map +1 -0
  33. package/dist/diagram/edgeSemantics.js +78 -0
  34. package/dist/diagram/edgeSemantics.js.map +1 -0
  35. package/dist/diagram/elkGraph.d.ts +80 -0
  36. package/dist/diagram/elkGraph.d.ts.map +1 -0
  37. package/dist/diagram/elkGraph.js +283 -0
  38. package/dist/diagram/elkGraph.js.map +1 -0
  39. package/dist/diagram/index.d.ts +7 -0
  40. package/dist/diagram/index.d.ts.map +1 -0
  41. package/dist/diagram/index.js +13 -0
  42. package/dist/diagram/index.js.map +1 -0
  43. package/dist/diagram/migrations.d.ts +3 -0
  44. package/dist/diagram/migrations.d.ts.map +1 -0
  45. package/dist/diagram/migrations.js +33 -0
  46. package/dist/diagram/migrations.js.map +1 -0
  47. package/dist/diagram/normalize.d.ts +4 -0
  48. package/dist/diagram/normalize.d.ts.map +1 -0
  49. package/dist/diagram/normalize.js +68 -0
  50. package/dist/diagram/normalize.js.map +1 -0
  51. package/dist/diagram/schema.d.ts +116 -0
  52. package/dist/diagram/schema.d.ts.map +1 -0
  53. package/dist/diagram/schema.js +135 -0
  54. package/dist/diagram/schema.js.map +1 -0
  55. package/dist/http-file/detect.d.ts +12 -0
  56. package/dist/http-file/detect.d.ts.map +1 -0
  57. package/dist/http-file/detect.js +108 -0
  58. package/dist/http-file/detect.js.map +1 -0
  59. package/dist/http-file/flatImport.d.ts +32 -0
  60. package/dist/http-file/flatImport.d.ts.map +1 -0
  61. package/dist/http-file/flatImport.js +102 -0
  62. package/dist/http-file/flatImport.js.map +1 -0
  63. package/dist/http-file/index.d.ts +4 -0
  64. package/dist/http-file/index.d.ts.map +1 -0
  65. package/dist/http-file/index.js +7 -0
  66. package/dist/http-file/index.js.map +1 -0
  67. package/dist/http-file/parseHttpFile.d.ts +12 -0
  68. package/dist/http-file/parseHttpFile.d.ts.map +1 -0
  69. package/dist/http-file/parseHttpFile.js +122 -0
  70. package/dist/http-file/parseHttpFile.js.map +1 -0
  71. package/dist/index.d.ts +3 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +5 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -1
  76. package/dist/scenario-runner/adapters/request-executor.js +41 -0
  77. package/dist/scenario-runner/adapters/request-executor.js.map +1 -1
  78. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  79. package/dist/scenario-runner/runScenario.js +112 -0
  80. package/dist/scenario-runner/runScenario.js.map +1 -1
  81. package/dist/scenario-runner/types.d.ts +17 -0
  82. package/dist/scenario-runner/types.d.ts.map +1 -1
  83. package/dist-cjs/curl/bodyFormat.js +85 -0
  84. package/dist-cjs/curl/bodyFormat.js.map +1 -0
  85. package/dist-cjs/curl/index.js +15 -0
  86. package/dist-cjs/curl/index.js.map +1 -0
  87. package/dist-cjs/curl/parseCurl.js +293 -0
  88. package/dist-cjs/curl/parseCurl.js.map +1 -0
  89. package/dist-cjs/curl/rows.js +30 -0
  90. package/dist-cjs/curl/rows.js.map +1 -0
  91. package/dist-cjs/curl/types.js +7 -0
  92. package/dist-cjs/curl/types.js.map +1 -0
  93. package/dist-cjs/diagram/componentCatalog.data.js +290 -0
  94. package/dist-cjs/diagram/componentCatalog.data.js.map +1 -0
  95. package/dist-cjs/diagram/componentCatalog.js +79 -0
  96. package/dist-cjs/diagram/componentCatalog.js.map +1 -0
  97. package/dist-cjs/diagram/edgeSemantics.js +86 -0
  98. package/dist-cjs/diagram/edgeSemantics.js.map +1 -0
  99. package/dist-cjs/diagram/elkGraph.js +293 -0
  100. package/dist-cjs/diagram/elkGraph.js.map +1 -0
  101. package/dist-cjs/diagram/index.js +33 -0
  102. package/dist-cjs/diagram/index.js.map +1 -0
  103. package/dist-cjs/diagram/migrations.js +37 -0
  104. package/dist-cjs/diagram/migrations.js.map +1 -0
  105. package/dist-cjs/diagram/normalize.js +73 -0
  106. package/dist-cjs/diagram/normalize.js.map +1 -0
  107. package/dist-cjs/diagram/schema.js +144 -0
  108. package/dist-cjs/diagram/schema.js.map +1 -0
  109. package/dist-cjs/http-file/detect.js +113 -0
  110. package/dist-cjs/http-file/detect.js.map +1 -0
  111. package/dist-cjs/http-file/flatImport.js +109 -0
  112. package/dist-cjs/http-file/flatImport.js.map +1 -0
  113. package/dist-cjs/http-file/index.js +20 -0
  114. package/dist-cjs/http-file/index.js.map +1 -0
  115. package/dist-cjs/http-file/parseHttpFile.js +127 -0
  116. package/dist-cjs/http-file/parseHttpFile.js.map +1 -0
  117. package/dist-cjs/index.js +5 -0
  118. package/dist-cjs/index.js.map +1 -1
  119. package/dist-cjs/scenario-runner/adapters/request-executor.js +41 -0
  120. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -1
  121. package/dist-cjs/scenario-runner/runScenario.js +112 -0
  122. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  123. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ // The diagram DSL — the single source of truth for a diagram. A plain,
3
+ // versioned, git-diffable JSON model that is independent of any renderer
4
+ // (maxGraph in the desktop is just an editor of this document). AI generation,
5
+ // the MCP server and DB persistence produce/consume exactly this shape.
6
+ //
7
+ // Moved here from the desktop so every host validates with ONE validator.
8
+ // zod is intentionally NOT used: the hand validator keeps the module
9
+ // dependency-free and CSP-safe (it runs in the Electron renderer).
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.parseDiagramDocument = exports.safeParseDiagramDocument = exports.DiagramValidationError = exports.createEmptyDocument = exports.genId = exports.nowIso = exports.SCHEMA_VERSION = void 0;
12
+ exports.SCHEMA_VERSION = 1;
13
+ // --- id + time helpers -----------------------------------------------------
14
+ const nowIso = () => new Date().toISOString();
15
+ exports.nowIso = nowIso;
16
+ const randomBytes = (length) => {
17
+ const bytes = new Uint8Array(length);
18
+ const webCrypto = globalThis
19
+ .crypto;
20
+ if (webCrypto && typeof webCrypto.getRandomValues === "function") {
21
+ webCrypto.getRandomValues(bytes);
22
+ }
23
+ else {
24
+ // Node 18 without a global `crypto` — ids only need to be unique, not secret.
25
+ for (let index = 0; index < length; index += 1) {
26
+ bytes[index] = Math.floor(Math.random() * 256);
27
+ }
28
+ }
29
+ return bytes;
30
+ };
31
+ const genId = (prefix = "id") => {
32
+ const bytes = randomBytes(6);
33
+ let s = "";
34
+ for (const b of bytes)
35
+ s += b.toString(36).padStart(2, "0");
36
+ return `${prefix}_${s.slice(0, 8)}`;
37
+ };
38
+ exports.genId = genId;
39
+ // --- factories -------------------------------------------------------------
40
+ const createEmptyDocument = (title = "Untitled diagram") => {
41
+ const ts = (0, exports.nowIso)();
42
+ return {
43
+ schemaVersion: exports.SCHEMA_VERSION,
44
+ id: (0, exports.genId)("doc"),
45
+ meta: { title, createdAt: ts, updatedAt: ts },
46
+ canvas: { background: "dots", gridSize: 16 },
47
+ nodes: [],
48
+ edges: [],
49
+ };
50
+ };
51
+ exports.createEmptyDocument = createEmptyDocument;
52
+ // --- validation ------------------------------------------------------------
53
+ class DiagramValidationError extends Error {
54
+ errors;
55
+ constructor(errors) {
56
+ super(`Invalid DiagramDocument:\n- ${errors.join("\n- ")}`);
57
+ this.name = "DiagramValidationError";
58
+ this.errors = errors;
59
+ }
60
+ }
61
+ exports.DiagramValidationError = DiagramValidationError;
62
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
63
+ const isNum = (v) => typeof v === "number" && Number.isFinite(v);
64
+ const isStr = (v) => typeof v === "string";
65
+ const validateNode = (n, i, errors) => {
66
+ if (!isObject(n))
67
+ return void errors.push(`nodes[${i}] is not an object`);
68
+ if (!isStr(n.id))
69
+ errors.push(`nodes[${i}].id must be a string`);
70
+ if (!isStr(n.type))
71
+ errors.push(`nodes[${i}].type must be a string`);
72
+ if (!isObject(n.position) || !isNum(n.position.x) || !isNum(n.position.y))
73
+ errors.push(`nodes[${i}].position must be { x:number, y:number }`);
74
+ if (!isObject(n.size) || !isNum(n.size.width) || !isNum(n.size.height))
75
+ errors.push(`nodes[${i}].size must be { width:number, height:number }`);
76
+ };
77
+ const isPoint = (v) => isObject(v) && isNum(v.x) && isNum(v.y);
78
+ const validateEdge = (e, i, ids, errors) => {
79
+ if (!isObject(e))
80
+ return void errors.push(`edges[${i}] is not an object`);
81
+ if (!isStr(e.id))
82
+ errors.push(`edges[${i}].id must be a string`);
83
+ // Each endpoint is EITHER a cell id (node OR another edge) OR a free point
84
+ // (a standalone "Line" component). At least one of the two must be present.
85
+ if (e.source !== undefined) {
86
+ if (!isStr(e.source))
87
+ errors.push(`edges[${i}].source must be a string`);
88
+ else if (!ids.has(e.source))
89
+ errors.push(`edges[${i}].source "${e.source}" has no matching node/edge`);
90
+ }
91
+ else if (!isPoint(e.sourcePoint)) {
92
+ errors.push(`edges[${i}] needs a source id or a sourcePoint { x, y }`);
93
+ }
94
+ if (e.target !== undefined) {
95
+ if (!isStr(e.target))
96
+ errors.push(`edges[${i}].target must be a string`);
97
+ else if (!ids.has(e.target))
98
+ errors.push(`edges[${i}].target "${e.target}" has no matching node/edge`);
99
+ }
100
+ else if (!isPoint(e.targetPoint)) {
101
+ errors.push(`edges[${i}] needs a target id or a targetPoint { x, y }`);
102
+ }
103
+ };
104
+ const safeParseDiagramDocument = (input) => {
105
+ const errors = [];
106
+ if (!isObject(input))
107
+ return { ok: false, errors: ["document is not an object"] };
108
+ if (!isNum(input.schemaVersion))
109
+ errors.push("schemaVersion must be a number");
110
+ if (!isStr(input.id))
111
+ errors.push("id must be a string");
112
+ if (!isObject(input.meta) || !isStr(input.meta.title))
113
+ errors.push("meta.title must be a string");
114
+ if (!Array.isArray(input.nodes))
115
+ errors.push("nodes must be an array");
116
+ if (!Array.isArray(input.edges))
117
+ errors.push("edges must be an array");
118
+ if (errors.length)
119
+ return { ok: false, errors };
120
+ const nodes = input.nodes;
121
+ const edges = input.edges;
122
+ nodes.forEach((n, i) => validateNode(n, i, errors));
123
+ // Valid edge terminals = node ids + edge ids (edges may connect to edges).
124
+ const terminalIds = new Set();
125
+ for (const n of nodes)
126
+ if (isObject(n) && isStr(n.id))
127
+ terminalIds.add(n.id);
128
+ for (const e of edges)
129
+ if (isObject(e) && isStr(e.id))
130
+ terminalIds.add(e.id);
131
+ edges.forEach((e, i) => validateEdge(e, i, terminalIds, errors));
132
+ if (errors.length)
133
+ return { ok: false, errors };
134
+ return { ok: true, document: input };
135
+ };
136
+ exports.safeParseDiagramDocument = safeParseDiagramDocument;
137
+ const parseDiagramDocument = (input) => {
138
+ const result = (0, exports.safeParseDiagramDocument)(input);
139
+ if (!result.ok)
140
+ throw new DiagramValidationError(result.errors);
141
+ return result.document;
142
+ };
143
+ exports.parseDiagramDocument = parseDiagramDocument;
144
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/diagram/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectImportFormat = exports.importFormatLabel = exports.IMPORT_FORMAT_LABELS = void 0;
4
+ // "Which tool did this file come from?" — the single detector every import
5
+ // entry point (desktop drop zones, MCP `import_content`) routes through, so the
6
+ // format is auto-detected once and the user never has to pick a tool.
7
+ // YAML is only needed for OpenAPI / Insomnia v5; core has no YAML dependency,
8
+ // so the caller injects a loader (js-yaml's `load`) when it has one.
9
+ const parseCurl_js_1 = require("../curl/parseCurl.js");
10
+ // Product-facing tool names ("<label> import started — <file>").
11
+ exports.IMPORT_FORMAT_LABELS = {
12
+ postman: "Postman",
13
+ internal: "Callman",
14
+ scenario: "Callman scenario",
15
+ openapi: "OpenAPI",
16
+ insomnia: "Insomnia",
17
+ bruno: "Bruno",
18
+ curl: "cURL",
19
+ http: "HTTP file",
20
+ environment: "Environment",
21
+ unknown: "Unknown",
22
+ };
23
+ const importFormatLabel = (format) => exports.IMPORT_FORMAT_LABELS[format];
24
+ exports.importFormatLabel = importFormatLabel;
25
+ const extensionOf = (fileName) => {
26
+ const lower = fileName.toLowerCase();
27
+ const dot = lower.lastIndexOf(".");
28
+ return dot === -1 ? "" : lower.slice(dot);
29
+ };
30
+ const asObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
31
+ ? value
32
+ : null;
33
+ const tryJson = (text) => {
34
+ try {
35
+ return asObject(JSON.parse(text));
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ };
41
+ // JSON is valid YAML, but JSON is tried first (cheaper, and avoids YAML
42
+ // coercing numbers/dates).
43
+ const tryYaml = (text, parseYaml) => {
44
+ if (!parseYaml)
45
+ return null;
46
+ try {
47
+ return asObject(parseYaml(text));
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ };
53
+ // A cURL script (.sh/.txt) often opens with a shebang, comments and shell
54
+ // variable assignments before the first `curl`, so every line is scanned.
55
+ const hasCurlLine = (text) => text.split(/\r?\n/).some((line) => (0, parseCurl_js_1.isCurlCommand)(line));
56
+ const HTTP_REQUEST_LINE = /(^|\n)\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|CONNECT)\s+\S+/i;
57
+ const detect = (fileName, text, options) => {
58
+ const ext = extensionOf(fileName);
59
+ // 1. Unambiguous extensions — content-sniffing these is unreliable
60
+ // (.bru is a custom grammar; .http/.rest have no JSON/YAML shape).
61
+ if (ext === ".bru")
62
+ return "bruno";
63
+ if (ext === ".http" || ext === ".rest")
64
+ return "http";
65
+ // 2. Structured (JSON or YAML) formats. First match wins; order chosen so
66
+ // the shapes can't collide (internal is checked before Postman because
67
+ // both mention a "collection"; Postman uses `item`, Bruno uses `items`).
68
+ const doc = tryJson(text) ?? tryYaml(text, options.parseYaml);
69
+ if (doc) {
70
+ if (doc.kind === "callman.scenario")
71
+ return "scenario";
72
+ if ("collection" in doc && "requests" in doc && "folders" in doc)
73
+ return "internal";
74
+ const info = asObject(doc.info);
75
+ const schema = info && typeof info.schema === "string" ? info.schema : "";
76
+ if (schema.includes("schema.getpostman.com"))
77
+ return "postman";
78
+ if (info && Array.isArray(doc.item))
79
+ return "postman";
80
+ if (doc._type === "export" && "__export_format" in doc)
81
+ return "insomnia";
82
+ if (typeof doc.type === "string" && doc.type.startsWith("collection.insomnia"))
83
+ return "insomnia";
84
+ if (typeof doc.openapi === "string")
85
+ return "openapi";
86
+ if (doc.swagger === "2.0")
87
+ return "openapi";
88
+ if (Array.isArray(doc.items) && "version" in doc)
89
+ return "bruno";
90
+ // Environment export — checked AFTER every collection shape so a
91
+ // collection carrying its own `variable` array can't be mistaken for an
92
+ // env. Postman environment (`values` array / scope marker) or callman's
93
+ // env export (`{ name, variables: {…} }`).
94
+ if (Array.isArray(doc.values) ||
95
+ doc._postman_variable_scope === "environment" ||
96
+ asObject(doc.variables) !== null) {
97
+ return "environment";
98
+ }
99
+ }
100
+ // 3. Plain-text formats. cURL is checked before .http because a cURL line
101
+ // ("curl -X POST https://…") also matches the HTTP request-line regex.
102
+ if (hasCurlLine(text))
103
+ return "curl";
104
+ if (/(^|\n)\s*###/.test(text) || HTTP_REQUEST_LINE.test(text))
105
+ return "http";
106
+ return "unknown";
107
+ };
108
+ const detectImportFormat = (fileName, text, options = {}) => {
109
+ const format = detect(fileName, text, options);
110
+ return { format, label: exports.IMPORT_FORMAT_LABELS[format] };
111
+ };
112
+ exports.detectImportFormat = detectImportFormat;
113
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/http-file/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inferBodyStateFromRaw = exports.parseCurlFile = exports.splitCurlCommands = exports.requestNameFor = exports.collectionNameFromFileName = exports.toPersistedRequestBody = void 0;
4
+ // The flat payload the backend's `format: "requests"` import accepts — a plain
5
+ // list of requests, which is exactly what a cURL script or `.http` file
6
+ // amounts to. The server validates each entry with the same schema
7
+ // `POST /requests` uses, so anything valid for a single request is valid here.
8
+ // Parsers are PURE: they create nothing, so a file that fails partway leaves
9
+ // nothing behind (the caller sends the whole payload in one request).
10
+ const bodyFormat_js_1 = require("../curl/bodyFormat.js");
11
+ Object.defineProperty(exports, "inferBodyStateFromRaw", { enumerable: true, get: function () { return bodyFormat_js_1.inferBodyStateFromRaw; } });
12
+ const parseCurl_js_1 = require("../curl/parseCurl.js");
13
+ const rows_js_1 = require("../curl/rows.js");
14
+ // Editor body state → persisted body (mirror of the desktop's
15
+ // `serializeBodyState`, requestDraft.ts).
16
+ const toPersistedRequestBody = (body) => {
17
+ switch (body.mode) {
18
+ case "raw": {
19
+ if (!body.raw.trim())
20
+ return null;
21
+ const rawLanguage = body.rawLanguage ?? "json";
22
+ if (rawLanguage !== "json") {
23
+ return { mode: "raw", raw: body.raw, rawLanguage };
24
+ }
25
+ try {
26
+ return JSON.parse(body.raw);
27
+ }
28
+ catch {
29
+ return body.raw;
30
+ }
31
+ }
32
+ case "formdata":
33
+ return { mode: "formdata", formEntries: body.formEntries.filter((entry) => entry.key.trim()) };
34
+ case "urlencoded":
35
+ return { mode: "urlencoded", formEntries: body.formEntries.filter((entry) => entry.key.trim()) };
36
+ case "none":
37
+ default:
38
+ return null;
39
+ }
40
+ };
41
+ exports.toPersistedRequestBody = toPersistedRequestBody;
42
+ const collectionNameFromFileName = (fileName, fallback) => fileName.replace(/\.[^.]+$/, "").trim() || fallback;
43
+ exports.collectionNameFromFileName = collectionNameFromFileName;
44
+ // Best-effort human name from the URL path; falls back for templated
45
+ // ({{base}}/…) or malformed URLs that `new URL` can't parse.
46
+ const requestNameFor = (method, url, index) => {
47
+ try {
48
+ const parsed = new URL(url);
49
+ const path = parsed.pathname && parsed.pathname !== "/" ? parsed.pathname : parsed.hostname;
50
+ return `${method} ${path}`;
51
+ }
52
+ catch {
53
+ return `${method} request ${index + 1}`;
54
+ }
55
+ };
56
+ exports.requestNameFor = requestNameFor;
57
+ // A .sh/.txt file may hold one or many cURL commands. Each command starts on
58
+ // a line beginning with `curl`; `parseCurl` handles `\`-continued lines within
59
+ // a command, so this only splits the file into command chunks.
60
+ const splitCurlCommands = (text) => {
61
+ const commands = [];
62
+ let current = [];
63
+ const flush = () => {
64
+ // Drop trailing blank / comment-only lines that sit between commands so a
65
+ // comment like `# 5) GET with -G --data-urlencode` can't leak flag-looking
66
+ // tokens into the preceding command.
67
+ while (current.length > 0 && /^\s*(#|$)/.test(current[current.length - 1])) {
68
+ current.pop();
69
+ }
70
+ const joined = current.join("\n").trim();
71
+ if (joined)
72
+ commands.push(joined);
73
+ current = [];
74
+ };
75
+ for (const line of text.split(/\r?\n/)) {
76
+ if (/^\s*curl(\s|$)/i.test(line)) {
77
+ flush();
78
+ current.push(line);
79
+ }
80
+ else if (current.length > 0) {
81
+ current.push(line); // continuation / body / header lines of the current command
82
+ }
83
+ // Lines before the first `curl` (shebang, comments) are ignored.
84
+ }
85
+ flush();
86
+ return commands;
87
+ };
88
+ exports.splitCurlCommands = splitCurlCommands;
89
+ const parseCurlFile = (fileName, text) => {
90
+ const commands = (0, exports.splitCurlCommands)(text).filter(parseCurl_js_1.isCurlCommand);
91
+ if (commands.length === 0) {
92
+ throw new Error("No cURL commands found in the file");
93
+ }
94
+ const parsed = commands.map((command) => (0, parseCurl_js_1.parseCurl)(command));
95
+ return {
96
+ collectionName: (0, exports.collectionNameFromFileName)(fileName, "Imported cURL"),
97
+ requests: parsed.map((request, index) => ({
98
+ name: (0, exports.requestNameFor)(request.method, request.url, index),
99
+ method: request.method,
100
+ url: request.url,
101
+ // Strip the trailing empty editor row — the backend rejects blank keys.
102
+ headers: (0, rows_js_1.filledRows)(request.headers),
103
+ query: (0, rows_js_1.filledRows)(request.query),
104
+ body: (0, exports.toPersistedRequestBody)(request.body),
105
+ })),
106
+ };
107
+ };
108
+ exports.parseCurlFile = parseCurlFile;
109
+ //# sourceMappingURL=flatImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatImport.js","sourceRoot":"","sources":["../../src/http-file/flatImport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importFormatLabel = exports.IMPORT_FORMAT_LABELS = exports.detectImportFormat = exports.parseHttpRequests = exports.parseHttpFile = exports.toPersistedRequestBody = exports.splitCurlCommands = exports.requestNameFor = exports.parseCurlFile = exports.collectionNameFromFileName = void 0;
4
+ // File importers (cURL scripts, .http/.rest files) + format detection —
5
+ // shared by the desktop, the MCP server and the backend. CSP-safe (see
6
+ // ../curl/index.ts).
7
+ var flatImport_js_1 = require("./flatImport.js");
8
+ Object.defineProperty(exports, "collectionNameFromFileName", { enumerable: true, get: function () { return flatImport_js_1.collectionNameFromFileName; } });
9
+ Object.defineProperty(exports, "parseCurlFile", { enumerable: true, get: function () { return flatImport_js_1.parseCurlFile; } });
10
+ Object.defineProperty(exports, "requestNameFor", { enumerable: true, get: function () { return flatImport_js_1.requestNameFor; } });
11
+ Object.defineProperty(exports, "splitCurlCommands", { enumerable: true, get: function () { return flatImport_js_1.splitCurlCommands; } });
12
+ Object.defineProperty(exports, "toPersistedRequestBody", { enumerable: true, get: function () { return flatImport_js_1.toPersistedRequestBody; } });
13
+ var parseHttpFile_js_1 = require("./parseHttpFile.js");
14
+ Object.defineProperty(exports, "parseHttpFile", { enumerable: true, get: function () { return parseHttpFile_js_1.parseHttpFile; } });
15
+ Object.defineProperty(exports, "parseHttpRequests", { enumerable: true, get: function () { return parseHttpFile_js_1.parseHttpRequests; } });
16
+ var detect_js_1 = require("./detect.js");
17
+ Object.defineProperty(exports, "detectImportFormat", { enumerable: true, get: function () { return detect_js_1.detectImportFormat; } });
18
+ Object.defineProperty(exports, "IMPORT_FORMAT_LABELS", { enumerable: true, get: function () { return detect_js_1.IMPORT_FORMAT_LABELS; } });
19
+ Object.defineProperty(exports, "importFormatLabel", { enumerable: true, get: function () { return detect_js_1.importFormatLabel; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http-file/index.ts"],"names":[],"mappings":";;;AAAA,wEAAwE;AACxE,uEAAuE;AACvE,qBAAqB;AACrB,iDAUyB;AATvB,2HAAA,0BAA0B,OAAA;AAI1B,8GAAA,aAAa,OAAA;AAEb,+GAAA,cAAc,OAAA;AACd,kHAAA,iBAAiB,OAAA;AACjB,uHAAA,sBAAsB,OAAA;AAExB,uDAA8F;AAA7D,iHAAA,aAAa,OAAA;AAAE,qHAAA,iBAAiB,OAAA;AACjE,yCAOqB;AALnB,+GAAA,kBAAkB,OAAA;AAClB,iHAAA,oBAAoB,OAAA;AAGpB,8GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseHttpFile = exports.parseHttpRequests = void 0;
4
+ // Importer for the VS Code REST Client / JetBrains ".http" (aka ".rest")
5
+ // format: requests separated by `###`, each with a `METHOD url` line, header
6
+ // lines, a blank line, then a body. `{{var}}` references map straight onto
7
+ // callman's templating, so no rewriting is needed.
8
+ const bodyFormat_js_1 = require("../curl/bodyFormat.js");
9
+ const rows_js_1 = require("../curl/rows.js");
10
+ const urlQuery_js_1 = require("../utils/urlQuery.js");
11
+ const flatImport_js_1 = require("./flatImport.js");
12
+ const REQUEST_LINE = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|CONNECT)\s+(\S.*)$/i;
13
+ // Split on `###` delimiter lines. Any trailing text on the delimiter line
14
+ // (`### Get user`) becomes the block title. Content before the first `###`
15
+ // is its own (untitled) block, since many .http files omit the leading one.
16
+ const splitBlocks = (text) => {
17
+ const blocks = [];
18
+ let title = "";
19
+ let lines = [];
20
+ let started = false;
21
+ const push = () => {
22
+ if (started)
23
+ blocks.push({ title, lines });
24
+ };
25
+ for (const raw of text.split(/\r?\n/)) {
26
+ const delimiter = raw.match(/^\s*###+(.*)$/);
27
+ if (delimiter) {
28
+ push();
29
+ title = delimiter[1].trim();
30
+ lines = [];
31
+ started = true;
32
+ }
33
+ else {
34
+ started = true;
35
+ lines.push(raw);
36
+ }
37
+ }
38
+ push();
39
+ return blocks;
40
+ };
41
+ const parseBlock = (block) => {
42
+ const headers = [];
43
+ let name = block.title;
44
+ let index = 0;
45
+ // Skip leading comments / file-variable definitions, capturing an explicit
46
+ // `# @name foo` if present.
47
+ for (; index < block.lines.length; index += 1) {
48
+ const line = block.lines[index].trim();
49
+ if (!line)
50
+ continue;
51
+ if (line.startsWith("#") || line.startsWith("//")) {
52
+ const nameMatch = line.match(/@name\s*=?\s*(.+)$/);
53
+ if (nameMatch && !name)
54
+ name = nameMatch[1].trim();
55
+ continue;
56
+ }
57
+ if (/^@[\w-]+\s*=/.test(line))
58
+ continue; // `@base = https://…` file variable
59
+ break;
60
+ }
61
+ if (index >= block.lines.length)
62
+ return null;
63
+ // Request line: `METHOD url [HTTP/1.1]` or a bare url (defaults to GET).
64
+ const requestLine = block.lines[index].trim().replace(/\s+HTTP\/[\d.]+$/i, "");
65
+ const match = requestLine.match(REQUEST_LINE);
66
+ let method;
67
+ let url;
68
+ if (match) {
69
+ method = match[1].toUpperCase();
70
+ url = match[2].trim();
71
+ }
72
+ else if (/^(https?:\/\/|\{\{)/i.test(requestLine)) {
73
+ method = "GET";
74
+ url = requestLine;
75
+ }
76
+ else {
77
+ return null;
78
+ }
79
+ index += 1;
80
+ // Header lines up to the first blank line.
81
+ for (; index < block.lines.length; index += 1) {
82
+ const line = block.lines[index];
83
+ if (!line.trim()) {
84
+ index += 1;
85
+ break;
86
+ }
87
+ const separator = line.indexOf(":");
88
+ if (separator > 0) {
89
+ headers.push({
90
+ key: line.slice(0, separator).trim(),
91
+ value: line.slice(separator + 1).trim(),
92
+ enabled: true,
93
+ });
94
+ }
95
+ }
96
+ const bodyRaw = block.lines.slice(index).join("\n").trim();
97
+ if (!name)
98
+ name = `${method} ${url}`;
99
+ return { name, method, url, headers, bodyRaw };
100
+ };
101
+ const parseHttpRequests = (text) => splitBlocks(text)
102
+ .map(parseBlock)
103
+ .filter((request) => request !== null);
104
+ exports.parseHttpRequests = parseHttpRequests;
105
+ const parseHttpFile = (fileName, text) => {
106
+ const parsed = (0, exports.parseHttpRequests)(text);
107
+ if (parsed.length === 0) {
108
+ throw new Error("No requests found in the .http file");
109
+ }
110
+ return {
111
+ collectionName: (0, flatImport_js_1.collectionNameFromFileName)(fileName, "Imported HTTP file"),
112
+ requests: parsed.map((request) => {
113
+ const bodyState = (0, bodyFormat_js_1.inferBodyStateFromRaw)(request.bodyRaw, request.headers);
114
+ return {
115
+ name: request.name,
116
+ method: request.method,
117
+ url: (0, urlQuery_js_1.stripUrlQuery)(request.url),
118
+ // Strip blank rows — the backend rejects headers/query with empty keys.
119
+ headers: (0, rows_js_1.filledRows)(request.headers),
120
+ query: (0, rows_js_1.filledRows)((0, rows_js_1.queryRowsFromUrl)(request.url)),
121
+ body: (0, flatImport_js_1.toPersistedRequestBody)(bodyState),
122
+ };
123
+ }),
124
+ };
125
+ };
126
+ exports.parseHttpFile = parseHttpFile;
127
+ //# sourceMappingURL=parseHttpFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseHttpFile.js","sourceRoot":"","sources":["../../src/http-file/parseHttpFile.ts"],"names":[],"mappings":"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"}
package/dist-cjs/index.js CHANGED
@@ -96,6 +96,11 @@ Object.defineProperty(exports, "getSoapEnvelopeTemplate", { enumerable: true, ge
96
96
  // extraction (jsonRepair) — one source for backend hosted generation and
97
97
  // desktop local-CLI generation.
98
98
  __exportStar(require("./ai/index.js"), exports);
99
+ // Import parsers (cURL, .http) + format detection and the diagram document
100
+ // contract — shared by the desktop, the MCP server and the backend.
101
+ __exportStar(require("./curl/index.js"), exports);
102
+ __exportStar(require("./http-file/index.js"), exports);
103
+ __exportStar(require("./diagram/index.js"), exports);
99
104
  __exportStar(require("./ui-test/compose.js"), exports);
100
105
  __exportStar(require("./scenario-runner/index.js"), exports);
101
106
  __exportStar(require("./host/index.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AAE1B,0DAAmF;AAA1E,wHAAA,sBAAsB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AA8BjD,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,uDAAqC;AACrC,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AAE1B,0DAAmF;AAA1E,wHAAA,sBAAsB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AA8BjD,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,2EAA2E;AAC3E,oEAAoE;AACpE,kDAAgC;AAChC,uDAAqC;AACrC,qDAAmC;AACnC,uDAAqC;AACrC,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
@@ -41,6 +41,43 @@ const httpResultToExecuteRequestResult = (http) => ({
41
41
  rawText: http.rawText,
42
42
  bodyKind: http.bodyKind,
43
43
  });
44
+ // Serialisable picture of the request as it left the executor — the step's
45
+ // `resolvedInput`. Multipart bodies are described (part keys, file names)
46
+ // rather than copied, and anything non-JSON collapses to a label.
47
+ const describeRequestBody = (body) => {
48
+ if (body === null || body === undefined)
49
+ return null;
50
+ if (typeof body === "string")
51
+ return body;
52
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
53
+ const parts = [];
54
+ body.forEach((value, key) => {
55
+ parts.push({
56
+ key,
57
+ value: typeof value === "string"
58
+ ? value
59
+ : `[file${value.name ? `: ${value.name}` : ""}]`,
60
+ });
61
+ });
62
+ return { mode: "formdata", parts };
63
+ }
64
+ if (typeof URLSearchParams !== "undefined" && body instanceof URLSearchParams) {
65
+ return body.toString();
66
+ }
67
+ if (typeof body === "object") {
68
+ if (ArrayBuffer.isView(body) || body instanceof ArrayBuffer)
69
+ return "[binary]";
70
+ return body;
71
+ }
72
+ return String(body);
73
+ };
74
+ const describeResolvedRequest = (runtimeRequest, sentHeaders) => ({
75
+ method: runtimeRequest.method,
76
+ url: runtimeRequest.url,
77
+ query: runtimeRequest.query,
78
+ headers: sentHeaders ?? runtimeRequest.headers,
79
+ body: describeRequestBody(runtimeRequest.body),
80
+ });
44
81
  const buildRequestExecutor = (options) => async (input) => {
45
82
  // We can't directly call the canonical scriptExecutor from here —
46
83
  // it lives on the same factory result and may be the host's override.
@@ -192,9 +229,12 @@ const buildRequestExecutor = (options) => async (input) => {
192
229
  }, oauth2TokenCache);
193
230
  return { ...runtimeRequest.headers, Authorization: `Bearer ${token}` };
194
231
  };
232
+ // Headers as actually sent (OAuth2 bearer applied) — for `resolvedInput`.
233
+ let sentHeaders = null;
195
234
  const runHttp = async () => {
196
235
  try {
197
236
  const headers = await resolveAuthHeaders();
237
+ sentHeaders = headers;
198
238
  const httpResult = await (0, abort_js_1.withAbortAndTimeout)(options.drivers.httpExecutor({
199
239
  method: runtimeRequest.method,
200
240
  url: runtimeRequest.url,
@@ -318,6 +358,7 @@ const buildRequestExecutor = (options) => async (input) => {
318
358
  prefetchedKafkaResults,
319
359
  failureMessage,
320
360
  statusExpectation,
361
+ resolvedInput: describeResolvedRequest(runtimeRequest, sentHeaders),
321
362
  };
322
363
  };
323
364
  exports.buildRequestExecutor = buildRequestExecutor;