huly-mcp-selfhost 2.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +39 -2
- package/README.md +462 -16
- package/dist/connection.d.ts +8 -0
- package/dist/connection.js +13 -1
- package/dist/connection.js.map +1 -1
- package/dist/env.d.ts +1 -0
- package/dist/env.js +17 -0
- package/dist/env.js.map +1 -0
- package/dist/guard.d.ts +28 -0
- package/dist/guard.js +152 -0
- package/dist/guard.js.map +1 -0
- package/dist/guides/costs.md +48 -0
- package/dist/guides/features.md +49 -0
- package/dist/guides/onboarding.md +56 -0
- package/dist/guides/workflow.md +57 -0
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/junit-cli.d.ts +8 -0
- package/dist/junit-cli.js +106 -0
- package/dist/junit-cli.js.map +1 -0
- package/dist/registry.d.ts +18 -0
- package/dist/registry.js +318 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources.d.ts +12 -0
- package/dist/resources.js +212 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas.d.ts +1269 -17
- package/dist/schemas.js +890 -97
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +27 -1
- package/dist/server.js +197 -128
- package/dist/server.js.map +1 -1
- package/dist/tools/activity.d.ts +10 -0
- package/dist/tools/activity.js +62 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/agent.d.ts +156 -0
- package/dist/tools/agent.js +523 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/attachments.d.ts +4 -4
- package/dist/tools/calendar.d.ts +49 -0
- package/dist/tools/calendar.js +116 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/cards.d.ts +87 -0
- package/dist/tools/cards.js +246 -0
- package/dist/tools/cards.js.map +1 -0
- package/dist/tools/channels.d.ts +76 -7
- package/dist/tools/channels.js +86 -5
- package/dist/tools/channels.js.map +1 -1
- package/dist/tools/comments.d.ts +16 -4
- package/dist/tools/comments.js +26 -9
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/components.d.ts +5 -5
- package/dist/tools/components.js +4 -22
- package/dist/tools/components.js.map +1 -1
- package/dist/tools/contacts.d.ts +69 -0
- package/dist/tools/contacts.js +130 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/crm.d.ts +61 -0
- package/dist/tools/crm.js +117 -0
- package/dist/tools/crm.js.map +1 -0
- package/dist/tools/documents.d.ts +35 -12
- package/dist/tools/documents.js +107 -22
- package/dist/tools/documents.js.map +1 -1
- package/dist/tools/drive.d.ts +107 -0
- package/dist/tools/drive.js +277 -0
- package/dist/tools/drive.js.map +1 -0
- package/dist/tools/fields.d.ts +33 -0
- package/dist/tools/fields.js +124 -0
- package/dist/tools/fields.js.map +1 -0
- package/dist/tools/generic.d.ts +72 -0
- package/dist/tools/generic.js +242 -0
- package/dist/tools/generic.js.map +1 -0
- package/dist/tools/github.d.ts +21 -0
- package/dist/tools/github.js +80 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/hr.d.ts +97 -0
- package/dist/tools/hr.js +150 -0
- package/dist/tools/hr.js.map +1 -0
- package/dist/tools/inbox.d.ts +23 -0
- package/dist/tools/inbox.js +76 -0
- package/dist/tools/inbox.js.map +1 -0
- package/dist/tools/inventory.d.ts +61 -0
- package/dist/tools/inventory.js +103 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/issues.d.ts +63 -12
- package/dist/tools/issues.js +259 -48
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/labels.d.ts +52 -4
- package/dist/tools/labels.js +86 -4
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/log-time.d.ts +15 -1
- package/dist/tools/log-time.js +70 -6
- package/dist/tools/log-time.js.map +1 -1
- package/dist/tools/meetings.d.ts +30 -0
- package/dist/tools/meetings.js +78 -0
- package/dist/tools/meetings.js.map +1 -0
- package/dist/tools/members.d.ts +1 -1
- package/dist/tools/members.js +17 -1
- package/dist/tools/members.js.map +1 -1
- package/dist/tools/message-templates.d.ts +54 -0
- package/dist/tools/message-templates.js +88 -0
- package/dist/tools/message-templates.js.map +1 -0
- package/dist/tools/milestones.d.ts +9 -9
- package/dist/tools/organizations.d.ts +5 -5
- package/dist/tools/organizations.js +2 -1
- package/dist/tools/organizations.js.map +1 -1
- package/dist/tools/overview.d.ts +55 -0
- package/dist/tools/overview.js +395 -0
- package/dist/tools/overview.js.map +1 -0
- package/dist/tools/planner.d.ts +60 -0
- package/dist/tools/planner.js +145 -0
- package/dist/tools/planner.js.map +1 -0
- package/dist/tools/process.d.ts +50 -0
- package/dist/tools/process.js +137 -0
- package/dist/tools/process.js.map +1 -0
- package/dist/tools/products.d.ts +17 -0
- package/dist/tools/products.js +45 -0
- package/dist/tools/products.js.map +1 -0
- package/dist/tools/projects.d.ts +17 -4
- package/dist/tools/projects.js +31 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/qms.d.ts +57 -0
- package/dist/tools/qms.js +171 -0
- package/dist/tools/qms.js.map +1 -0
- package/dist/tools/recruiting.d.ts +112 -0
- package/dist/tools/recruiting.js +203 -0
- package/dist/tools/recruiting.js.map +1 -0
- package/dist/tools/relations.d.ts +45 -3
- package/dist/tools/relations.js +128 -39
- package/dist/tools/relations.js.map +1 -1
- package/dist/tools/search.d.ts +14 -1
- package/dist/tools/search.js +29 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/sharing.d.ts +62 -0
- package/dist/tools/sharing.js +149 -0
- package/dist/tools/sharing.js.map +1 -0
- package/dist/tools/statuses.d.ts +3 -3
- package/dist/tools/surveys.d.ts +22 -0
- package/dist/tools/surveys.js +53 -0
- package/dist/tools/surveys.js.map +1 -0
- package/dist/tools/templates.d.ts +95 -0
- package/dist/tools/templates.js +260 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/test-automation.d.ts +81 -0
- package/dist/tools/test-automation.js +225 -0
- package/dist/tools/test-automation.js.map +1 -0
- package/dist/tools/testing.d.ts +234 -0
- package/dist/tools/testing.js +401 -0
- package/dist/tools/testing.js.map +1 -0
- package/dist/tools/workspace-admin.d.ts +55 -0
- package/dist/tools/workspace-admin.js +117 -0
- package/dist/tools/workspace-admin.js.map +1 -0
- package/dist/tools/workspaces.d.ts +1 -1
- package/dist/utils/attributes.d.ts +37 -0
- package/dist/utils/attributes.js +188 -0
- package/dist/utils/attributes.js.map +1 -0
- package/dist/utils/classes.d.ts +51 -0
- package/dist/utils/classes.js +73 -0
- package/dist/utils/classes.js.map +1 -0
- package/dist/utils/content.d.ts +11 -0
- package/dist/utils/content.js +86 -0
- package/dist/utils/content.js.map +1 -0
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/files.d.ts +5 -0
- package/dist/utils/files.js +50 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/format.d.ts +2 -0
- package/dist/utils/format.js +7 -13
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/junit.d.ts +13 -0
- package/dist/utils/junit.js +81 -0
- package/dist/utils/junit.js.map +1 -0
- package/dist/utils/markdown.js +9 -4
- package/dist/utils/markdown.js.map +1 -1
- package/dist/utils/meeting.d.ts +13 -0
- package/dist/utils/meeting.js +118 -0
- package/dist/utils/meeting.js.map +1 -0
- package/dist/utils/people.d.ts +25 -0
- package/dist/utils/people.js +80 -0
- package/dist/utils/people.js.map +1 -0
- package/dist/utils/redact.d.ts +3 -0
- package/dist/utils/redact.js +26 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/resolve.d.ts +17 -0
- package/dist/utils/resolve.js +54 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils/spec.d.ts +10 -0
- package/dist/utils/spec.js +90 -0
- package/dist/utils/spec.js.map +1 -0
- package/dist/utils/storage.js +7 -3
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/tasks.d.ts +22 -0
- package/dist/utils/tasks.js +81 -0
- package/dist/utils/tasks.js.map +1 -0
- package/dist/watch.d.ts +62 -0
- package/dist/watch.js +405 -0
- package/dist/watch.js.map +1 -0
- package/package.json +4 -3
- package/scripts/setup.js +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.js","sourceRoot":"","sources":["../../src/utils/classes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Blob requests go to the front service; without a limit a stalled connection hangs the tool call. */
|
|
2
|
+
export declare const BLOB_TIMEOUT_MS = 30000;
|
|
3
|
+
export declare function fetchBlob(url: string, wsToken: string): Promise<Response>;
|
|
4
|
+
/** Plain text of a markup blob, or a short note why it could not be read. */
|
|
5
|
+
export declare function readMarkup(workspace: string | undefined, blobRef: string | null | undefined): Promise<string>;
|
|
6
|
+
/** Parsed ProseMirror JSON of a markup blob (throws if it cannot be loaded). */
|
|
7
|
+
export declare function readMarkupJson(workspace: string | undefined, blobRef: string): Promise<any>;
|
|
8
|
+
/** Uploads Markdown as a markup blob and returns the blob ref to store on the doc. */
|
|
9
|
+
export declare function writeMarkup(workspace: string | undefined, idHint: string, markdown: string): Promise<string>;
|
|
10
|
+
/** Raw bytes of a blob (files, attachments) — via the self-hosted front service. */
|
|
11
|
+
export declare function downloadBlob(workspace: string | undefined, blobRef: string): Promise<Buffer>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BLOB_TIMEOUT_MS = void 0;
|
|
4
|
+
exports.fetchBlob = fetchBlob;
|
|
5
|
+
exports.readMarkup = readMarkup;
|
|
6
|
+
exports.readMarkupJson = readMarkupJson;
|
|
7
|
+
exports.writeMarkup = writeMarkup;
|
|
8
|
+
exports.downloadBlob = downloadBlob;
|
|
9
|
+
// Reading and writing rich-text bodies (issue descriptions, document content, card content …).
|
|
10
|
+
// Huly stores them as blobs holding ProseMirror JSON; the doc only keeps the blob ref.
|
|
11
|
+
const connection_1 = require("../connection");
|
|
12
|
+
const markdown_1 = require("./markdown");
|
|
13
|
+
const storage_1 = require("./storage");
|
|
14
|
+
/** Blob requests go to the front service; without a limit a stalled connection hangs the tool call. */
|
|
15
|
+
exports.BLOB_TIMEOUT_MS = 30_000;
|
|
16
|
+
function fetchBlob(url, wsToken) {
|
|
17
|
+
return fetch(url, { headers: { Authorization: `Bearer ${wsToken}` }, signal: AbortSignal.timeout(exports.BLOB_TIMEOUT_MS) })
|
|
18
|
+
.catch((e) => {
|
|
19
|
+
const err = e;
|
|
20
|
+
if (err.name === 'TimeoutError')
|
|
21
|
+
throw new Error(`Huly front service did not answer within ${exports.BLOB_TIMEOUT_MS / 1000}s (HULY_FRONT_URL).`);
|
|
22
|
+
throw new Error(`Huly front service not reachable (HULY_FRONT_URL): ${err.cause?.code ?? err.message}`);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Plain text of a markup blob, or a short note why it could not be read. */
|
|
26
|
+
async function readMarkup(workspace, blobRef) {
|
|
27
|
+
if (blobRef == null || blobRef === '')
|
|
28
|
+
return '';
|
|
29
|
+
const frontUrl = process.env.HULY_FRONT_URL;
|
|
30
|
+
if (frontUrl == null || frontUrl === '')
|
|
31
|
+
return `_(content not loaded — set HULY_FRONT_URL; blob \`${blobRef}\`)_`;
|
|
32
|
+
const { wsToken, workspaceUuid } = await (0, connection_1.getWorkspaceInfo)(workspace);
|
|
33
|
+
// Token goes in the Authorization header only — never in the URL.
|
|
34
|
+
const url = `${frontUrl.replace(/\/$/, '')}/files?file=${encodeURIComponent(blobRef)}&workspace=${workspaceUuid}`;
|
|
35
|
+
try {
|
|
36
|
+
const res = await fetchBlob(url, wsToken);
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
return `_(content fetch failed: HTTP ${res.status})_`;
|
|
39
|
+
const text = await res.text();
|
|
40
|
+
try {
|
|
41
|
+
return (0, markdown_1.extractText)(JSON.parse(text));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return text.slice(0, 4000);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
return `_(content fetch failed: ${e.message})_`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Parsed ProseMirror JSON of a markup blob (throws if it cannot be loaded). */
|
|
52
|
+
async function readMarkupJson(workspace, blobRef) {
|
|
53
|
+
const frontUrl = process.env.HULY_FRONT_URL;
|
|
54
|
+
if (frontUrl == null || frontUrl === '')
|
|
55
|
+
throw new Error('Reading document content needs HULY_FRONT_URL.');
|
|
56
|
+
const { wsToken, workspaceUuid } = await (0, connection_1.getWorkspaceInfo)(workspace);
|
|
57
|
+
const url = `${frontUrl.replace(/\/$/, '')}/files?file=${encodeURIComponent(blobRef)}&workspace=${workspaceUuid}`;
|
|
58
|
+
const res = await fetchBlob(url, wsToken);
|
|
59
|
+
if (!res.ok)
|
|
60
|
+
throw new Error(`Content fetch failed: HTTP ${res.status}`);
|
|
61
|
+
const text = await res.text();
|
|
62
|
+
try {
|
|
63
|
+
return JSON.parse(text);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new Error('Document content is not Huly markup JSON.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Uploads Markdown as a markup blob and returns the blob ref to store on the doc. */
|
|
70
|
+
async function writeMarkup(workspace, idHint, markdown) {
|
|
71
|
+
const { wsToken, workspaceUuid } = await (0, connection_1.getWorkspaceInfo)(workspace);
|
|
72
|
+
return await (0, storage_1.uploadMarkupBlob)(wsToken, workspaceUuid, `${idHint}-${Date.now()}`, JSON.stringify((0, markdown_1.markdownToProseMirror)(markdown)));
|
|
73
|
+
}
|
|
74
|
+
/** Raw bytes of a blob (files, attachments) — via the self-hosted front service. */
|
|
75
|
+
async function downloadBlob(workspace, blobRef) {
|
|
76
|
+
const frontUrl = process.env.HULY_FRONT_URL;
|
|
77
|
+
if (frontUrl == null || frontUrl === '')
|
|
78
|
+
throw new Error('Downloading files needs HULY_FRONT_URL.');
|
|
79
|
+
const { wsToken, workspaceUuid } = await (0, connection_1.getWorkspaceInfo)(workspace);
|
|
80
|
+
const url = `${frontUrl.replace(/\/$/, '')}/files?file=${encodeURIComponent(blobRef)}&workspace=${workspaceUuid}`;
|
|
81
|
+
const res = await fetchBlob(url, wsToken);
|
|
82
|
+
if (!res.ok)
|
|
83
|
+
throw new Error(`File download failed: HTTP ${res.status}`);
|
|
84
|
+
return Buffer.from(await res.arrayBuffer());
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/utils/content.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -17,7 +17,7 @@ function wrapToolHandler(handler) {
|
|
|
17
17
|
}
|
|
18
18
|
catch (err) {
|
|
19
19
|
const message = err instanceof Error ? err.message : String(err);
|
|
20
|
-
throw new Error(`Huly MCP: ${message}`);
|
|
20
|
+
throw new Error(message.startsWith('Huly MCP: ') ? message : `Huly MCP: ${message}`);
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
}
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";;;;AAAA,kBAA0B,SAAQ,KAAK;IACrC,YAAa,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;;AAID,yBACE,OAAqC;IAErC,OAAO,KAAK,EAAE,IAAO,EAAuB,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;YAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QAC9C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,EAAE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function fileRoot(env?: NodeJS.ProcessEnv): string | undefined;
|
|
2
|
+
/** Absolute path inside HULY_FILE_ROOT, or an error explaining how to enable local files. */
|
|
3
|
+
export declare function localPath(path: string, env?: NodeJS.ProcessEnv): string;
|
|
4
|
+
export declare const isTextType: (mime: string | undefined) => boolean;
|
|
5
|
+
export declare const mimeFromName: (name: string) => string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mimeFromName = exports.isTextType = void 0;
|
|
4
|
+
exports.fileRoot = fileRoot;
|
|
5
|
+
exports.localPath = localPath;
|
|
6
|
+
// Local file access for uploads/downloads. Off unless HULY_FILE_ROOT names a directory:
|
|
7
|
+
// the server may run remotely (Docker), where arbitrary paths would expose its own files.
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
function fileRoot(env = process.env) {
|
|
11
|
+
const root = env.HULY_FILE_ROOT;
|
|
12
|
+
return root != null && root !== '' ? (0, node_fs_1.realpathSync)(root) : undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Absolute path inside HULY_FILE_ROOT, or an error explaining how to enable local files. */
|
|
15
|
+
function localPath(path, env = process.env) {
|
|
16
|
+
const root = fileRoot(env);
|
|
17
|
+
if (root == null)
|
|
18
|
+
throw new Error('Local file paths are disabled. Set HULY_FILE_ROOT to a directory to allow them, or pass contentBase64.');
|
|
19
|
+
const abs = (0, node_path_1.resolve)(root, path);
|
|
20
|
+
// Resolve symlinks of the deepest existing ancestor so a link cannot point outside the root;
|
|
21
|
+
// folders that do not exist yet (a download into a new subfolder) are appended unresolved.
|
|
22
|
+
let base = abs;
|
|
23
|
+
const rest = [];
|
|
24
|
+
while (!(0, node_fs_1.existsSync)(base)) {
|
|
25
|
+
const parent = (0, node_path_1.dirname)(base);
|
|
26
|
+
if (parent === base)
|
|
27
|
+
break;
|
|
28
|
+
rest.unshift(base.slice(parent.length).replace(/^[\\/]+/, ''));
|
|
29
|
+
base = parent;
|
|
30
|
+
}
|
|
31
|
+
const real = (0, node_path_1.resolve)((0, node_fs_1.existsSync)(base) ? (0, node_fs_1.realpathSync)(base) : base, ...rest);
|
|
32
|
+
// Windows paths are case-insensitive.
|
|
33
|
+
const norm = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
|
|
34
|
+
if (norm(real) !== norm(root) && !norm(real).startsWith(norm(root) + node_path_1.sep))
|
|
35
|
+
throw new Error(`'${path}' is outside HULY_FILE_ROOT.`);
|
|
36
|
+
return real;
|
|
37
|
+
}
|
|
38
|
+
const TEXT_TYPES = /^(text\/|application\/(json|xml|javascript|x-yaml|yaml|sql|x-sh|toml)|image\/svg)/;
|
|
39
|
+
const isTextType = (mime) => TEXT_TYPES.test(mime ?? '');
|
|
40
|
+
exports.isTextType = isTextType;
|
|
41
|
+
const EXT_TYPES = {
|
|
42
|
+
txt: 'text/plain', md: 'text/markdown', csv: 'text/csv', json: 'application/json', html: 'text/html', xml: 'application/xml',
|
|
43
|
+
yaml: 'application/yaml', yml: 'application/yaml', pdf: 'application/pdf', png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',
|
|
44
|
+
gif: 'image/gif', svg: 'image/svg+xml', webp: 'image/webp', zip: 'application/zip', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
45
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
46
|
+
mp4: 'video/mp4', mp3: 'audio/mpeg', ts: 'text/plain', js: 'text/javascript', sh: 'application/x-sh'
|
|
47
|
+
};
|
|
48
|
+
const mimeFromName = (name) => EXT_TYPES[name.split('.').pop()?.toLowerCase() ?? ''] ?? 'application/octet-stream';
|
|
49
|
+
exports.mimeFromName = mimeFromName;
|
|
50
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/format.d.ts
CHANGED
|
@@ -4,3 +4,5 @@ export declare function formatDate(ts: number | null | undefined): string;
|
|
|
4
4
|
export declare function priorityLabel(priority: number): string;
|
|
5
5
|
export declare function markupToText(markup: string | null | undefined): string;
|
|
6
6
|
export declare function textToMarkup(text: string | null): string;
|
|
7
|
+
/** Shortens long text for listings, with a visible marker so nobody edits the shortened version. */
|
|
8
|
+
export declare function clip(text: string, max: number, hint: string): string;
|
package/dist/utils/format.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.formatDate = formatDate;
|
|
|
5
5
|
exports.priorityLabel = priorityLabel;
|
|
6
6
|
exports.markupToText = markupToText;
|
|
7
7
|
exports.textToMarkup = textToMarkup;
|
|
8
|
+
exports.clip = clip;
|
|
8
9
|
const markdown_1 = require("./markdown");
|
|
9
10
|
const tracker_1 = require("@hcengineering/tracker");
|
|
10
11
|
exports.PRIORITY_LABELS = {
|
|
@@ -36,7 +37,7 @@ function markupToText(markup) {
|
|
|
36
37
|
if (!markup.trimStart().startsWith('{'))
|
|
37
38
|
return markup;
|
|
38
39
|
try {
|
|
39
|
-
return
|
|
40
|
+
return (0, markdown_1.extractText)(JSON.parse(markup)).trim();
|
|
40
41
|
}
|
|
41
42
|
catch {
|
|
42
43
|
return markup;
|
|
@@ -47,17 +48,10 @@ function textToMarkup(text) {
|
|
|
47
48
|
return '';
|
|
48
49
|
return JSON.stringify((0, markdown_1.markdownToProseMirror)(text));
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (node.type === 'text')
|
|
56
|
-
return typeof node.text === 'string' ? node.text : '';
|
|
57
|
-
if (node.type === 'hardBreak')
|
|
58
|
-
return '\n';
|
|
59
|
-
const children = Array.isArray(node.content) ? node.content : [];
|
|
60
|
-
const hasBlocks = children.some((c) => BLOCK_TYPES.has(c?.type));
|
|
61
|
-
return children.map(blockText).join(hasBlocks ? '\n' : '');
|
|
51
|
+
/** Shortens long text for listings, with a visible marker so nobody edits the shortened version. */
|
|
52
|
+
function clip(text, max, hint) {
|
|
53
|
+
if (text.length <= max)
|
|
54
|
+
return text;
|
|
55
|
+
return `${text.slice(0, max).trimEnd()}… _[${text.length - max} more chars — ${hint}]_`;
|
|
62
56
|
}
|
|
63
57
|
//# sourceMappingURL=format.js.map
|
package/dist/utils/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":";;;;;;;;AAAA,yCAA+D;AAC/D,oDAAsD;AAEzC,QAAA,eAAe,GAA2B;IACrD,CAAC,uBAAa,CAAC,UAAU,CAAC,EAAE,aAAa;IACzC,CAAC,uBAAa,CAAC,MAAM,CAAC,EAAE,QAAQ;IAChC,CAAC,uBAAa,CAAC,IAAI,CAAC,EAAE,MAAM;IAC5B,CAAC,uBAAa,CAAC,MAAM,CAAC,EAAE,QAAQ;IAChC,CAAC,uBAAa,CAAC,GAAG,CAAC,EAAE,KAAK;CAC3B,CAAA;AAEY,QAAA,uBAAuB,GAA2B;IAC7D,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;CACd,CAAA;AAED,oBAA4B,EAA6B;IACvD,IAAI,EAAE,IAAI,IAAI;QAAE,OAAO,MAAM,CAAA;IAC7B,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,uBAA+B,QAAgB;IAC7C,OAAO,QAAA,eAAe,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAA;AAC/C,CAAC;AAED,oFAAoF;AACpF,mFAAmF;AACnF,sBAA8B,MAAiC;IAC7D,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAC9C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IACtD,IAAI,CAAC;QACH,OAAO,IAAA,sBAAW,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,sBAA8B,IAAmB;IAC/C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAA,gCAAqB,EAAC,IAAI,CAAC,CAAC,CAAA;AACpD,CAAC;AAGD,oGAAoG;AACpG,cAAsB,IAAY,EAAE,GAAW,EAAE,IAAY;IAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACnC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,iBAAiB,IAAI,IAAI,CAAA;AACzF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type JUnitStatus = 'passed' | 'failed' | 'skipped';
|
|
2
|
+
export interface JUnitCase {
|
|
3
|
+
suite: string;
|
|
4
|
+
name: string;
|
|
5
|
+
classname?: string;
|
|
6
|
+
time?: number;
|
|
7
|
+
status: JUnitStatus;
|
|
8
|
+
message?: string;
|
|
9
|
+
details?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function decodeXml(s: string): string;
|
|
12
|
+
/** Parses JUnit XML into flat test cases; suite = innermost <testsuite name>. */
|
|
13
|
+
export declare function parseJUnit(xml: string): JUnitCase[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Minimal JUnit XML reader (the format most test runners emit: Jest, Vitest, pytest, Go, Gradle,
|
|
3
|
+
// Maven Surefire, XCTest via xcpretty, node:test …). No dependency: testsuite/testcase elements,
|
|
4
|
+
// their attributes and failure/error/skipped children are all that is needed.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.decodeXml = decodeXml;
|
|
7
|
+
exports.parseJUnit = parseJUnit;
|
|
8
|
+
const ENT = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" };
|
|
9
|
+
function decodeXml(s) {
|
|
10
|
+
return s
|
|
11
|
+
.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, (_, c) => c.replace(/&/g, '\u0000amp;'))
|
|
12
|
+
.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos);/gi, (_, e) => e[0] === '#'
|
|
13
|
+
? String.fromCodePoint(e[1] === 'x' || e[1] === 'X' ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10))
|
|
14
|
+
: ENT[e.toLowerCase()])
|
|
15
|
+
.replace(/\u0000amp;/g, '&');
|
|
16
|
+
}
|
|
17
|
+
function attrs(tag) {
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const m of tag.matchAll(/([\w:.-]+)\s*=\s*("([^"]*)"|'([^']*)')/g))
|
|
20
|
+
out[m[1]] = decodeXml(m[3] ?? m[4] ?? '');
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
/** Parses JUnit XML into flat test cases; suite = innermost <testsuite name>. */
|
|
24
|
+
function parseJUnit(xml) {
|
|
25
|
+
let src = xml;
|
|
26
|
+
for (let prev = ''; prev !== src;) {
|
|
27
|
+
prev = src;
|
|
28
|
+
src = src.replace(/<!--[\s\S]*?-->/g, '');
|
|
29
|
+
}
|
|
30
|
+
src = src.replace(/<\?xml[\s\S]*?\?>/, '');
|
|
31
|
+
if (!/<testsuites?[\s>]|<testcase[\s>]/.test(src))
|
|
32
|
+
throw new Error('Not JUnit XML: no <testsuite> or <testcase> element found.');
|
|
33
|
+
const out = [];
|
|
34
|
+
const stack = [];
|
|
35
|
+
const re = /<(\/?)(testsuites|testsuite|testcase)\b([^>]*?)(\/?)>/g;
|
|
36
|
+
let m;
|
|
37
|
+
while ((m = re.exec(src)) != null) {
|
|
38
|
+
const [, close, tag, rawAttrs, selfClose] = m;
|
|
39
|
+
if (tag === 'testsuite') {
|
|
40
|
+
if (close === '/')
|
|
41
|
+
stack.pop();
|
|
42
|
+
else if (selfClose !== '/')
|
|
43
|
+
stack.push(attrs(rawAttrs).name ?? '');
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (tag !== 'testcase' || close === '/')
|
|
47
|
+
continue;
|
|
48
|
+
const a = attrs(rawAttrs);
|
|
49
|
+
let body = '';
|
|
50
|
+
if (selfClose !== '/') {
|
|
51
|
+
const end = src.indexOf('</testcase>', re.lastIndex);
|
|
52
|
+
if (end === -1)
|
|
53
|
+
throw new Error(`Unclosed <testcase name="${a.name ?? '?'}">.`);
|
|
54
|
+
body = src.slice(re.lastIndex, end);
|
|
55
|
+
re.lastIndex = end + '</testcase>'.length;
|
|
56
|
+
}
|
|
57
|
+
const c = { suite: [...stack].reverse().find((s) => s !== '') ?? a.classname ?? 'Tests', name: a.name ?? '(unnamed)', status: 'passed' };
|
|
58
|
+
if (a.classname != null && a.classname !== '')
|
|
59
|
+
c.classname = a.classname;
|
|
60
|
+
if (a.time != null && !Number.isNaN(Number(a.time)))
|
|
61
|
+
c.time = Number(a.time);
|
|
62
|
+
const bad = /<(failure|error)\b([^>]*?)(\/>|>([\s\S]*?)<\/\1>)/.exec(body);
|
|
63
|
+
if (bad != null) {
|
|
64
|
+
c.status = 'failed';
|
|
65
|
+
const ba = attrs(bad[2]);
|
|
66
|
+
c.message = ba.message ?? ba.type;
|
|
67
|
+
const text = decodeXml(bad[4] ?? '').trim();
|
|
68
|
+
if (text !== '')
|
|
69
|
+
c.details = text;
|
|
70
|
+
}
|
|
71
|
+
else if (/<skipped\b/.test(body)) {
|
|
72
|
+
c.status = 'skipped';
|
|
73
|
+
const sa = /<skipped\b([^>]*)/.exec(body);
|
|
74
|
+
if (sa != null)
|
|
75
|
+
c.message = attrs(sa[1]).message;
|
|
76
|
+
}
|
|
77
|
+
out.push(c);
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=junit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"junit.js","sourceRoot":"","sources":["../../src/utils/junit.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/markdown.js
CHANGED
|
@@ -131,14 +131,19 @@ function buildTable(rows) {
|
|
|
131
131
|
}
|
|
132
132
|
// Extract plain text from Huly's ProseMirror JSON markup (inverse-ish of
|
|
133
133
|
// markdownToProseMirror, used for get_document / get_issue content reads).
|
|
134
|
+
// Inline nodes (text, marks) are concatenated; block nodes are separated by newlines.
|
|
135
|
+
const BLOCK_TYPES = new Set(['doc', 'paragraph', 'heading', 'bulletList', 'orderedList', 'listItem', 'codeBlock', 'blockquote', 'table', 'tableRow', 'tableCell', 'tableHeader', 'horizontalRule', 'image']);
|
|
134
136
|
function extractText(node) {
|
|
135
137
|
if (typeof node === 'string')
|
|
136
138
|
return node;
|
|
137
139
|
if (node == null || typeof node !== 'object')
|
|
138
140
|
return '';
|
|
139
|
-
if (node.type === 'text'
|
|
140
|
-
return node.text;
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
if (node.type === 'text')
|
|
142
|
+
return typeof node.text === 'string' ? node.text : '';
|
|
143
|
+
if (node.type === 'hardBreak')
|
|
144
|
+
return '\n';
|
|
145
|
+
const children = Array.isArray(node.content) ? node.content : (Array.isArray(node.children) ? node.children : []);
|
|
146
|
+
const hasBlocks = children.some((c) => BLOCK_TYPES.has(c?.type));
|
|
147
|
+
return children.map(extractText).join(hasBlocks ? '\n' : '');
|
|
143
148
|
}
|
|
144
149
|
//# sourceMappingURL=markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,6EAA6E;AAC7E,4EAA4E;AAC5E,qBAAqB
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface MeetingTask {
|
|
2
|
+
title: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
assignee?: string;
|
|
5
|
+
dueDate?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MeetingPlan {
|
|
8
|
+
tasks: MeetingTask[];
|
|
9
|
+
skippedDone: number;
|
|
10
|
+
}
|
|
11
|
+
/** "Action: @Ann send slides bis 10.11.2026" → { title: 'send slides', assignee: 'Ann', dueDate: '2026-11-10' } */
|
|
12
|
+
export declare function parseActionLine(line: string, description?: string): MeetingTask | undefined;
|
|
13
|
+
export declare function actionsFromMarkup(root: any): MeetingPlan;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Meeting notes → action items, without an LLM round trip.
|
|
3
|
+
// An action item is: an open checkbox, a line starting with "TODO:"/"Action:"/"Aufgabe:", or a list
|
|
4
|
+
// item under a heading like "Action items", "Next steps", "To-dos", "Aufgaben", "Nächste Schritte".
|
|
5
|
+
// From each item: assignee (@mention or "@Name") and due date (ISO or DD.MM.YYYY) are taken out
|
|
6
|
+
// of the title.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.parseActionLine = parseActionLine;
|
|
9
|
+
exports.actionsFromMarkup = actionsFromMarkup;
|
|
10
|
+
const ACTION_HEADING = /^(action items?|actions?|next steps?|to-?dos?|tasks?|follow-?ups?|aufgaben|nächste schritte|maßnahmen|offene punkte)\b/i;
|
|
11
|
+
const PREFIX = /^(?:todo|to-do|to do|action(?: item)?|aufgabe|task)\s*[:–-]\s*/i;
|
|
12
|
+
const CHECK = /^\s*\[( |x|X)\]\s+/;
|
|
13
|
+
const DUE = /(?:\b(?:due|by|until|bis|fällig(?: am)?|deadline)\s*:?\s*)?\b(\d{4}-\d{2}-\d{2}|\d{1,2}\.\d{1,2}\.\d{4})\b/i;
|
|
14
|
+
const AT_NAME = /(^|\s)@([\p{L}][\p{L}\p{M}'.\u00a0-]*)/u;
|
|
15
|
+
const BLOCKS = new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'listItem', 'todoList', 'todoItem', 'taskList', 'taskItem', 'codeBlock', 'blockquote']);
|
|
16
|
+
const kids = (node) => Array.isArray(node?.content) ? node.content : [];
|
|
17
|
+
/** Text with mentions kept as "@Name" (extractText drops them: they have no text children). */
|
|
18
|
+
function textOf(node) {
|
|
19
|
+
if (node == null || typeof node !== 'object')
|
|
20
|
+
return '';
|
|
21
|
+
if (node.type === 'text')
|
|
22
|
+
return typeof node.text === 'string' ? node.text : '';
|
|
23
|
+
if (node.type === 'hardBreak')
|
|
24
|
+
return '\n';
|
|
25
|
+
if (node.type === 'reference' || node.type === 'mention') {
|
|
26
|
+
const label = String(node.attrs?.label ?? '').trim();
|
|
27
|
+
return label !== '' ? `@${label.replace(/\s+/g, ' ')}` : '';
|
|
28
|
+
}
|
|
29
|
+
const cs = kids(node);
|
|
30
|
+
return cs.map(textOf).join(cs.some((c) => BLOCKS.has(c?.type)) ? '\n' : '');
|
|
31
|
+
}
|
|
32
|
+
function isoDate(raw) {
|
|
33
|
+
const de = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(raw);
|
|
34
|
+
const iso = de != null ? `${de[3]}-${de[2].padStart(2, '0')}-${de[1].padStart(2, '0')}` : raw;
|
|
35
|
+
const t = Date.parse(`${iso}T00:00:00Z`);
|
|
36
|
+
return Number.isNaN(t) || new Date(t).toISOString().slice(0, 10) !== iso ? undefined : iso;
|
|
37
|
+
}
|
|
38
|
+
/** "Action: @Ann send slides bis 10.11.2026" → { title: 'send slides', assignee: 'Ann', dueDate: '2026-11-10' } */
|
|
39
|
+
function parseActionLine(line, description) {
|
|
40
|
+
let title = line.replace(CHECK, '').replace(PREFIX, '');
|
|
41
|
+
let assignee;
|
|
42
|
+
const at = AT_NAME.exec(title);
|
|
43
|
+
if (at != null) {
|
|
44
|
+
assignee = at[2].replace(/ /g, ' ').replace(/[.'-]+$/, '');
|
|
45
|
+
title = title.slice(0, at.index) + at[1] + title.slice(at.index + at[0].length);
|
|
46
|
+
}
|
|
47
|
+
let dueDate;
|
|
48
|
+
const due = DUE.exec(title);
|
|
49
|
+
if (due != null) {
|
|
50
|
+
dueDate = isoDate(due[1]);
|
|
51
|
+
if (dueDate != null)
|
|
52
|
+
title = title.slice(0, due.index) + title.slice(due.index + due[0].length);
|
|
53
|
+
}
|
|
54
|
+
title = title.replace(/\(\s*\)/g, '').replace(/\s+/g, ' ').replace(/^[\s:;,–—-]+|[\s:;,–—-]+$/g, '').trim();
|
|
55
|
+
if (title === '')
|
|
56
|
+
return undefined;
|
|
57
|
+
return { title, description, assignee, dueDate };
|
|
58
|
+
}
|
|
59
|
+
function actionsFromMarkup(root) {
|
|
60
|
+
const tasks = [];
|
|
61
|
+
let skippedDone = 0;
|
|
62
|
+
const add = (t) => { if (t != null && !tasks.some((x) => x.title.toLowerCase() === t.title.toLowerCase()))
|
|
63
|
+
tasks.push(t); };
|
|
64
|
+
const nested = (rest) => {
|
|
65
|
+
const s = rest.map(textOf).join('\n').trim();
|
|
66
|
+
return s !== '' ? s : undefined;
|
|
67
|
+
};
|
|
68
|
+
const walk = (node, inActions) => {
|
|
69
|
+
const type = String(node?.type ?? '');
|
|
70
|
+
if (type === 'todoItem' || type === 'taskItem') {
|
|
71
|
+
const [first, ...rest] = kids(node);
|
|
72
|
+
if (node.attrs?.checked === true)
|
|
73
|
+
skippedDone++;
|
|
74
|
+
else
|
|
75
|
+
add(parseActionLine(textOf(first ?? node), nested(rest)));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (type === 'listItem') {
|
|
79
|
+
const [first, ...rest] = kids(node);
|
|
80
|
+
const line = textOf(first ?? node).trim();
|
|
81
|
+
const check = CHECK.exec(line);
|
|
82
|
+
if (check != null) {
|
|
83
|
+
if (check[1] !== ' ')
|
|
84
|
+
skippedDone++;
|
|
85
|
+
else
|
|
86
|
+
add(parseActionLine(line, nested(rest)));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (inActions || PREFIX.test(line)) {
|
|
90
|
+
add(parseActionLine(line, nested(rest)));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (type === 'paragraph') {
|
|
95
|
+
const line = textOf(node).trim();
|
|
96
|
+
if (PREFIX.test(line))
|
|
97
|
+
add(parseActionLine(line));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
for (const c of kids(node))
|
|
101
|
+
walk(c, inActions);
|
|
102
|
+
};
|
|
103
|
+
// Track "Action items" sections on the top level: they end at the next heading of the same or a higher level.
|
|
104
|
+
let actionLevel;
|
|
105
|
+
for (const block of kids(root)) {
|
|
106
|
+
if (block?.type === 'heading') {
|
|
107
|
+
const level = Number(block.attrs?.level ?? 1);
|
|
108
|
+
if (actionLevel != null && level <= actionLevel)
|
|
109
|
+
actionLevel = undefined;
|
|
110
|
+
if (ACTION_HEADING.test(textOf(block).replace(/^[^\p{L}]+/u, '').trim()))
|
|
111
|
+
actionLevel = level;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
walk(block, actionLevel != null);
|
|
115
|
+
}
|
|
116
|
+
return { tasks, skippedDone };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=meeting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting.js","sourceRoot":"","sources":["../../src/utils/meeting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Ref, TxOperations } from '@hcengineering/core';
|
|
2
|
+
import type { Person } from '@hcengineering/contact';
|
|
3
|
+
export interface PersonInfo {
|
|
4
|
+
_id: Ref<Person>;
|
|
5
|
+
name: string;
|
|
6
|
+
rawName: string;
|
|
7
|
+
uuid?: string;
|
|
8
|
+
}
|
|
9
|
+
/** "Conrad,Joris" → "Joris Conrad"; other formats are returned trimmed. */
|
|
10
|
+
export declare function formatPersonName(raw: string | null | undefined): string;
|
|
11
|
+
/** Workspace users (employees); falls back to all persons if the mixin query returns nothing. */
|
|
12
|
+
export declare function listPeople(client: TxOperations): Promise<PersonInfo[]>;
|
|
13
|
+
/** Map person id → display name. */
|
|
14
|
+
export declare function peopleNames(client: TxOperations): Promise<Map<string, string>>;
|
|
15
|
+
/**
|
|
16
|
+
* Finds one user by name ("Joris", "Conrad", "Joris Conrad", "Conrad,Joris"), case-insensitive.
|
|
17
|
+
* An exact full-name match wins; otherwise the query must match exactly one person.
|
|
18
|
+
*/
|
|
19
|
+
export declare function findPerson(client: TxOperations, query: string): Promise<PersonInfo>;
|
|
20
|
+
/** The Person behind the connected account (via its social identity). */
|
|
21
|
+
export declare function currentPerson(client: TxOperations): Promise<PersonInfo>;
|
|
22
|
+
/** Map social identity (PersonId, e.g. createdBy/modifiedBy) → display name. */
|
|
23
|
+
export declare function socialIdNames(client: TxOperations, ids: string[]): Promise<Map<string, string>>;
|
|
24
|
+
/** Account UUID of the connected user (inbox notifications and calendars are keyed by it). */
|
|
25
|
+
export declare function currentAccountUuid(client: TxOperations): Promise<string>;
|