@nowline/mcp 0.8.2 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/ui-bundle.d.ts.map +1 -1
- package/dist/generated/ui-bundle.js +2 -2
- package/dist/generated/ui-bundle.js.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/root-path.d.ts +13 -0
- package/dist/root-path.d.ts.map +1 -0
- package/dist/root-path.js +58 -0
- package/dist/root-path.js.map +1 -0
- package/dist/schemas.d.ts +3 -2
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +3 -2
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +201 -56
- package/dist/server.js.map +1 -1
- package/package.json +9 -9
- package/src/generated/ui-bundle.ts +2 -2
- package/src/index.ts +11 -1
- package/src/root-path.ts +64 -0
- package/src/schemas.ts +4 -2
- package/src/server.ts +232 -59
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-bundle.js","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAW,
|
|
1
|
+
{"version":3,"file":"ui-bundle.js","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAW,4l5lCAA4l5lC,CAAC;AAE9n5lC,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAW,k95lCAAk95lC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { dirname, resolve } from 'node:path';
|
|
|
16
16
|
import { fileURLToPath } from 'node:url';
|
|
17
17
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
18
18
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
19
|
+
import { expandRootPath } from './root-path.js';
|
|
19
20
|
import { createMcpServer } from './server.js';
|
|
20
21
|
const __filename = fileURLToPath(import.meta.url);
|
|
21
22
|
const __dirname = dirname(__filename);
|
|
@@ -78,7 +79,15 @@ if (help) {
|
|
|
78
79
|
].join('\n'));
|
|
79
80
|
process.exit(0);
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
+
// Expand mcpb tokens (${HOME}/~/env vars) so a literal default from the
|
|
83
|
+
// .mcpb directory picker resolves to a real path. An empty/blank value
|
|
84
|
+
// (optional field left unset) collapses to undefined → cwd fallback, inline.
|
|
85
|
+
const expandedRoot = expandRootPath(root);
|
|
86
|
+
const server = createMcpServer({
|
|
87
|
+
allowedRoot: expandedRoot,
|
|
88
|
+
rootConfigured: expandedRoot !== undefined,
|
|
89
|
+
version: PKG_VERSION,
|
|
90
|
+
});
|
|
82
91
|
if (port !== undefined) {
|
|
83
92
|
// Streamable HTTP transport — stateless (no session management).
|
|
84
93
|
const transport = new StreamableHTTPServerTransport({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expands `--root` into an absolute path, or returns `undefined` when no
|
|
3
|
+
* usable root was provided (undefined or empty — e.g. an optional `.mcpb`
|
|
4
|
+
* directory field left blank, which the host passes as an empty string).
|
|
5
|
+
*
|
|
6
|
+
* Handled tokens:
|
|
7
|
+
* - mcpb specials: `${HOME}`, `${DESKTOP}`, `${DOCUMENTS}`, `${DOWNLOADS}`,
|
|
8
|
+
* `${pathSeparator}`, `${/}`
|
|
9
|
+
* - generic environment variables: `${NAME}` / `$NAME` (uppercase)
|
|
10
|
+
* - a leading `~` / `~/`
|
|
11
|
+
*/
|
|
12
|
+
export declare function expandRootPath(raw: string | undefined): string | undefined;
|
|
13
|
+
//# sourceMappingURL=root-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-path.d.ts","sourceRoot":"","sources":["../src/root-path.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAqC1E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Resolves the --root argument into a real absolute path.
|
|
2
|
+
//
|
|
3
|
+
// Claude Desktop's .mcpb variable substitution is single-pass: a `user_config`
|
|
4
|
+
// default like "${HOME}/Downloads" can reach the server with `${HOME}` still
|
|
5
|
+
// unexpanded when the user installs the bundle without opening the directory
|
|
6
|
+
// picker (the optional field's raw default is used verbatim for the
|
|
7
|
+
// `${user_config.*}` substitution, and the nested token is never re-expanded).
|
|
8
|
+
// To stay robust regardless of host behavior we expand the mcpb special tokens,
|
|
9
|
+
// a leading `~`, and generic environment variables here.
|
|
10
|
+
//
|
|
11
|
+
// Spec: specs/mcp.md ".mcpb bundle packaging".
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join, resolve, sep } from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* Expands `--root` into an absolute path, or returns `undefined` when no
|
|
16
|
+
* usable root was provided (undefined or empty — e.g. an optional `.mcpb`
|
|
17
|
+
* directory field left blank, which the host passes as an empty string).
|
|
18
|
+
*
|
|
19
|
+
* Handled tokens:
|
|
20
|
+
* - mcpb specials: `${HOME}`, `${DESKTOP}`, `${DOCUMENTS}`, `${DOWNLOADS}`,
|
|
21
|
+
* `${pathSeparator}`, `${/}`
|
|
22
|
+
* - generic environment variables: `${NAME}` / `$NAME` (uppercase)
|
|
23
|
+
* - a leading `~` / `~/`
|
|
24
|
+
*/
|
|
25
|
+
export function expandRootPath(raw) {
|
|
26
|
+
if (raw === undefined)
|
|
27
|
+
return undefined;
|
|
28
|
+
const trimmed = raw.trim();
|
|
29
|
+
if (trimmed === '')
|
|
30
|
+
return undefined;
|
|
31
|
+
const home = homedir();
|
|
32
|
+
const specials = {
|
|
33
|
+
HOME: home,
|
|
34
|
+
DESKTOP: join(home, 'Desktop'),
|
|
35
|
+
DOCUMENTS: join(home, 'Documents'),
|
|
36
|
+
DOWNLOADS: join(home, 'Downloads'),
|
|
37
|
+
};
|
|
38
|
+
let out = trimmed;
|
|
39
|
+
// mcpb path-separator tokens.
|
|
40
|
+
out = out.replace(/\$\{pathSeparator\}/g, sep).replace(/\$\{\/\}/g, sep);
|
|
41
|
+
// ${NAME} / $NAME — mcpb special dirs first, then generic env vars.
|
|
42
|
+
out = out.replace(/\$\{([A-Z_][A-Z0-9_]*)\}|\$([A-Z_][A-Z0-9_]*)/g, (match, braced, bare) => {
|
|
43
|
+
const name = braced ?? bare ?? '';
|
|
44
|
+
if (name in specials)
|
|
45
|
+
return specials[name];
|
|
46
|
+
const env = process.env[name];
|
|
47
|
+
return env !== undefined ? env : match;
|
|
48
|
+
});
|
|
49
|
+
// Leading ~ / ~/.
|
|
50
|
+
if (out === '~') {
|
|
51
|
+
out = home;
|
|
52
|
+
}
|
|
53
|
+
else if (out.startsWith('~/') || out.startsWith(`~${sep}`)) {
|
|
54
|
+
out = join(home, out.slice(2));
|
|
55
|
+
}
|
|
56
|
+
return resolve(out);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=root-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-path.js","sourceRoot":"","sources":["../src/root-path.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,oEAAoE;AACpE,+EAA+E;AAC/E,gFAAgF;AAChF,yDAAyD;AACzD,EAAE;AACF,+CAA+C;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB;IAClD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAA2B;QACrC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACrC,CAAC;IAEF,IAAI,GAAG,GAAG,OAAO,CAAC;IAElB,8BAA8B;IAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAEzE,oEAAoE;IACpE,GAAG,GAAG,GAAG,CAAC,OAAO,CACb,gDAAgD,EAChD,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC,CACJ,CAAC;IAEF,kBAAkB;IAClB,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACd,GAAG,GAAG,IAAI,CAAC;IACf,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3D,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -94,7 +94,6 @@ export declare const RenderOutputSchema: z.ZodObject<{
|
|
|
94
94
|
format: z.ZodString;
|
|
95
95
|
path: z.ZodOptional<z.ZodString>;
|
|
96
96
|
bytes: z.ZodOptional<z.ZodNumber>;
|
|
97
|
-
shareUrl: z.ZodOptional<z.ZodString>;
|
|
98
97
|
insights: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
99
98
|
severity: z.ZodEnum<{
|
|
100
99
|
warning: "warning";
|
|
@@ -109,7 +108,9 @@ export declare const ExportOutputSchema: z.ZodObject<{
|
|
|
109
108
|
format: z.ZodString;
|
|
110
109
|
path: z.ZodOptional<z.ZodString>;
|
|
111
110
|
bytes: z.ZodOptional<z.ZodNumber>;
|
|
112
|
-
|
|
111
|
+
}, z.core.$strip>;
|
|
112
|
+
export declare const ShareOutputSchema: z.ZodObject<{
|
|
113
|
+
shareUrl: z.ZodString;
|
|
113
114
|
}, z.core.$strip>;
|
|
114
115
|
export declare const ConvertOutputSchema: z.ZodObject<{
|
|
115
116
|
to: z.ZodEnum<{
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;iBAQ3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;iBAKxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;iBAQ3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;iBAKxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC"}
|
package/dist/schemas.js
CHANGED
|
@@ -48,14 +48,15 @@ export const RenderOutputSchema = z.object({
|
|
|
48
48
|
/** Set when the output was written to disk. */
|
|
49
49
|
path: z.string().optional(),
|
|
50
50
|
bytes: z.number().optional(),
|
|
51
|
-
shareUrl: z.string().optional(),
|
|
52
51
|
insights: z.array(InsightSchema).optional(),
|
|
53
52
|
});
|
|
54
53
|
export const ExportOutputSchema = z.object({
|
|
55
54
|
format: z.string(),
|
|
56
55
|
path: z.string().optional(),
|
|
57
56
|
bytes: z.number().optional(),
|
|
58
|
-
|
|
57
|
+
});
|
|
58
|
+
export const ShareOutputSchema = z.object({
|
|
59
|
+
shareUrl: z.string(),
|
|
59
60
|
});
|
|
60
61
|
export const ConvertOutputSchema = z.object({
|
|
61
62
|
to: z.enum(['json', 'nowline']),
|
package/dist/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,wEAAwE;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,+CAA+C;IAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export declare const PREVIEW_UI_URI = "ui://nowline/preview-v1";
|
|
|
4
4
|
export interface McpServerOptions {
|
|
5
5
|
/** Working directory — all file paths are resolved relative to this root. Defaults to process.cwd(). */
|
|
6
6
|
allowedRoot?: string;
|
|
7
|
+
/** Whether the allowed root was explicitly configured (vs. defaulting to cwd). Controls smart export delivery for binary formats. Defaults to false. */
|
|
8
|
+
rootConfigured?: boolean;
|
|
7
9
|
/** Server name shown in the MCP client. Defaults to 'nowline'. */
|
|
8
10
|
name?: string;
|
|
9
11
|
/** Server version. Defaults to package version. */
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiEpE,4EAA4E;AAC5E,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAwIxD,MAAM,WAAW,gBAAgB;IAC7B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wJAAwJ;IACxJ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAokCtE"}
|
package/dist/server.js
CHANGED
|
@@ -22,7 +22,7 @@ import { PREVIEW_HTML } from './generated/ui-bundle.js';
|
|
|
22
22
|
import { registerPrompts } from './prompts.js';
|
|
23
23
|
import { REFERENCE_CHEATSHEET } from './reference-cheatsheet.js';
|
|
24
24
|
import { SCHEMA_VOCABULARY } from './schema-vocab.js';
|
|
25
|
-
import { CapabilitiesOutputSchema, ConvertOutputSchema, CreateOutputSchema, DeleteOutputSchema, ExamplesOutputSchema, ExportOutputSchema, ListItemsOutputSchema, ListOutputSchema, ReadOutputSchema, ReferenceOutputSchema, RenderOutputSchema, SchemaOutputSchema, UpdateOutputSchema, ValidateOutputSchema, } from './schemas.js';
|
|
25
|
+
import { CapabilitiesOutputSchema, ConvertOutputSchema, CreateOutputSchema, DeleteOutputSchema, ExamplesOutputSchema, ExportOutputSchema, ListItemsOutputSchema, ListOutputSchema, ReadOutputSchema, ReferenceOutputSchema, RenderOutputSchema, SchemaOutputSchema, ShareOutputSchema, UpdateOutputSchema, ValidateOutputSchema, } from './schemas.js';
|
|
26
26
|
// ---- MCP Apps UI (in-chat live preview) -------------------------------------
|
|
27
27
|
//
|
|
28
28
|
// Official MCP Apps model (SEP-1865): a pre-declared ui:// resource serves
|
|
@@ -136,6 +136,7 @@ async function sourceAndPath(args, allowedRoot) {
|
|
|
136
136
|
}
|
|
137
137
|
export function createMcpServer(opts = {}) {
|
|
138
138
|
const allowedRoot = opts.allowedRoot ?? process.cwd();
|
|
139
|
+
const rootConfigured = opts.rootConfigured ?? false;
|
|
139
140
|
const server = new McpServer({
|
|
140
141
|
name: opts.name ?? 'nowline',
|
|
141
142
|
version: opts.version ?? '0.6.0',
|
|
@@ -146,7 +147,16 @@ export function createMcpServer(opts = {}) {
|
|
|
146
147
|
'Workflow: 1. call `reference` or `examples` to learn syntax → 2. write `.nowline` → ' +
|
|
147
148
|
'3. call `render` (validates + renders; or `validate` alone) → 4. fix errors keyed on `NL.E####` ' +
|
|
148
149
|
'and re-render → 5. review returned layout `insights` (what reflowed) → 6. when uncertain, ' +
|
|
149
|
-
'call `render` with `review:true` for a final visual check. JSON in `convert` is AST conversion only.'
|
|
150
|
+
'call `render` with `review:true` for a final visual check. JSON in `convert` is AST conversion only. ' +
|
|
151
|
+
'Presenting output: default to `render` (in-chat preview / inline image) — the primary presentation. ' +
|
|
152
|
+
'The in-chat preview is view-only (no download/export button). Use `export` to produce a file. ' +
|
|
153
|
+
'Export files: binary formats (pdf, xlsx, png) are auto-saved to the configured folder — omit `delivery` ' +
|
|
154
|
+
'and omit `output` to let the server save the file; never use `delivery:"inline"` for pdf/xlsx on Claude ' +
|
|
155
|
+
'Desktop (the host cannot display inline documents, so nothing appears). For svg/html/mermaid exports, ' +
|
|
156
|
+
'present the returned text to the user as a downloadable artifact of the matching type ' +
|
|
157
|
+
'(.svg / .html / .mermaid) so they can save it. ' +
|
|
158
|
+
'Use the `share` tool only when the user explicitly wants a link they can open or share ' +
|
|
159
|
+
'(opens the free Nowline web app, where they can also export).',
|
|
150
160
|
});
|
|
151
161
|
// ---- Resources ----------------------------------------------------------
|
|
152
162
|
server.registerResource('nowline-reference', 'nowline://reference', {
|
|
@@ -387,8 +397,9 @@ export function createMcpServer(opts = {}) {
|
|
|
387
397
|
});
|
|
388
398
|
// ---- render -------------------------------------------------------------
|
|
389
399
|
registerAppTool(server, 'render', {
|
|
390
|
-
description: toolDescriptionWithSyntax('Validate then render a .nowline roadmap to SVG or PNG (combined validate+render
|
|
391
|
-
'Returns structured diagnostics on error-severity input instead of a raw kernel error.'
|
|
400
|
+
description: toolDescriptionWithSyntax('Validate then render a .nowline roadmap to SVG or PNG (combined validate+render). ' +
|
|
401
|
+
'Returns structured diagnostics on error-severity input instead of a raw kernel error. ' +
|
|
402
|
+
'On MCP Apps hosts the in-chat preview is view-only (no download/export button); use `export` for files and the `share` tool for an openable link.'),
|
|
392
403
|
inputSchema: z.object({
|
|
393
404
|
source: z.string().optional().describe('Inline .nowline source text.'),
|
|
394
405
|
path: z
|
|
@@ -420,10 +431,6 @@ export function createMcpServer(opts = {}) {
|
|
|
420
431
|
.describe('Real local filesystem path to write the output file (e.g. /Users/name/Desktop/roadmap.svg). ' +
|
|
421
432
|
'Never pass a virtual or sandbox path such as /mnt/user-data/… — ' +
|
|
422
433
|
'omit this parameter to receive output inline instead.'),
|
|
423
|
-
share: z
|
|
424
|
-
.boolean()
|
|
425
|
-
.optional()
|
|
426
|
-
.describe('When true, include a shareUrl pointing to https://free.nowline.io/open.'),
|
|
427
434
|
review: z
|
|
428
435
|
.boolean()
|
|
429
436
|
.optional()
|
|
@@ -476,9 +483,6 @@ export function createMcpServer(opts = {}) {
|
|
|
476
483
|
const bytes = needsRender
|
|
477
484
|
? await exportDocument(source, format, inputs, host)
|
|
478
485
|
: new Uint8Array(0);
|
|
479
|
-
const shareUrl = args.share
|
|
480
|
-
? (buildShareLink({ source, share: true }) ?? undefined)
|
|
481
|
-
: undefined;
|
|
482
486
|
const insights = await collectMcpLayoutInsights({
|
|
483
487
|
source,
|
|
484
488
|
filePath,
|
|
@@ -510,7 +514,6 @@ export function createMcpServer(opts = {}) {
|
|
|
510
514
|
format,
|
|
511
515
|
path: outAbs,
|
|
512
516
|
bytes: bytes.byteLength,
|
|
513
|
-
shareUrl,
|
|
514
517
|
...insightsField,
|
|
515
518
|
};
|
|
516
519
|
return {
|
|
@@ -530,7 +533,6 @@ export function createMcpServer(opts = {}) {
|
|
|
530
533
|
if (appActive) {
|
|
531
534
|
const structured = {
|
|
532
535
|
format,
|
|
533
|
-
shareUrl,
|
|
534
536
|
...insightsField,
|
|
535
537
|
};
|
|
536
538
|
return {
|
|
@@ -546,7 +548,6 @@ export function createMcpServer(opts = {}) {
|
|
|
546
548
|
const structured = {
|
|
547
549
|
format,
|
|
548
550
|
bytes: bytes.byteLength,
|
|
549
|
-
shareUrl,
|
|
550
551
|
...insightsField,
|
|
551
552
|
};
|
|
552
553
|
return {
|
|
@@ -563,7 +564,7 @@ export function createMcpServer(opts = {}) {
|
|
|
563
564
|
};
|
|
564
565
|
}
|
|
565
566
|
const svgText = new TextDecoder('utf-8').decode(bytes);
|
|
566
|
-
const structured = { format,
|
|
567
|
+
const structured = { format, ...insightsField };
|
|
567
568
|
return {
|
|
568
569
|
content: [
|
|
569
570
|
{ type: 'text', text: svgText, mimeType: 'image/svg+xml' },
|
|
@@ -574,9 +575,12 @@ export function createMcpServer(opts = {}) {
|
|
|
574
575
|
};
|
|
575
576
|
});
|
|
576
577
|
// ---- export -------------------------------------------------------------
|
|
577
|
-
const EXPORT_FORMATS = ['pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'png'];
|
|
578
|
+
const EXPORT_FORMATS = ['svg', 'pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'png'];
|
|
578
579
|
server.registerTool('export', {
|
|
579
|
-
description: 'Export a .nowline roadmap to any of the eight canonical formats. Byte-identical to `nowline -f <format>` for the same source and inputs.'
|
|
580
|
+
description: 'Export a .nowline roadmap to any of the eight canonical formats. Byte-identical to `nowline -f <format>` for the same source and inputs. ' +
|
|
581
|
+
'For pdf/xlsx/png: omit `delivery` and omit `output` — the server auto-saves to the configured folder and returns the path. ' +
|
|
582
|
+
'Never use `delivery:"inline"` for binary formats on Claude Desktop (inline binary cannot be displayed). ' +
|
|
583
|
+
'For svg/html/mermaid: the text is returned inline — present it to the user as a downloadable artifact of the matching type.',
|
|
580
584
|
inputSchema: z.object({
|
|
581
585
|
source: z.string().optional().describe('Inline .nowline source text.'),
|
|
582
586
|
path: z
|
|
@@ -587,14 +591,15 @@ export function createMcpServer(opts = {}) {
|
|
|
587
591
|
'those do not exist on the host filesystem. Pass `source` instead.'),
|
|
588
592
|
format: z
|
|
589
593
|
.enum(EXPORT_FORMATS)
|
|
590
|
-
.describe('Export format: pdf, html, mermaid, xlsx, msproj, or png.'),
|
|
594
|
+
.describe('Export format: svg, pdf, html, mermaid, xlsx, msproj, or png.'),
|
|
591
595
|
output: z
|
|
592
596
|
.string()
|
|
593
597
|
.optional()
|
|
594
|
-
.describe('
|
|
595
|
-
'
|
|
596
|
-
'
|
|
597
|
-
'
|
|
598
|
+
.describe('Optional path to write the output file. Omit for binary formats (pdf, xlsx, png) — ' +
|
|
599
|
+
'the server auto-saves to the configured folder as <roadmap-id>.<ext>. ' +
|
|
600
|
+
'To choose a filename, pass a bare filename (e.g. "roadmap.pdf") — it is saved into the configured folder. ' +
|
|
601
|
+
'Never pass a virtual or sandbox path such as /home/claude/…, /mnt/user-data/…, or any path ' +
|
|
602
|
+
'outside the configured output folder — those do not exist on the host filesystem.'),
|
|
598
603
|
now: z.string().optional().describe('Now-line date as YYYY-MM-DD (UTC).'),
|
|
599
604
|
theme: z.enum(['light', 'dark', 'grayscale']).optional(),
|
|
600
605
|
scale: z.number().optional().describe('PNG scale factor.'),
|
|
@@ -608,10 +613,15 @@ export function createMcpServer(opts = {}) {
|
|
|
608
613
|
.string()
|
|
609
614
|
.optional()
|
|
610
615
|
.describe('MS Project start date override (YYYY-MM-DD).'),
|
|
611
|
-
|
|
612
|
-
.
|
|
616
|
+
delivery: z
|
|
617
|
+
.enum(['file', 'inline', 'both'])
|
|
613
618
|
.optional()
|
|
614
|
-
.describe('
|
|
619
|
+
.describe('"file" — write to disk and return the path (no inline bytes). ' +
|
|
620
|
+
'"inline" — return bytes in the response (embedded resource for pdf/xlsx, image for png, text for other formats). ' +
|
|
621
|
+
'"both" — write to disk and also attach inline bytes. ' +
|
|
622
|
+
'Default is smart per format: pdf/xlsx/png write to disk when a root folder is configured, else return inline; text formats (svg/html/mermaid/msproj) always return inline. ' +
|
|
623
|
+
'IMPORTANT — for pdf/xlsx/png on Claude Desktop, prefer omitting `delivery` entirely (smart default saves the file). ' +
|
|
624
|
+
'Do NOT use delivery:"inline" for pdf/xlsx — Claude Desktop silently drops inline documents, so nothing appears to the user.'),
|
|
615
625
|
}),
|
|
616
626
|
outputSchema: ExportOutputSchema,
|
|
617
627
|
annotations: readOnlyTool('Export Roadmap'),
|
|
@@ -649,48 +659,144 @@ export function createMcpServer(opts = {}) {
|
|
|
649
659
|
}
|
|
650
660
|
const host = createNodeHostEnv(filePath);
|
|
651
661
|
const bytes = await exportDocument(source, format, inputs, host);
|
|
652
|
-
const shareUrl = args.share
|
|
653
|
-
? (buildShareLink({ source, share: true }) ?? undefined)
|
|
654
|
-
: undefined;
|
|
655
662
|
const BINARY_FORMATS = new Set(['png', 'pdf', 'xlsx']);
|
|
656
663
|
const isBinary = BINARY_FORMATS.has(format);
|
|
657
|
-
|
|
664
|
+
// Default filename: <roadmap-id>.<ext>, used when no output path is given.
|
|
665
|
+
const FORMAT_EXT = {
|
|
666
|
+
svg: '.svg',
|
|
667
|
+
pdf: '.pdf',
|
|
668
|
+
xlsx: '.xlsx',
|
|
669
|
+
png: '.png',
|
|
670
|
+
html: '.html',
|
|
671
|
+
mermaid: '.md',
|
|
672
|
+
msproj: '.xml',
|
|
673
|
+
};
|
|
674
|
+
const ext = FORMAT_EXT[format] ?? `.${format}`;
|
|
675
|
+
const roadmapId = blocked.doc.parseResult.value.roadmapDecl?.name ?? 'roadmap';
|
|
676
|
+
const defaultFilename = `${roadmapId}${ext}`;
|
|
677
|
+
// Resolve delivery mode.
|
|
678
|
+
const hasExplicitOutput = !!args.output;
|
|
679
|
+
const delivery = args.delivery;
|
|
680
|
+
let doWrite;
|
|
681
|
+
let doInline;
|
|
682
|
+
if (hasExplicitOutput) {
|
|
683
|
+
doWrite = true;
|
|
684
|
+
doInline = delivery === 'both';
|
|
685
|
+
}
|
|
686
|
+
else if (delivery === 'file') {
|
|
687
|
+
doWrite = true;
|
|
688
|
+
doInline = false;
|
|
689
|
+
}
|
|
690
|
+
else if (delivery === 'inline') {
|
|
691
|
+
doWrite = false;
|
|
692
|
+
doInline = true;
|
|
693
|
+
}
|
|
694
|
+
else if (delivery === 'both') {
|
|
695
|
+
doWrite = true;
|
|
696
|
+
doInline = true;
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
// Smart default: binary formats (pdf/xlsx/png) write to the configured root
|
|
700
|
+
// (return a reference, not bytes — the idiomatic MCP pattern). Text formats
|
|
701
|
+
// (svg/html/mermaid/msproj) always return inline so Claude can surface them
|
|
702
|
+
// as downloadable artifacts.
|
|
703
|
+
if (format === 'pdf' || format === 'xlsx' || format === 'png') {
|
|
704
|
+
doWrite = rootConfigured;
|
|
705
|
+
doInline = !rootConfigured;
|
|
706
|
+
}
|
|
707
|
+
else {
|
|
708
|
+
// svg/html/mermaid/msproj: always inline text.
|
|
709
|
+
doWrite = false;
|
|
710
|
+
doInline = true;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
// Write to disk if needed.
|
|
714
|
+
const outTarget = args.output ?? path.join(allowedRoot, defaultFilename);
|
|
715
|
+
let writtenPath;
|
|
716
|
+
if (doWrite) {
|
|
658
717
|
try {
|
|
659
|
-
const outAbs = resolveAndGuard(
|
|
718
|
+
const outAbs = resolveAndGuard(outTarget, allowedRoot);
|
|
660
719
|
await fs.mkdir(path.dirname(outAbs), { recursive: true });
|
|
661
720
|
await fs.writeFile(outAbs, bytes);
|
|
662
|
-
|
|
663
|
-
return {
|
|
664
|
-
content: [{ type: 'text', text: JSON.stringify(structured, null, 2) }],
|
|
665
|
-
structuredContent: structured,
|
|
666
|
-
};
|
|
721
|
+
writtenPath = outAbs;
|
|
667
722
|
}
|
|
668
723
|
catch (err) {
|
|
669
|
-
return handleToolError(err, args.output);
|
|
724
|
+
return handleToolError(err, args.output ?? outTarget);
|
|
670
725
|
}
|
|
671
726
|
}
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
727
|
+
// Build response content.
|
|
728
|
+
const contentBlocks = [];
|
|
729
|
+
if (writtenPath !== undefined) {
|
|
730
|
+
contentBlocks.push({
|
|
731
|
+
type: 'text',
|
|
732
|
+
text: `Saved to \`${writtenPath}\` (${bytes.byteLength} bytes).`,
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
if (doInline) {
|
|
736
|
+
if (isBinary) {
|
|
737
|
+
contentBlocks.push(...buildExportInlineContentBlocks(format, bytes, !doWrite, rootConfigured));
|
|
738
|
+
}
|
|
739
|
+
else {
|
|
740
|
+
const TEXT_MIME = {
|
|
741
|
+
svg: 'image/svg+xml',
|
|
742
|
+
html: 'text/html',
|
|
743
|
+
mermaid: 'text/markdown',
|
|
744
|
+
msproj: 'application/xml',
|
|
745
|
+
};
|
|
746
|
+
const text = new TextDecoder('utf-8').decode(bytes);
|
|
747
|
+
const mt = TEXT_MIME[format];
|
|
748
|
+
contentBlocks.push({ type: 'text', text, ...(mt ? { mimeType: mt } : {}) });
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
const structured = { format };
|
|
752
|
+
if (writtenPath !== undefined) {
|
|
753
|
+
structured.path = writtenPath;
|
|
754
|
+
structured.bytes = bytes.byteLength;
|
|
755
|
+
}
|
|
756
|
+
else if (doInline && isBinary) {
|
|
757
|
+
structured.bytes = bytes.byteLength;
|
|
689
758
|
}
|
|
690
|
-
const text = new TextDecoder('utf-8').decode(bytes);
|
|
691
|
-
const structured = { format, shareUrl };
|
|
692
759
|
return {
|
|
693
|
-
content:
|
|
760
|
+
content: contentBlocks,
|
|
761
|
+
structuredContent: structured,
|
|
762
|
+
};
|
|
763
|
+
});
|
|
764
|
+
// ---- share --------------------------------------------------------------
|
|
765
|
+
server.registerTool('share', {
|
|
766
|
+
description: 'Generate a shareable link for a roadmap. The roadmap source is encoded into the URL fragment ' +
|
|
767
|
+
'(client-side; no upload, no account, no network call) and opens in the free Nowline web app ' +
|
|
768
|
+
'(free.nowline.io/open), where anyone with the link can view it and export to PDF/PNG/SVG. ' +
|
|
769
|
+
'Prefer `render` to show a roadmap in chat — that is the default. Use `share` only when the user ' +
|
|
770
|
+
'explicitly asks for a link to open, send, or export elsewhere.',
|
|
771
|
+
inputSchema: z.object({
|
|
772
|
+
source: z.string().optional().describe('Inline .nowline source text.'),
|
|
773
|
+
path: z
|
|
774
|
+
.string()
|
|
775
|
+
.optional()
|
|
776
|
+
.describe('Real local filesystem path to the .nowline file (e.g. /Users/name/Desktop/foo.nowline). ' +
|
|
777
|
+
'Never pass a virtual or sandbox path such as /mnt/user-data/… — ' +
|
|
778
|
+
'those do not exist on the host filesystem. Pass `source` instead.'),
|
|
779
|
+
}),
|
|
780
|
+
outputSchema: ShareOutputSchema,
|
|
781
|
+
annotations: readOnlyTool('Share Roadmap'),
|
|
782
|
+
}, async (args) => {
|
|
783
|
+
let source;
|
|
784
|
+
let filePath;
|
|
785
|
+
try {
|
|
786
|
+
({ source, filePath } = await sourceAndPath(args, allowedRoot));
|
|
787
|
+
}
|
|
788
|
+
catch (err) {
|
|
789
|
+
return handleToolError(err, args.path);
|
|
790
|
+
}
|
|
791
|
+
const blocked = await diagnosticsErrorBlock(source, filePath);
|
|
792
|
+
if (!blocked.ok)
|
|
793
|
+
return blocked.response;
|
|
794
|
+
// buildShareLink returns null only for share:false/'none'; this tool
|
|
795
|
+
// always requests share:true, so the result is always a link.
|
|
796
|
+
const shareUrl = buildShareLink({ source, share: true });
|
|
797
|
+
const structured = { shareUrl };
|
|
798
|
+
return {
|
|
799
|
+
content: [{ type: 'text', text: JSON.stringify(structured, null, 2) }],
|
|
694
800
|
structuredContent: structured,
|
|
695
801
|
};
|
|
696
802
|
});
|
|
@@ -921,6 +1027,45 @@ export function createMcpServer(opts = {}) {
|
|
|
921
1027
|
});
|
|
922
1028
|
return server;
|
|
923
1029
|
}
|
|
1030
|
+
const EXPORT_BINARY_SHARE_HINT_NO_ROOT = 'No file was written. To save a file, pass `output: "/path/to/roadmap.pdf"` or `delivery: "file"` ' +
|
|
1031
|
+
'(on Claude Desktop, configure an output folder in the server settings so the server can auto-save). ' +
|
|
1032
|
+
'For a shareable link the user can view and export from, call the `share` tool.';
|
|
1033
|
+
const EXPORT_BINARY_SHARE_HINT_ROOT_CONFIGURED = 'No file was written because `delivery:"inline"` was requested. ' +
|
|
1034
|
+
'Claude Desktop cannot display inline pdf/xlsx documents, so nothing appeared. ' +
|
|
1035
|
+
'Omit `delivery` (or use `delivery:"file"`) to let the server save the file to the configured output folder — ' +
|
|
1036
|
+
'then share that local path with the user. Alternatively call the `share` tool for an openable link.';
|
|
1037
|
+
function buildExportInlineContentBlocks(format, bytes, showHint = true, rootConfigured = false) {
|
|
1038
|
+
const mimeMap = {
|
|
1039
|
+
png: 'image/png',
|
|
1040
|
+
pdf: 'application/pdf',
|
|
1041
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
1042
|
+
};
|
|
1043
|
+
const mimeType = mimeMap[format] ?? 'application/octet-stream';
|
|
1044
|
+
const base64 = Buffer.from(bytes).toString('base64');
|
|
1045
|
+
// PNG renders inline as an image — no resource wrapper or share hint needed.
|
|
1046
|
+
if (format === 'png') {
|
|
1047
|
+
return [{ type: 'image', data: base64, mimeType }];
|
|
1048
|
+
}
|
|
1049
|
+
// pdf/xlsx: embedded resource block, and optionally a hint pointing the agent
|
|
1050
|
+
// at output:/delivery:'file' when no file was also written.
|
|
1051
|
+
const blocks = [
|
|
1052
|
+
{
|
|
1053
|
+
type: 'resource',
|
|
1054
|
+
resource: {
|
|
1055
|
+
uri: `nowline://export/roadmap.${format}`,
|
|
1056
|
+
mimeType,
|
|
1057
|
+
blob: base64,
|
|
1058
|
+
},
|
|
1059
|
+
},
|
|
1060
|
+
];
|
|
1061
|
+
if (showHint) {
|
|
1062
|
+
const hint = rootConfigured
|
|
1063
|
+
? EXPORT_BINARY_SHARE_HINT_ROOT_CONFIGURED
|
|
1064
|
+
: EXPORT_BINARY_SHARE_HINT_NO_ROOT;
|
|
1065
|
+
blocks.push({ type: 'text', text: hint });
|
|
1066
|
+
}
|
|
1067
|
+
return blocks;
|
|
1068
|
+
}
|
|
924
1069
|
async function buildReviewContentBlocks(source, format, artifactBytes, inputs, host) {
|
|
925
1070
|
const blocks = [
|
|
926
1071
|
{
|