@hiai-gg/docsmint 0.6.8 → 0.7.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/README.md +20 -4
- package/backend/src/lib/api-keys.ts +14 -6
- package/backend/src/lib/lifecycle-service.ts +397 -73
- package/dist/backend/index.js +13038 -10864
- package/dist/backend-account-runtime-cleanup.js +152 -42
- package/dist/backend-api-key-facade.js +207 -61
- package/dist/backend-pipeline-cancellation.js +144 -42
- package/dist/client.d.ts +12 -2
- package/dist/client.js +83 -30
- package/dist/frontend/{CategoryDialog-CbXBMBZB.js → CategoryDialog-C67_TXf0.js} +4 -4
- package/dist/frontend/{ConfirmDialog-DgMTQBq4.js → ConfirmDialog-_LlrA--f.js} +3 -3
- package/dist/frontend/{CreateSnapshotDialog-FUq-ZfBH.js → CreateSnapshotDialog-BmCRpOMv.js} +3 -3
- package/dist/frontend/{DatePicker-D6E-EEtZ.js → DatePicker-DsoepNdb.js} +8 -8
- package/dist/frontend/{DeleteDialog-8k6JYWCx.js → DeleteDialog-L1A3FhMM.js} +1 -1
- package/dist/frontend/{FolderNode-DAAn_T8_.js → FolderNode-CNwi0ySr.js} +1 -1
- package/dist/frontend/{HiAiEditor-DSVG3GNd.js → HiAiEditor-B1EDGsnA.js} +6 -6
- package/dist/frontend/{SettingsDialog-BDNgf5rv.js → SettingsDialog-AP42xOGg.js} +12 -12
- package/dist/frontend/ShareDialog-wGTXuXFE.js +281 -0
- package/dist/frontend/{Sidebar-DX08utdV.js → Sidebar-lKQT3dEf.js} +17 -16
- package/dist/frontend/{TagCreateDialog-Bb0-Vtzh.js → TagCreateDialog-su8BhLzS.js} +3 -3
- package/dist/frontend/api/attachments.js +1 -1
- package/dist/frontend/api/settings.js +1 -1
- package/dist/frontend/app-shell.js +2 -2
- package/dist/frontend/{attachments-B8AuDjno.js → attachments-B2aH3hXF.js} +10 -9
- package/dist/frontend/{auth-client-Cygmp1I2.js → auth-client-CnDZwPfp.js} +11 -11
- package/dist/frontend/components/category-dialog.js +1 -1
- package/dist/frontend/components/create-snapshot-dialog.js +1 -1
- package/dist/frontend/components/delete-dialog.js +1 -1
- package/dist/frontend/components/editor/compact-editor.js +1 -1
- package/dist/frontend/components/editor/document-editor.js +1 -1
- package/dist/frontend/components/folder-node.js +1 -1
- package/dist/frontend/components/save-as-dialog.js +3 -3
- package/dist/frontend/components/settings.js +1 -1
- package/dist/frontend/components/share-dialog.d.ts +2 -1
- package/dist/frontend/components/share-dialog.js +1 -1
- package/dist/frontend/components/sidebar.js +1 -1
- package/dist/frontend/components/tag-create-dialog.js +1 -1
- package/dist/frontend/components/version-history.js +2 -2
- package/dist/frontend/{confirm-dialog-CzmoZw3a.js → confirm-dialog-BG8y2Pum.js} +4 -4
- package/dist/frontend/dashboard.js +1008 -998
- package/dist/frontend/{db-ByrlYfaI.js → db-Bo1t_76T.js} +1 -1
- package/dist/frontend/{dialog-Ce79C9fd.js → dialog-C2iKObEu.js} +7 -7
- package/dist/frontend/{dropdown-menu-CJ_7V3N0.js → dropdown-menu-BXIl2E26.js} +12 -12
- package/dist/frontend/{floating-layer-anchor-S5RSefGN.js → floating-layer-anchor-BGIndLY-.js} +63 -63
- package/dist/frontend/{identity-DyWeNzu_.js → identity-Ynrglr5i.js} +1 -1
- package/dist/frontend/{input-BWlOML_m.js → input-eHFb2qiL.js} +2 -2
- package/dist/frontend/{label-C2HfJNQ2.js → label-_I1iiaNU.js} +2 -2
- package/dist/frontend/offline/identity.js +1 -1
- package/dist/frontend/search.js +2 -2
- package/dist/frontend/{select-value-JCAp2PmU.js → select-value-CtMyrvDJ.js} +18 -18
- package/dist/frontend/{settings-DSrUl4hW.js → settings-BR48ihB4.js} +6 -23
- package/dist/frontend/{textarea-DOAE-h42.js → textarea-2eslfANY.js} +2 -2
- package/dist/frontend/{utils-BPDRytUU.js → utils-CDBqTgoV.js} +1 -1
- package/dist/frontend-ssr/api/attachments.js +1 -1
- package/dist/frontend-ssr/api/settings.js +1 -1
- package/dist/frontend-ssr/app-shell.js +2 -2
- package/dist/frontend-ssr/assets/{CategoryDialog-QHEv_9N4.js → CategoryDialog-BGuHTb3K.js} +4 -4
- package/dist/frontend-ssr/assets/{ConfirmDialog-BhAelejz.js → ConfirmDialog-D1BDXXll.js} +3 -3
- package/dist/frontend-ssr/assets/{CreateSnapshotDialog-CI8vXXcN.js → CreateSnapshotDialog-BZ45odvJ.js} +3 -3
- package/dist/frontend-ssr/assets/{DatePicker-D84cJ-Eq.js → DatePicker-CPtl6W5E.js} +3 -3
- package/dist/frontend-ssr/assets/{DeleteDialog-DG9Lm38J.js → DeleteDialog-oHT_p_vG.js} +1 -1
- package/dist/frontend-ssr/assets/{FolderNode-kmilhDjO.js → FolderNode-D9kgJG9d.js} +1 -1
- package/dist/frontend-ssr/assets/{HiAiEditor-CUOJmKzT.js → HiAiEditor-DOd2MXjD.js} +5 -5
- package/dist/frontend-ssr/assets/{SettingsDialog-BjJIiVLc.js → SettingsDialog-CIVbMKmf.js} +12 -12
- package/dist/frontend-ssr/assets/{ShareDialog-C9C-XTm4.js → ShareDialog-D2UNUbF7.js} +19 -6
- package/dist/frontend-ssr/assets/{Sidebar-C2sUfGNk.js → Sidebar-Bb-k2R-Z.js} +13 -12
- package/dist/frontend-ssr/assets/{TagCreateDialog-DUPMitlL.js → TagCreateDialog-6Gk7L3D-.js} +3 -3
- package/dist/frontend-ssr/assets/{attachments-Cj3fQyUp.js → attachments-BdkOp8ha.js} +5 -4
- package/dist/frontend-ssr/assets/{auth-client-x26kqY8Z.js → auth-client-CojKIzqy.js} +13 -13
- package/dist/frontend-ssr/assets/{confirm-dialog-XuyaL8sr.js → confirm-dialog-B9MVS_bF.js} +4 -4
- package/dist/frontend-ssr/assets/{db-CnxeO66n.js → db-BhwJPEkn.js} +1 -1
- package/dist/frontend-ssr/assets/{dialog-BOV1u6zP.js → dialog-1SB5neow.js} +8 -8
- package/dist/frontend-ssr/assets/{dropdown-menu-Dn_vQq9b.js → dropdown-menu-DqoOkdqB.js} +12 -12
- package/dist/frontend-ssr/assets/{floating-layer-anchor-BIAu-252.js → floating-layer-anchor-BoiiIEiK.js} +71 -71
- package/dist/frontend-ssr/assets/{identity-B3uHoDtf.js → identity-DcMMBKWg.js} +1 -1
- package/dist/frontend-ssr/assets/{input-DezGsU3y.js → input-Df-QP3Km.js} +2 -2
- package/dist/frontend-ssr/assets/{label-Bj8-TfFN.js → label-CbUOUz6L.js} +2 -2
- package/dist/frontend-ssr/assets/{select-value-DBhbkNcc.js → select-value-CXEDWrZg.js} +18 -18
- package/dist/frontend-ssr/assets/{settings-Bk5Hk9Vq.js → settings-Mp8EuFSn.js} +3 -21
- package/dist/frontend-ssr/assets/{textarea-Dev-qSEc.js → textarea-CHh8NuSS.js} +2 -2
- package/dist/frontend-ssr/assets/{utils-DtlPPXpJ.js → utils-DtX0ta7y.js} +1 -1
- package/dist/frontend-ssr/components/category-dialog.js +1 -1
- package/dist/frontend-ssr/components/create-snapshot-dialog.js +1 -1
- package/dist/frontend-ssr/components/delete-dialog.js +1 -1
- package/dist/frontend-ssr/components/editor/compact-editor.js +1 -1
- package/dist/frontend-ssr/components/editor/document-editor.js +1 -1
- package/dist/frontend-ssr/components/folder-node.js +1 -1
- package/dist/frontend-ssr/components/save-as-dialog.js +3 -3
- package/dist/frontend-ssr/components/settings.js +1 -1
- package/dist/frontend-ssr/components/share-dialog.js +1 -1
- package/dist/frontend-ssr/components/sidebar.js +1 -1
- package/dist/frontend-ssr/components/tag-create-dialog.js +1 -1
- package/dist/frontend-ssr/components/version-history.js +2 -2
- package/dist/frontend-ssr/dashboard.js +31 -29
- package/dist/frontend-ssr/offline/identity.js +1 -1
- package/dist/frontend-ssr/search.js +2 -2
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2 -2
- package/dist/lifecycle-persistent.d.ts +1 -1
- package/dist/lifecycle-runtime.js +52659 -338
- package/dist/mcp-cli.js +1056 -0
- package/dist/mcp-server.d.ts +39 -0
- package/dist/mcp-server.js +1053 -0
- package/dist/storage-quota.d.ts +5 -1
- package/dist/types.d.ts +7 -0
- package/dist/workspace.d.ts +11 -2
- package/dist/workspace.js +82 -10
- package/package.json +7 -13
- package/packages/cli/src/index.ts +1 -1
- package/packages/db/src/client.ts +56 -5
- package/packages/db/src/schema.ts +192 -1
- package/packages/db/src/with-tenant.ts +20 -2
- package/server.json +2 -2
- package/dist/frontend/ShareDialog-2Mty7hm4.js +0 -258
- package/packages/mcp-server/src/capabilities.ts +0 -189
- package/packages/mcp-server/src/client.ts +0 -225
- package/packages/mcp-server/src/index.ts +0 -8
- package/packages/mcp-server/src/server.ts +0 -87
- package/packages/mcp-server/src/tools/create-document.ts +0 -34
- package/packages/mcp-server/src/tools/create-folder.ts +0 -31
- package/packages/mcp-server/src/tools/create-snapshot.ts +0 -27
- package/packages/mcp-server/src/tools/export-document.ts +0 -22
- package/packages/mcp-server/src/tools/get-document.ts +0 -22
- package/packages/mcp-server/src/tools/list-documents.ts +0 -34
- package/packages/mcp-server/src/tools/list-folders.ts +0 -26
- package/packages/mcp-server/src/tools/search.ts +0 -39
- package/packages/mcp-server/src/tools/update-document.ts +0 -38
- package/packages/mcp-server/src/tools/version-history.ts +0 -27
- package/packages/mcp-server/src/types.ts +0 -126
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import { $n as e, Ar as t, Br as n, Dr as r, Fr as i, Hr as a, Ir as o, Lr as s, Mr as c, Nr as l, Or as u, Pr as d, Rr as f, Ur as p, Vr as ee, Zn as m, jr as h, kr as g, or as _, zr as v } from "./messages-DIovIZrK.js";
|
|
2
|
-
import { a as y } from "./route-context-DYQlUfzL.js";
|
|
3
|
-
import { a as b, i as x, n as te, r as S, t as ne } from "./select-value-JCAp2PmU.js";
|
|
4
|
-
import { n as C } from "./share-D7JtkC85.js";
|
|
5
|
-
import { h as w, u as T } from "./keyboard.svelte-CApmX0vl.js";
|
|
6
|
-
import { t as E } from "./clipboard-Cgzxc0_R.js";
|
|
7
|
-
import "svelte/internal/disclose-version";
|
|
8
|
-
import * as D from "svelte/internal/client";
|
|
9
|
-
//#region src/lib/components/ShareDialog.svelte
|
|
10
|
-
var re = D.from_html("<label class=\"flex items-start gap-2 text-xs text-muted-foreground\"><input type=\"checkbox\" class=\"mt-0.5\"/> Allow anyone with the password to view. Commenting and editing still require an invited account.</label>"), ie = D.from_html("<input type=\"password\" class=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"/> <!>", 1), ae = D.from_html("<button> </button>"), oe = D.from_html("<!> <!> <!>", 1), se = D.from_html("<!> <!>", 1), ce = D.from_html("<span class=\"inline-flex items-center gap-1 rounded-md bg-secondary px-2 py-0.5 text-xs\"> <button class=\"text-muted-foreground hover:text-foreground\">×</button></span>"), le = D.from_html("<div class=\"flex flex-wrap gap-1.5\"></div>"), ue = D.from_html("<div class=\"space-y-2\"><span class=\"text-sm font-medium\"> </span> <div class=\"flex gap-2\"><input type=\"email\" placeholder=\"guest@email.com\" class=\"flex h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"/> <!> <button class=\"rounded-md border border-border px-3 py-1.5 text-sm font-medium hover:bg-accent\"> </button></div> <!></div>"), de = D.from_html("<p class=\"text-xs text-destructive\"> </p>"), fe = D.from_html("<div class=\"space-y-4\"><div class=\"grid grid-cols-2 gap-2 rounded-lg bg-muted p-1\" aria-label=\"Share access mode\"><button type=\"button\">Public link</button> <button type=\"button\">Specific people</button></div> <p class=\"rounded-md border border-border bg-muted/40 p-3 text-xs text-muted-foreground\"> </p> <div class=\"flex items-center justify-between\"><span class=\"text-sm font-medium\"> </span> <button role=\"switch\"><span></span></button></div> <!> <div class=\"space-y-2\"><span class=\"text-sm font-medium\"> </span> <div class=\"flex gap-2\"></div></div> <!> <!> <button class=\"w-full rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"> </button></div>"), O = D.from_html("<div class=\"space-y-4\"><p class=\"text-sm text-muted-foreground\"> </p> <div data-share-created-url=\"\" class=\"flex min-w-0 flex-col gap-2 sm:flex-row sm:items-center\"><code class=\"min-w-0 flex-1 break-all rounded-md bg-muted px-3 py-2 text-sm\"> </code> <button data-share-copy-action=\"\" class=\"w-full shrink-0 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 sm:w-auto\"> </button></div> <button class=\"w-full rounded-md border border-border px-4 py-2 text-sm font-medium hover:bg-accent\"> </button></div>"), k = D.from_html("<div class=\"fixed inset-0 layer-modal z-[100] flex items-center justify-center\"><button class=\"absolute inset-0 z-[100] bg-black/50\"></button> <div class=\"relative z-[101] w-full max-w-md rounded-lg border border-border bg-background p-6 shadow-lg\" role=\"dialog\" aria-modal=\"true\"><div class=\"mb-4 flex items-center justify-between\"><h2 class=\"text-lg font-semibold\"> </h2> <button class=\"rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-foreground\">✕</button></div> <!></div></div>");
|
|
11
|
-
function A(A, j) {
|
|
12
|
-
D.push(j, !0);
|
|
13
|
-
let M = D.prop(j, "open", 15, !1), N = D.prop(j, "documentId", 3, ""), P = D.prop(j, "documentTitle", 3, ""), F = D.prop(j, "folderId", 3, ""), I = D.prop(j, "folderName", 3, ""), L = D.prop(j, "categoryId", 3, ""), R = D.prop(j, "categoryName", 3, ""), z = D.state(!1), B = D.state("public"), V = D.state(!1), H = D.state(""), U = D.state("7d"), W = D.state(""), G = D.state("viewer"), K = D.state(D.proxy([])), q = D.state(""), J = D.state(!1), Y = D.state(!1), X = D.state(""), pe = y();
|
|
14
|
-
D.user_effect(() => (T({
|
|
15
|
-
id: "share-dialog-escape",
|
|
16
|
-
keys: "escape",
|
|
17
|
-
description: "Close share dialog",
|
|
18
|
-
scope: "dialog",
|
|
19
|
-
enabled: M(),
|
|
20
|
-
overrideInput: !0,
|
|
21
|
-
handler: () => {
|
|
22
|
-
M() && Q();
|
|
23
|
-
}
|
|
24
|
-
}), () => {
|
|
25
|
-
w("share-dialog-escape");
|
|
26
|
-
}));
|
|
27
|
-
function Z() {
|
|
28
|
-
let e = D.get(W).trim();
|
|
29
|
-
e?.includes("@") && !D.get(K).some((t) => t.email === e.toLowerCase()) && (D.set(K, [...D.get(K), {
|
|
30
|
-
email: e.toLowerCase(),
|
|
31
|
-
role: D.get(G)
|
|
32
|
-
}], !0), D.set(W, ""));
|
|
33
|
-
}
|
|
34
|
-
function me(e) {
|
|
35
|
-
D.set(K, D.get(K).filter((t) => t.email !== e), !0);
|
|
36
|
-
}
|
|
37
|
-
async function he() {
|
|
38
|
-
D.set(Y, !0), D.set(X, "");
|
|
39
|
-
try {
|
|
40
|
-
let e = await C({
|
|
41
|
-
documentId: N() || void 0,
|
|
42
|
-
folderId: F() || void 0,
|
|
43
|
-
categoryId: L() || void 0,
|
|
44
|
-
password: D.get(z) ? D.get(H) : void 0,
|
|
45
|
-
expiresIn: D.get(U),
|
|
46
|
-
accessMode: D.get(B),
|
|
47
|
-
allowPasswordFallback: D.get(B) === "restricted" && D.get(z) ? D.get(V) : void 0,
|
|
48
|
-
guests: D.get(B) === "restricted" ? D.get(K) : void 0
|
|
49
|
-
}, pe.fetch);
|
|
50
|
-
D.set(q, `${window.location.origin}/s/${e.token}`), j.onCreated?.({
|
|
51
|
-
token: e.token,
|
|
52
|
-
url: D.get(q),
|
|
53
|
-
accessMode: D.get(B)
|
|
54
|
-
});
|
|
55
|
-
} catch (e) {
|
|
56
|
-
D.set(X, e instanceof Error ? e.message : _(), !0), console.error("ShareDialog: createShareLink failed", e);
|
|
57
|
-
} finally {
|
|
58
|
-
D.set(Y, !1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
async function ge() {
|
|
62
|
-
D.get(q) && (await E(D.get(q)), D.set(J, !0), setTimeout(() => {
|
|
63
|
-
D.set(J, !1);
|
|
64
|
-
}, 2e3));
|
|
65
|
-
}
|
|
66
|
-
function Q() {
|
|
67
|
-
M(!1), D.set(q, ""), D.set(z, !1), D.set(B, "public"), D.set(V, !1), D.set(H, ""), D.set(U, "7d"), D.set(K, [], !0), D.set(X, "");
|
|
68
|
-
}
|
|
69
|
-
var $ = D.comment(), _e = D.first_child($), ve = (_) => {
|
|
70
|
-
var y = k(), C = D.child(y), w = D.sibling(C, 2), T = D.child(w), E = D.child(T), A = D.child(E);
|
|
71
|
-
D.reset(E);
|
|
72
|
-
var j = D.sibling(E, 2);
|
|
73
|
-
D.reset(T);
|
|
74
|
-
var M = D.sibling(T, 2), N = (e) => {
|
|
75
|
-
var r = fe(), u = D.child(r), p = D.child(u), m = D.sibling(p, 2);
|
|
76
|
-
D.reset(u);
|
|
77
|
-
var g = D.sibling(u, 2), _ = D.child(g, !0);
|
|
78
|
-
D.reset(g);
|
|
79
|
-
var y = D.sibling(g, 2), C = D.child(y), w = D.child(C, !0);
|
|
80
|
-
D.reset(C);
|
|
81
|
-
var T = D.sibling(C, 2), E = D.child(T);
|
|
82
|
-
D.reset(T), D.reset(y);
|
|
83
|
-
var O = D.sibling(y, 2), k = (e) => {
|
|
84
|
-
var t = ie(), n = D.first_child(t);
|
|
85
|
-
D.remove_input_defaults(n);
|
|
86
|
-
var r = D.sibling(n, 2), i = (e) => {
|
|
87
|
-
var t = re(), n = D.child(t);
|
|
88
|
-
D.remove_input_defaults(n), D.next(), D.reset(t), D.bind_checked(n, () => D.get(V), (e) => D.set(V, e)), D.append(e, t);
|
|
89
|
-
};
|
|
90
|
-
D.if(r, (e) => {
|
|
91
|
-
D.get(B) === "restricted" && e(i);
|
|
92
|
-
}), D.template_effect((e) => D.set_attribute(n, "placeholder", e), [() => f()]), D.bind_value(n, () => D.get(H), (e) => D.set(H, e)), D.append(e, t);
|
|
93
|
-
};
|
|
94
|
-
D.if(O, (e) => {
|
|
95
|
-
D.get(z) && e(k);
|
|
96
|
-
});
|
|
97
|
-
var A = D.sibling(O, 2), j = D.child(A), M = D.child(j, !0);
|
|
98
|
-
D.reset(j);
|
|
99
|
-
var N = D.sibling(j, 2);
|
|
100
|
-
D.each(N, 21, () => [
|
|
101
|
-
["1h", i()],
|
|
102
|
-
["1d", d()],
|
|
103
|
-
["7d", l()],
|
|
104
|
-
["30d", c()],
|
|
105
|
-
["never", o()]
|
|
106
|
-
], D.index, (e, t) => {
|
|
107
|
-
var n = D.derived(() => D.to_array(D.get(t), 2));
|
|
108
|
-
let r = () => D.get(n)[0], i = () => D.get(n)[1];
|
|
109
|
-
var a = ae(), o = D.child(a, !0);
|
|
110
|
-
D.reset(a), D.template_effect(() => {
|
|
111
|
-
D.set_class(a, 1, `rounded-md border px-2.5 py-1 text-xs font-medium transition-colors
|
|
112
|
-
${D.get(U) === r() ? "border-primary bg-primary text-primary-foreground" : "border-border text-muted-foreground hover:bg-accent"}`), D.set_text(o, i());
|
|
113
|
-
}), D.delegated("click", a, () => {
|
|
114
|
-
D.set(U, r(), !0);
|
|
115
|
-
}), D.append(e, a);
|
|
116
|
-
}), D.reset(N), D.reset(A);
|
|
117
|
-
var P = D.sibling(A, 2), F = (e) => {
|
|
118
|
-
var n = ue(), r = D.child(n), i = D.child(r, !0);
|
|
119
|
-
D.reset(r);
|
|
120
|
-
var a = D.sibling(r, 2), o = D.child(a);
|
|
121
|
-
D.remove_input_defaults(o);
|
|
122
|
-
var s = D.sibling(o, 2);
|
|
123
|
-
b(s, {
|
|
124
|
-
type: "single",
|
|
125
|
-
get value() {
|
|
126
|
-
return D.get(G);
|
|
127
|
-
},
|
|
128
|
-
onValueChange: (e) => {
|
|
129
|
-
(e === "viewer" || e === "commenter" || e === "editor") && D.set(G, e, !0);
|
|
130
|
-
},
|
|
131
|
-
children: (e, t) => {
|
|
132
|
-
var n = se(), r = D.first_child(n);
|
|
133
|
-
te(r, {
|
|
134
|
-
class: "h-9 w-32 justify-between px-3 text-sm",
|
|
135
|
-
"aria-label": "Guest role",
|
|
136
|
-
children: (e, t) => {
|
|
137
|
-
ne(e, {
|
|
138
|
-
placeholder: "Role",
|
|
139
|
-
children: (e, t) => {
|
|
140
|
-
D.next();
|
|
141
|
-
var n = D.text();
|
|
142
|
-
D.template_effect(() => D.set_text(n, D.get(G) === "viewer" ? "Viewer" : D.get(G) === "commenter" ? "Commenter" : "Editor")), D.append(e, n);
|
|
143
|
-
},
|
|
144
|
-
$$slots: { default: !0 }
|
|
145
|
-
});
|
|
146
|
-
},
|
|
147
|
-
$$slots: { default: !0 }
|
|
148
|
-
}), x(D.sibling(r, 2), {
|
|
149
|
-
children: (e, t) => {
|
|
150
|
-
var n = oe(), r = D.first_child(n);
|
|
151
|
-
S(r, {
|
|
152
|
-
value: "viewer",
|
|
153
|
-
children: (e, t) => {
|
|
154
|
-
D.next();
|
|
155
|
-
var n = D.text("Viewer");
|
|
156
|
-
D.append(e, n);
|
|
157
|
-
},
|
|
158
|
-
$$slots: { default: !0 }
|
|
159
|
-
});
|
|
160
|
-
var i = D.sibling(r, 2);
|
|
161
|
-
S(i, {
|
|
162
|
-
value: "commenter",
|
|
163
|
-
children: (e, t) => {
|
|
164
|
-
D.next();
|
|
165
|
-
var n = D.text("Commenter");
|
|
166
|
-
D.append(e, n);
|
|
167
|
-
},
|
|
168
|
-
$$slots: { default: !0 }
|
|
169
|
-
}), S(D.sibling(i, 2), {
|
|
170
|
-
value: "editor",
|
|
171
|
-
children: (e, t) => {
|
|
172
|
-
D.next();
|
|
173
|
-
var n = D.text("Editor");
|
|
174
|
-
D.append(e, n);
|
|
175
|
-
},
|
|
176
|
-
$$slots: { default: !0 }
|
|
177
|
-
}), D.append(e, n);
|
|
178
|
-
},
|
|
179
|
-
$$slots: { default: !0 }
|
|
180
|
-
}), D.append(e, n);
|
|
181
|
-
},
|
|
182
|
-
$$slots: { default: !0 }
|
|
183
|
-
});
|
|
184
|
-
var c = D.sibling(s, 2), l = D.child(c, !0);
|
|
185
|
-
D.reset(c), D.reset(a);
|
|
186
|
-
var u = D.sibling(a, 2), d = (e) => {
|
|
187
|
-
var t = le();
|
|
188
|
-
D.each(t, 21, () => D.get(K), D.index, (e, t) => {
|
|
189
|
-
var n = ce(), r = D.child(n), i = D.sibling(r);
|
|
190
|
-
D.reset(n), D.template_effect(() => D.set_text(r, `${D.get(t).email ?? ""} · ${D.get(t).role ?? ""} `)), D.delegated("click", i, () => me(D.get(t).email)), D.append(e, n);
|
|
191
|
-
}), D.reset(t), D.append(e, t);
|
|
192
|
-
};
|
|
193
|
-
D.if(u, (e) => {
|
|
194
|
-
D.get(K).length > 0 && e(d);
|
|
195
|
-
}), D.reset(n), D.template_effect((e, t) => {
|
|
196
|
-
D.set_text(i, e), D.set_text(l, t);
|
|
197
|
-
}, [() => h(), () => t()]), D.delegated("keydown", o, (e) => {
|
|
198
|
-
e.key === "Enter" && (e.preventDefault(), Z());
|
|
199
|
-
}), D.bind_value(o, () => D.get(W), (e) => D.set(W, e)), D.delegated("click", c, Z), D.append(e, n);
|
|
200
|
-
};
|
|
201
|
-
D.if(P, (e) => {
|
|
202
|
-
D.get(B) === "restricted" && e(F);
|
|
203
|
-
});
|
|
204
|
-
var I = D.sibling(P, 2), L = (e) => {
|
|
205
|
-
var t = de(), n = D.child(t, !0);
|
|
206
|
-
D.reset(t), D.template_effect(() => D.set_text(n, D.get(X))), D.append(e, t);
|
|
207
|
-
};
|
|
208
|
-
D.if(I, (e) => {
|
|
209
|
-
D.get(X) && e(L);
|
|
210
|
-
});
|
|
211
|
-
var R = D.sibling(I, 2), q = D.child(R, !0);
|
|
212
|
-
D.reset(R), D.reset(r), D.template_effect((e, t, n, r) => {
|
|
213
|
-
D.set_class(p, 1, `rounded-md px-3 py-2 text-sm font-medium ${D.get(B) === "public" ? "bg-background shadow-sm" : "text-muted-foreground"}`), D.set_class(m, 1, `rounded-md px-3 py-2 text-sm font-medium ${D.get(B) === "restricted" ? "bg-background shadow-sm" : "text-muted-foreground"}`), D.set_text(_, D.get(B) === "public" ? "Anyone with this link can view the document. The link may be forwarded." : "Only invited email addresses can comment or edit. A password fallback, when enabled, grants view-only access."), D.set_text(w, e), D.set_class(T, 1, `relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${D.get(z) ? "bg-primary" : "bg-input"}`), D.set_attribute(T, "aria-checked", D.get(z)), D.set_attribute(T, "aria-label", t), D.set_class(E, 1, `inline-block h-4 w-4 rounded-full bg-white shadow transition-transform ${D.get(z) ? "translate-x-4" : "translate-x-0.5"}`), D.set_text(M, n), R.disabled = D.get(Y) || D.get(B) === "restricted" && D.get(K).length === 0 || D.get(z) && D.get(H).length < 8, D.set_text(q, r);
|
|
214
|
-
}, [
|
|
215
|
-
() => n(),
|
|
216
|
-
() => v(),
|
|
217
|
-
() => s(),
|
|
218
|
-
() => D.get(Y) ? ee() : a()
|
|
219
|
-
]), D.delegated("click", p, () => {
|
|
220
|
-
D.set(B, "public"), D.set(K, [], !0), D.set(V, !1);
|
|
221
|
-
}), D.delegated("click", m, () => {
|
|
222
|
-
D.set(B, "restricted");
|
|
223
|
-
}), D.delegated("click", T, () => {
|
|
224
|
-
D.set(z, !D.get(z));
|
|
225
|
-
}), D.delegated("click", R, he), D.append(e, r);
|
|
226
|
-
}, F = (e) => {
|
|
227
|
-
var t = O(), n = D.child(t), i = D.child(n, !0);
|
|
228
|
-
D.reset(n);
|
|
229
|
-
var a = D.sibling(n, 2), o = D.child(a), s = D.child(o, !0);
|
|
230
|
-
D.reset(o);
|
|
231
|
-
var c = D.sibling(o, 2), l = D.child(c, !0);
|
|
232
|
-
D.reset(c), D.reset(a);
|
|
233
|
-
var d = D.sibling(a, 2), f = D.child(d, !0);
|
|
234
|
-
D.reset(d), D.reset(t), D.template_effect((e, t, n) => {
|
|
235
|
-
D.set_text(i, e), D.set_text(s, D.get(q)), D.set_text(l, t), D.set_text(f, n);
|
|
236
|
-
}, [
|
|
237
|
-
() => D.get(B) === "restricted" ? "Invitations were queued for delivery. This is not a public link." : r(),
|
|
238
|
-
() => D.get(J) ? u() : g(),
|
|
239
|
-
() => m()
|
|
240
|
-
]), D.delegated("click", c, ge), D.delegated("click", d, Q), D.append(e, t);
|
|
241
|
-
};
|
|
242
|
-
D.if(M, (e) => {
|
|
243
|
-
D.get(q) ? e(F, -1) : e(N);
|
|
244
|
-
}), D.reset(w), D.reset(y), D.template_effect((e, t, n) => {
|
|
245
|
-
D.set_attribute(C, "aria-label", e), D.set_text(A, `${t ?? ""} "${(R() || I() || P()) ?? ""}"`), D.set_attribute(j, "aria-label", n);
|
|
246
|
-
}, [
|
|
247
|
-
() => e(),
|
|
248
|
-
() => p(),
|
|
249
|
-
() => e()
|
|
250
|
-
]), D.delegated("click", C, Q), D.delegated("click", j, Q), D.append(_, y);
|
|
251
|
-
};
|
|
252
|
-
D.if(_e, (e) => {
|
|
253
|
-
M() && e(ve);
|
|
254
|
-
}), D.append(A, $), D.pop();
|
|
255
|
-
}
|
|
256
|
-
D.delegate(["click", "keydown"]);
|
|
257
|
-
//#endregion
|
|
258
|
-
export { A as t };
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { HiaiDocsClient } from './client.js';
|
|
5
|
-
|
|
6
|
-
export const capabilityCatalog = {
|
|
7
|
-
tools: [
|
|
8
|
-
'search_documents',
|
|
9
|
-
'get_document',
|
|
10
|
-
'create_document',
|
|
11
|
-
'update_document',
|
|
12
|
-
'list_documents',
|
|
13
|
-
'list_folders',
|
|
14
|
-
'create_folder',
|
|
15
|
-
'create_snapshot',
|
|
16
|
-
'get_version_history',
|
|
17
|
-
'export_document',
|
|
18
|
-
'list_categories',
|
|
19
|
-
'create_category',
|
|
20
|
-
'list_tags',
|
|
21
|
-
'get_related_documents',
|
|
22
|
-
'search_knowledge_graph',
|
|
23
|
-
'get_document_index_status',
|
|
24
|
-
'refresh_document_index',
|
|
25
|
-
] as const,
|
|
26
|
-
prompts: ['organize_workspace', 'research_workspace'] as const,
|
|
27
|
-
resources: [
|
|
28
|
-
'docsmint://guide/editor',
|
|
29
|
-
'docsmint://guide/search',
|
|
30
|
-
'docsmint://workspace/catalog',
|
|
31
|
-
] as const,
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
type TextResult = { content: Array<{ type: 'text'; text: string }> };
|
|
35
|
-
|
|
36
|
-
function jsonResult(value: unknown): TextResult {
|
|
37
|
-
return { content: [{ type: 'text', text: JSON.stringify(value, null, 2) }] };
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function registerExtendedCapabilities(server: McpServer, client: HiaiDocsClient): void {
|
|
41
|
-
server.registerTool(
|
|
42
|
-
'list_categories',
|
|
43
|
-
{
|
|
44
|
-
description:
|
|
45
|
-
'List categories visible to the API key. Category keys receive only their bound category.',
|
|
46
|
-
inputSchema: z.object({}),
|
|
47
|
-
},
|
|
48
|
-
async () => jsonResult(await client.listCategories())
|
|
49
|
-
);
|
|
50
|
-
server.registerTool(
|
|
51
|
-
'create_category',
|
|
52
|
-
{
|
|
53
|
-
description:
|
|
54
|
-
'Create a category. Requires a workspace key with write access; category keys cannot mutate categories.',
|
|
55
|
-
inputSchema: z.object({
|
|
56
|
-
name: z.string().min(1),
|
|
57
|
-
description: z.string().optional(),
|
|
58
|
-
}),
|
|
59
|
-
},
|
|
60
|
-
async (input) => jsonResult(await client.createCategory(input))
|
|
61
|
-
);
|
|
62
|
-
server.registerTool(
|
|
63
|
-
'list_tags',
|
|
64
|
-
{
|
|
65
|
-
description: 'List tags visible in the workspace or bound category.',
|
|
66
|
-
inputSchema: z.object({}),
|
|
67
|
-
},
|
|
68
|
-
async () => jsonResult(await client.listTags())
|
|
69
|
-
);
|
|
70
|
-
server.registerTool(
|
|
71
|
-
'get_related_documents',
|
|
72
|
-
{
|
|
73
|
-
description: 'Traverse the knowledge graph from one authorized document.',
|
|
74
|
-
inputSchema: z.object({
|
|
75
|
-
documentId: z.string().min(1),
|
|
76
|
-
limit: z.number().int().min(1).max(50).optional(),
|
|
77
|
-
}),
|
|
78
|
-
},
|
|
79
|
-
async ({ documentId, limit }) => jsonResult(await client.getRelatedDocuments(documentId, limit))
|
|
80
|
-
);
|
|
81
|
-
server.registerTool(
|
|
82
|
-
'search_knowledge_graph',
|
|
83
|
-
{
|
|
84
|
-
description:
|
|
85
|
-
'Search connected knowledge using authorized seed documents. Category keys may use only documents in their category.',
|
|
86
|
-
inputSchema: z.object({
|
|
87
|
-
query: z.string().min(1).max(1000),
|
|
88
|
-
docIds: z.array(z.string().min(1)).min(1),
|
|
89
|
-
limit: z.number().int().min(1).max(50).optional(),
|
|
90
|
-
}),
|
|
91
|
-
},
|
|
92
|
-
async (input) => jsonResult(await client.searchGraph(input))
|
|
93
|
-
);
|
|
94
|
-
server.registerTool(
|
|
95
|
-
'get_document_index_status',
|
|
96
|
-
{
|
|
97
|
-
description: 'Read the current indexing and knowledge-pipeline status of a document.',
|
|
98
|
-
inputSchema: z.object({ documentId: z.string().min(1) }),
|
|
99
|
-
},
|
|
100
|
-
async ({ documentId }) => jsonResult(await client.getDocumentIndexStatus(documentId))
|
|
101
|
-
);
|
|
102
|
-
server.registerTool(
|
|
103
|
-
'refresh_document_index',
|
|
104
|
-
{
|
|
105
|
-
description: 'Request reindexing after a document or metadata change. Requires write access.',
|
|
106
|
-
inputSchema: z.object({ documentId: z.string().min(1) }),
|
|
107
|
-
},
|
|
108
|
-
async ({ documentId }) => jsonResult(await client.refreshDocumentIndex(documentId))
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
server.registerPrompt(
|
|
112
|
-
'organize_workspace',
|
|
113
|
-
{
|
|
114
|
-
description: 'Plan safe document organization using DocsMint categories and folders.',
|
|
115
|
-
argsSchema: z.object({
|
|
116
|
-
objective: z.string(),
|
|
117
|
-
language: z.string().optional(),
|
|
118
|
-
}),
|
|
119
|
-
},
|
|
120
|
-
({ objective, language }) => ({
|
|
121
|
-
messages: [
|
|
122
|
-
{
|
|
123
|
-
role: 'user',
|
|
124
|
-
content: {
|
|
125
|
-
type: 'text',
|
|
126
|
-
text: `Organize this DocsMint workspace for: ${objective}. Work in ${language ?? 'the document language'}. Inspect categories, folders, tags, and documents before proposing or applying changes. Preserve document content and obey the API key scope.`,
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
})
|
|
131
|
-
);
|
|
132
|
-
server.registerPrompt(
|
|
133
|
-
'research_workspace',
|
|
134
|
-
{
|
|
135
|
-
description:
|
|
136
|
-
'Research a question with hybrid search and GraphRAG while citing DocsMint document IDs.',
|
|
137
|
-
argsSchema: z.object({
|
|
138
|
-
question: z.string(),
|
|
139
|
-
language: z.string().optional(),
|
|
140
|
-
}),
|
|
141
|
-
},
|
|
142
|
-
({ question, language }) => ({
|
|
143
|
-
messages: [
|
|
144
|
-
{
|
|
145
|
-
role: 'user',
|
|
146
|
-
content: {
|
|
147
|
-
type: 'text',
|
|
148
|
-
text: `Answer this question from DocsMint: ${question}. Respond in ${language ?? 'the question language'}. Start with hybrid search, use graph traversal only from authorized result documents, and cite document IDs. Distinguish retrieved facts from inference.`,
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
],
|
|
152
|
-
})
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
server.registerResource('editor-guide', 'docsmint://guide/editor', {}, async (uri) => ({
|
|
156
|
-
contents: [
|
|
157
|
-
{
|
|
158
|
-
uri: uri.href,
|
|
159
|
-
mimeType: 'text/markdown',
|
|
160
|
-
text: '# DocsMint editing rules\n\nRead a document before updating it. Preserve its language, title intent, TipTap/Markdown structure, category, folder, and tags unless the user explicitly requests a change. After content changes, verify index status and request refresh only when needed.',
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
}));
|
|
164
|
-
server.registerResource('search-guide', 'docsmint://guide/search', {}, async (uri) => ({
|
|
165
|
-
contents: [
|
|
166
|
-
{
|
|
167
|
-
uri: uri.href,
|
|
168
|
-
mimeType: 'text/markdown',
|
|
169
|
-
text: '# DocsMint retrieval rules\n\nUse search_documents for normal retrieval. Use get_related_documents or search_knowledge_graph only with document IDs already authorized by the active API key. Keep multilingual queries in their original language and cite document IDs in answers.',
|
|
170
|
-
},
|
|
171
|
-
],
|
|
172
|
-
}));
|
|
173
|
-
server.registerResource('workspace-catalog', 'docsmint://workspace/catalog', {}, async (uri) => {
|
|
174
|
-
const [categories, folders, tags] = await Promise.all([
|
|
175
|
-
client.listCategories(),
|
|
176
|
-
client.listFolders({}),
|
|
177
|
-
client.listTags(),
|
|
178
|
-
]);
|
|
179
|
-
return {
|
|
180
|
-
contents: [
|
|
181
|
-
{
|
|
182
|
-
uri: uri.href,
|
|
183
|
-
mimeType: 'application/json',
|
|
184
|
-
text: JSON.stringify({ categories, folders, tags }, null, 2),
|
|
185
|
-
},
|
|
186
|
-
],
|
|
187
|
-
};
|
|
188
|
-
});
|
|
189
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* REST client for hiai-docs.
|
|
3
|
-
*
|
|
4
|
-
* Reads configuration from environment:
|
|
5
|
-
* HIAI_DOCS_URL — base URL (default: http://localhost:50700)
|
|
6
|
-
* HIAI_DOCS_API_KEY — bearer token for the API
|
|
7
|
-
*
|
|
8
|
-
* Bun-native. Uses global `fetch`. Throws on non-2xx responses with the
|
|
9
|
-
* error message extracted from the response body when possible.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { ExportResponse } from "./types.js";
|
|
13
|
-
|
|
14
|
-
const DEFAULT_BASE_URL = "http://localhost:50700";
|
|
15
|
-
|
|
16
|
-
function readConfig() {
|
|
17
|
-
const baseUrl = (process.env.HIAI_DOCS_URL ?? DEFAULT_BASE_URL).replace(
|
|
18
|
-
/\/+$/,
|
|
19
|
-
"",
|
|
20
|
-
);
|
|
21
|
-
const apiKey = process.env.HIAI_DOCS_API_KEY ?? "";
|
|
22
|
-
return { baseUrl, apiKey };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export class HiaiDocsError extends Error {
|
|
26
|
-
constructor(
|
|
27
|
-
message: string,
|
|
28
|
-
readonly status: number,
|
|
29
|
-
readonly body: unknown,
|
|
30
|
-
) {
|
|
31
|
-
super(message);
|
|
32
|
-
this.name = "HiaiDocsError";
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
type QueryValue = string | number | boolean | string[] | undefined;
|
|
37
|
-
|
|
38
|
-
async function request<T>(
|
|
39
|
-
method: string,
|
|
40
|
-
path: string,
|
|
41
|
-
options: { query?: Record<string, QueryValue>; body?: unknown } = {},
|
|
42
|
-
): Promise<T> {
|
|
43
|
-
const { baseUrl, apiKey } = readConfig();
|
|
44
|
-
|
|
45
|
-
const url = new URL(path.startsWith("/") ? path : `/${path}`, `${baseUrl}/`);
|
|
46
|
-
if (options.query) {
|
|
47
|
-
for (const [key, value] of Object.entries(options.query)) {
|
|
48
|
-
if (value === undefined) continue;
|
|
49
|
-
if (Array.isArray(value)) {
|
|
50
|
-
if (value.length > 0) url.searchParams.set(key, value.join(","));
|
|
51
|
-
} else {
|
|
52
|
-
url.searchParams.set(key, String(value));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const headers: Record<string, string> = {
|
|
58
|
-
Accept: "application/json",
|
|
59
|
-
};
|
|
60
|
-
if (apiKey) {
|
|
61
|
-
headers.Authorization = `Bearer ${apiKey}`;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let body: BodyInit | undefined;
|
|
65
|
-
if (options.body !== undefined) {
|
|
66
|
-
headers["Content-Type"] = "application/json";
|
|
67
|
-
body = JSON.stringify(options.body);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const response = await fetch(url, { method, headers, body });
|
|
71
|
-
|
|
72
|
-
const contentType = response.headers.get("content-type") ?? "";
|
|
73
|
-
const isJson = contentType.includes("application/json");
|
|
74
|
-
const payload: unknown = isJson
|
|
75
|
-
? await response.json().catch(() => null)
|
|
76
|
-
: await response.text().catch(() => null);
|
|
77
|
-
|
|
78
|
-
if (!response.ok) {
|
|
79
|
-
const message =
|
|
80
|
-
(isJson && payload && typeof payload === "object" && "error" in payload
|
|
81
|
-
? String((payload as { error: unknown }).error)
|
|
82
|
-
: typeof payload === "string" && payload.length > 0
|
|
83
|
-
? payload
|
|
84
|
-
: `HTTP ${response.status} ${response.statusText}`) ||
|
|
85
|
-
`HTTP ${response.status}`;
|
|
86
|
-
throw new HiaiDocsError(message, response.status, payload);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return payload as T;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function joinId(...segments: string[]): string {
|
|
93
|
-
return segments.map((s) => encodeURIComponent(s)).join("/");
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export const client = {
|
|
97
|
-
search(params: {
|
|
98
|
-
query: string;
|
|
99
|
-
folder?: string;
|
|
100
|
-
tags?: string[];
|
|
101
|
-
limit?: number;
|
|
102
|
-
}) {
|
|
103
|
-
return request("GET", "/api/search", {
|
|
104
|
-
query: {
|
|
105
|
-
q: params.query,
|
|
106
|
-
folder: params.folder,
|
|
107
|
-
tags: params.tags,
|
|
108
|
-
limit: params.limit,
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
getDocument(id: string) {
|
|
114
|
-
return request("GET", `/api/${joinId("documents", id)}`);
|
|
115
|
-
},
|
|
116
|
-
|
|
117
|
-
createDocument(input: {
|
|
118
|
-
title: string;
|
|
119
|
-
content?: string;
|
|
120
|
-
folderId?: string | null;
|
|
121
|
-
categoryId?: string | null;
|
|
122
|
-
}) {
|
|
123
|
-
return request("POST", "/api/documents", { body: input });
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
updateDocument(
|
|
127
|
-
id: string,
|
|
128
|
-
input: {
|
|
129
|
-
title?: string;
|
|
130
|
-
content?: string;
|
|
131
|
-
folderId?: string | null;
|
|
132
|
-
categoryId?: string | null;
|
|
133
|
-
},
|
|
134
|
-
) {
|
|
135
|
-
return request("PATCH", `/api/${joinId("documents", id)}`, { body: input });
|
|
136
|
-
},
|
|
137
|
-
|
|
138
|
-
listDocuments(params: {
|
|
139
|
-
folderId?: string;
|
|
140
|
-
tag?: string;
|
|
141
|
-
page?: number;
|
|
142
|
-
limit?: number;
|
|
143
|
-
}) {
|
|
144
|
-
return request("GET", "/api/documents", { query: params });
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
listFolders(params: { parentId?: string }) {
|
|
148
|
-
return request("GET", "/api/folders", {
|
|
149
|
-
query: { parentId: params.parentId },
|
|
150
|
-
});
|
|
151
|
-
},
|
|
152
|
-
|
|
153
|
-
createFolder(input: {
|
|
154
|
-
name: string;
|
|
155
|
-
parentId?: string;
|
|
156
|
-
categoryId?: string;
|
|
157
|
-
}) {
|
|
158
|
-
return request("POST", "/api/folders", { body: input });
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
listCategories() {
|
|
162
|
-
return request("GET", "/api/categories");
|
|
163
|
-
},
|
|
164
|
-
|
|
165
|
-
createCategory(input: { name: string; description?: string }) {
|
|
166
|
-
return request("POST", "/api/categories", { body: input });
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
listTags() {
|
|
170
|
-
return request("GET", "/api/tags");
|
|
171
|
-
},
|
|
172
|
-
|
|
173
|
-
getRelatedDocuments(documentId: string, limit?: number) {
|
|
174
|
-
return request("GET", `/api/${joinId("graph", "related", documentId)}`, {
|
|
175
|
-
query: { limit },
|
|
176
|
-
});
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
searchGraph(input: { query: string; docIds: string[]; limit?: number }) {
|
|
180
|
-
return request("POST", "/api/graph/search", { body: input });
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
getDocumentIndexStatus(documentId: string) {
|
|
184
|
-
return request(
|
|
185
|
-
"GET",
|
|
186
|
-
`/api/${joinId("documents", documentId, "index-status")}`,
|
|
187
|
-
);
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
refreshDocumentIndex(documentId: string) {
|
|
191
|
-
return request(
|
|
192
|
-
"POST",
|
|
193
|
-
`/api/${joinId("documents", documentId, "index", "refresh")}`,
|
|
194
|
-
);
|
|
195
|
-
},
|
|
196
|
-
|
|
197
|
-
createSnapshot(
|
|
198
|
-
documentId: string,
|
|
199
|
-
input: { label: string; description?: string },
|
|
200
|
-
) {
|
|
201
|
-
return request(
|
|
202
|
-
"POST",
|
|
203
|
-
`/api/${joinId("documents", documentId, "versions")}`,
|
|
204
|
-
{ body: input },
|
|
205
|
-
);
|
|
206
|
-
},
|
|
207
|
-
|
|
208
|
-
getVersionHistory(documentId: string, onlySnapshots?: boolean) {
|
|
209
|
-
return request(
|
|
210
|
-
"GET",
|
|
211
|
-
`/api/${joinId("documents", documentId, "versions")}`,
|
|
212
|
-
{ query: { onlySnapshots } },
|
|
213
|
-
);
|
|
214
|
-
},
|
|
215
|
-
|
|
216
|
-
async exportDocument(id: string): Promise<ExportResponse> {
|
|
217
|
-
const markdown = await request<string>(
|
|
218
|
-
"GET",
|
|
219
|
-
`/api/${joinId("documents", id, "export")}`,
|
|
220
|
-
);
|
|
221
|
-
return { markdown };
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
export type HiaiDocsClient = typeof client;
|