dominds 1.2.5 → 1.2.7
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/agent-priming.js +2051 -0
- package/dist/apps/app-lock-file.js +228 -0
- package/dist/apps/assigned-port.js +124 -0
- package/dist/apps/enabled-apps.js +472 -7
- package/dist/apps/manifest.js +37 -0
- package/dist/apps/override-paths.js +19 -6
- package/dist/apps/problems.js +43 -0
- package/dist/apps/resolution-file.js +370 -0
- package/dist/apps/runtime.js +5 -17
- package/dist/apps/teammates.js +102 -1
- package/dist/cli/disable.js +10 -6
- package/dist/cli/enable.js +21 -19
- package/dist/cli/install.js +40 -18
- package/dist/cli/uninstall.js +6 -6
- package/dist/cli/update.js +38 -13
- package/dist/dialog.js +5 -0
- package/dist/docs/app-constitution.md +85 -18
- package/dist/docs/app-constitution.zh.md +86 -21
- package/dist/docs/dialog-system.md +1 -1
- package/dist/docs/dialog-system.zh.md +1 -1
- package/dist/docs/dominds-agent-priming.md +218 -0
- package/dist/docs/dominds-agent-priming.zh.md +196 -0
- package/dist/docs/drive-logic-context-refactor-plan.zh.md +338 -0
- package/dist/docs/keep-going.md +176 -0
- package/dist/docs/keep-going.zh.md +162 -0
- package/dist/docs/showing-by-doing.md +208 -0
- package/dist/docs/showing-by-doing.zh.md +177 -0
- package/dist/docs/team-mgmt-toolset.md +482 -0
- package/dist/docs/team-mgmt-toolset.zh.md +426 -0
- package/dist/llm/defaults.yaml +1 -1
- package/dist/llm/driver.js +4093 -0
- package/dist/llm/kernel-driver/drive.js +5 -2
- package/dist/llm/kernel-driver/flow.js +3 -0
- package/dist/minds/promptdocs.js +263 -0
- package/dist/problems.js +67 -16
- package/dist/server/api-routes.js +333 -0
- package/dist/server/prompts-routes.js +545 -0
- package/dist/server/server-core.js +4 -0
- package/dist/server/websocket-handler.js +17 -0
- package/dist/shared/team-mgmt-manual.js +120 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/showing-by-doing.js +1091 -0
- package/dist/snippets/README.en.md +3 -0
- package/dist/snippets/README.md +4 -0
- package/dist/static/assets/{_basePickBy-CF9r08iy.js → _basePickBy-BMCtwrV7.js} +3 -3
- package/dist/static/assets/{_basePickBy-CF9r08iy.js.map → _basePickBy-BMCtwrV7.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CxKv0cd4.js → _baseUniq-BuyCgJiA.js} +2 -2
- package/dist/static/assets/{_baseUniq-CxKv0cd4.js.map → _baseUniq-BuyCgJiA.js.map} +1 -1
- package/dist/static/assets/{arc-C9JyvnlB.js → arc-BDuN8lwA.js} +2 -2
- package/dist/static/assets/{arc-C9JyvnlB.js.map → arc-BDuN8lwA.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js → architectureDiagram-VXUJARFQ-C-ekqGAD.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js.map → architectureDiagram-VXUJARFQ-C-ekqGAD.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js → blockDiagram-VD42YOAC-CgQiNuuQ.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js.map → blockDiagram-VD42YOAC-CgQiNuuQ.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js → c4Diagram-YG6GDRKO-DONC39q-.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js.map → c4Diagram-YG6GDRKO-DONC39q-.js.map} +1 -1
- package/dist/static/assets/{channel-B4KzL0Kg.js → channel-CJTFwXIG.js} +2 -2
- package/dist/static/assets/{channel-B4KzL0Kg.js.map → channel-CJTFwXIG.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js → chunk-4BX2VUAB-NaIy4uLJ.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js.map → chunk-4BX2VUAB-NaIy4uLJ.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js → chunk-55IACEB6-JUKI_Ayx.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js.map → chunk-55IACEB6-JUKI_Ayx.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js → chunk-B4BG7PRW-dIswFJDn.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js.map → chunk-B4BG7PRW-dIswFJDn.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js → chunk-DI55MBZ5-DU2b_N30.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js.map → chunk-DI55MBZ5-DU2b_N30.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js → chunk-FMBD7UC4-BgExcScw.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js.map → chunk-FMBD7UC4-BgExcScw.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js → chunk-QN33PNHL-bitxyqh7.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js.map → chunk-QN33PNHL-bitxyqh7.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js → chunk-QZHKN3VN-Cor8u7DT.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js.map → chunk-QZHKN3VN-Cor8u7DT.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js → chunk-TZMSLE5B-Aceoxav_.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js.map → chunk-TZMSLE5B-Aceoxav_.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js → classDiagram-2ON5EDUG-D1Q6a8Hg.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js.map → classDiagram-2ON5EDUG-D1Q6a8Hg.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js.map → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js.map} +1 -1
- package/dist/static/assets/{clone-C-JULvnG.js → clone-MlWbv1V0.js} +2 -2
- package/dist/static/assets/{clone-C-JULvnG.js.map → clone-MlWbv1V0.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js → cose-bilkent-S5V4N54A-DWPCXSrn.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js.map → cose-bilkent-S5V4N54A-DWPCXSrn.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js → dagre-6UL2VRFP-C8ptQ9V3.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js.map → dagre-6UL2VRFP-C8ptQ9V3.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js → diagram-PSM6KHXK-Bgf1FqkE.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js.map → diagram-PSM6KHXK-Bgf1FqkE.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js → diagram-QEK2KX5R-BZ5xzofU.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js.map → diagram-QEK2KX5R-BZ5xzofU.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js → diagram-S2PKOQOG-Dwp47T9I.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js.map → diagram-S2PKOQOG-Dwp47T9I.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js → erDiagram-Q2GNP2WA-Cx4weIHl.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js.map → erDiagram-Q2GNP2WA-Cx4weIHl.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js → flowDiagram-NV44I4VS-vNUuIeRk.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js.map → flowDiagram-NV44I4VS-vNUuIeRk.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js → ganttDiagram-JELNMOA3-BEfozJAr.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js.map → ganttDiagram-JELNMOA3-BEfozJAr.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js.map → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js.map} +1 -1
- package/dist/static/assets/{graph-DwrKSIE7.js → graph-C6a6uAok.js} +3 -3
- package/dist/static/assets/{graph-DwrKSIE7.js.map → graph-C6a6uAok.js.map} +1 -1
- package/dist/static/assets/{index-HWTRvE2k.js → index-D3TQbAKh.js} +383 -59
- package/dist/static/assets/index-D3TQbAKh.js.map +1 -0
- package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js → infoDiagram-HS3SLOUP-CX0NiId3.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js.map → infoDiagram-HS3SLOUP-CX0NiId3.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js → journeyDiagram-XKPGCS4Q-C1IepPZ-.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js.map → journeyDiagram-XKPGCS4Q-C1IepPZ-.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js → kanban-definition-3W4ZIXB7-uMNX4Z1W.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js.map → kanban-definition-3W4ZIXB7-uMNX4Z1W.js.map} +1 -1
- package/dist/static/assets/{layout-D6uIxu1E.js → layout-CpE3kk5z.js} +5 -5
- package/dist/static/assets/{layout-D6uIxu1E.js.map → layout-CpE3kk5z.js.map} +1 -1
- package/dist/static/assets/{linear-CvBOGQA2.js → linear-DV8laXr9.js} +2 -2
- package/dist/static/assets/{linear-CvBOGQA2.js.map → linear-DV8laXr9.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js → mindmap-definition-VGOIOE7T-CKjgVM9S.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js.map → mindmap-definition-VGOIOE7T-CKjgVM9S.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js → pieDiagram-ADFJNKIX-BBonlNyT.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js.map → pieDiagram-ADFJNKIX-BBonlNyT.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js → quadrantDiagram-AYHSOK5B-BTI8HbBu.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js.map → quadrantDiagram-AYHSOK5B-BTI8HbBu.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js.map → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js → sankeyDiagram-TZEHDZUN-DibLVGzg.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js.map → sankeyDiagram-TZEHDZUN-DibLVGzg.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js → sequenceDiagram-WL72ISMW-qXatfzVt.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js.map → sequenceDiagram-WL72ISMW-qXatfzVt.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js → stateDiagram-FKZM4ZOC-7fgxCQHo.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js.map → stateDiagram-FKZM4ZOC-7fgxCQHo.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js.map → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js → timeline-definition-IT6M3QCI-iX2MRdpY.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js.map → timeline-definition-IT6M3QCI-iX2MRdpY.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js → treemap-GDKQZRPO-AVRnyXu1.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js.map → treemap-GDKQZRPO-AVRnyXu1.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js → xychartDiagram-PRI3JC2R-DVYEo5aJ.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js.map → xychartDiagram-PRI3JC2R-DVYEo5aJ.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +52 -48
- package/dist/tellask.js +439 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/fs.js +194 -68
- package/dist/tools/prompts/memory/en/principles.md +13 -5
- package/dist/tools/prompts/memory/en/tools.md +11 -36
- package/dist/tools/prompts/memory/zh/principles.md +18 -8
- package/dist/tools/prompts/memory/zh/tools.md +11 -36
- package/dist/tools/team-mgmt.js +3487 -0
- package/dist/utils/task-doc.js +236 -0
- package/package.json +1 -1
- package/dist/static/assets/index-HWTRvE2k.js.map +0 -1
|
@@ -36,6 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.handleWorkspaceFilePreviewPage = handleWorkspaceFilePreviewPage;
|
|
39
40
|
exports.handleApiRoute = handleApiRoute;
|
|
40
41
|
/**
|
|
41
42
|
* Module: server/api-routes
|
|
@@ -315,6 +316,251 @@ async function handleSaveCurrentCoursePriming(req, res) {
|
|
|
315
316
|
return true;
|
|
316
317
|
}
|
|
317
318
|
}
|
|
319
|
+
async function handleWorkspaceFilePreviewPage(req, res, pathname) {
|
|
320
|
+
if (!(pathname === '/f' || pathname === '/f/' || pathname.startsWith('/f/'))) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
if (req.method !== 'GET') {
|
|
324
|
+
res.writeHead(405, { 'Content-Type': 'text/plain; charset=utf-8', Allow: 'GET' });
|
|
325
|
+
res.end('Method Not Allowed');
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
const html = `<!doctype html>
|
|
329
|
+
<html lang="en">
|
|
330
|
+
<head>
|
|
331
|
+
<meta charset="utf-8" />
|
|
332
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
333
|
+
<title>Dominds File Preview</title>
|
|
334
|
+
<link
|
|
335
|
+
rel="stylesheet"
|
|
336
|
+
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css"
|
|
337
|
+
/>
|
|
338
|
+
<style>
|
|
339
|
+
:root { color-scheme: dark; }
|
|
340
|
+
body {
|
|
341
|
+
margin: 0;
|
|
342
|
+
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial;
|
|
343
|
+
background: #0f172a;
|
|
344
|
+
color: #e2e8f0;
|
|
345
|
+
}
|
|
346
|
+
.wrap { max-width: 1200px; margin: 0 auto; padding: 16px; }
|
|
347
|
+
.panel {
|
|
348
|
+
border: 1px solid #334155;
|
|
349
|
+
border-radius: 10px;
|
|
350
|
+
overflow: hidden;
|
|
351
|
+
background: #111827;
|
|
352
|
+
}
|
|
353
|
+
.head {
|
|
354
|
+
padding: 10px 12px;
|
|
355
|
+
border-bottom: 1px solid #334155;
|
|
356
|
+
background: #1f2937;
|
|
357
|
+
}
|
|
358
|
+
.path {
|
|
359
|
+
font-size: 13px;
|
|
360
|
+
font-weight: 600;
|
|
361
|
+
word-break: break-all;
|
|
362
|
+
}
|
|
363
|
+
.meta {
|
|
364
|
+
margin-top: 4px;
|
|
365
|
+
color: #94a3b8;
|
|
366
|
+
font-size: 12px;
|
|
367
|
+
}
|
|
368
|
+
.body { padding: 8px; }
|
|
369
|
+
.status {
|
|
370
|
+
border: 1px solid #334155;
|
|
371
|
+
border-radius: 8px;
|
|
372
|
+
padding: 10px;
|
|
373
|
+
font-size: 13px;
|
|
374
|
+
color: #cbd5e1;
|
|
375
|
+
background: #0f172a;
|
|
376
|
+
}
|
|
377
|
+
.status.err {
|
|
378
|
+
border-color: #7f1d1d;
|
|
379
|
+
background: #1f1010;
|
|
380
|
+
color: #fecaca;
|
|
381
|
+
}
|
|
382
|
+
pre {
|
|
383
|
+
margin: 0;
|
|
384
|
+
border-radius: 8px;
|
|
385
|
+
border: 1px solid #334155;
|
|
386
|
+
background: #0b1220;
|
|
387
|
+
overflow: auto;
|
|
388
|
+
max-height: calc(100vh - 190px);
|
|
389
|
+
}
|
|
390
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; }
|
|
391
|
+
</style>
|
|
392
|
+
</head>
|
|
393
|
+
<body>
|
|
394
|
+
<div class="wrap">
|
|
395
|
+
<div class="panel">
|
|
396
|
+
<div class="head">
|
|
397
|
+
<div id="file-path" class="path">Loading...</div>
|
|
398
|
+
<div id="file-meta" class="meta"></div>
|
|
399
|
+
</div>
|
|
400
|
+
<div class="body">
|
|
401
|
+
<div id="status" class="status">Loading file...</div>
|
|
402
|
+
<pre id="code-wrap" style="display:none;"><code id="code"></code></pre>
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
</div>
|
|
406
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
|
|
407
|
+
<script>
|
|
408
|
+
(function () {
|
|
409
|
+
var filePathEl = document.getElementById('file-path');
|
|
410
|
+
var fileMetaEl = document.getElementById('file-meta');
|
|
411
|
+
var statusEl = document.getElementById('status');
|
|
412
|
+
var codeWrapEl = document.getElementById('code-wrap');
|
|
413
|
+
var codeEl = document.getElementById('code');
|
|
414
|
+
if (!filePathEl || !fileMetaEl || !statusEl || !codeWrapEl || !codeEl) return;
|
|
415
|
+
|
|
416
|
+
function setError(message) {
|
|
417
|
+
statusEl.classList.add('err');
|
|
418
|
+
statusEl.textContent = message;
|
|
419
|
+
codeWrapEl.style.display = 'none';
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function normalizeRelativePath(input) {
|
|
423
|
+
if (typeof input !== 'string') return null;
|
|
424
|
+
if (input.length < 1) return null;
|
|
425
|
+
if (input.indexOf('\\\\') >= 0) return null;
|
|
426
|
+
if (/[\\u0000]/.test(input)) return null;
|
|
427
|
+
if (input.charAt(0) === '/') return null;
|
|
428
|
+
var parts = input.split('/').filter(function (s) { return s.length > 0; });
|
|
429
|
+
if (parts.length < 1) return null;
|
|
430
|
+
for (var i = 0; i < parts.length; i += 1) {
|
|
431
|
+
var seg = parts[i];
|
|
432
|
+
if (seg === '.' || seg === '..') return null;
|
|
433
|
+
}
|
|
434
|
+
return parts.join('/');
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function parseRelativePathFromLocation() {
|
|
438
|
+
var pathname = window.location.pathname || '';
|
|
439
|
+
if (!pathname.startsWith('/f/')) return null;
|
|
440
|
+
var tail = pathname.slice('/f/'.length);
|
|
441
|
+
if (tail.length < 1) return null;
|
|
442
|
+
var rawParts = tail.split('/');
|
|
443
|
+
if (rawParts.some(function (s) { return s.length < 1; })) return null;
|
|
444
|
+
var decodedParts = [];
|
|
445
|
+
for (var i = 0; i < rawParts.length; i += 1) {
|
|
446
|
+
var decoded;
|
|
447
|
+
try { decoded = decodeURIComponent(rawParts[i]); } catch { return null; }
|
|
448
|
+
if (decoded.length < 1) return null;
|
|
449
|
+
if (decoded.indexOf('/') >= 0 || decoded.indexOf('\\\\') >= 0 || /[\\u0000]/.test(decoded)) return null;
|
|
450
|
+
if (decoded === '.' || decoded === '..') return null;
|
|
451
|
+
decodedParts.push(decoded);
|
|
452
|
+
}
|
|
453
|
+
return normalizeRelativePath(decodedParts.join('/'));
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function parsePositiveInt(raw) {
|
|
457
|
+
if (typeof raw !== 'string' || raw.trim() === '') return null;
|
|
458
|
+
var parsed = Number.parseInt(raw, 10);
|
|
459
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function detectLang(filePath) {
|
|
463
|
+
var idx = filePath.lastIndexOf('.');
|
|
464
|
+
var ext = idx >= 0 ? filePath.slice(idx + 1).toLowerCase() : '';
|
|
465
|
+
var map = {
|
|
466
|
+
c: 'c', cc: 'cpp', cpp: 'cpp', cs: 'csharp', css: 'css',
|
|
467
|
+
go: 'go', h: 'c', hpp: 'cpp', html: 'xml', java: 'java',
|
|
468
|
+
js: 'javascript', json: 'json', jsx: 'jsx', kt: 'kotlin', md: 'markdown',
|
|
469
|
+
mjs: 'javascript', mts: 'typescript', py: 'python', rb: 'ruby', rs: 'rust',
|
|
470
|
+
sh: 'bash', sql: 'sql', toml: 'toml', ts: 'typescript', tsx: 'tsx',
|
|
471
|
+
txt: 'plaintext', vue: 'xml', xml: 'xml', yaml: 'yaml', yml: 'yaml'
|
|
472
|
+
};
|
|
473
|
+
return Object.prototype.hasOwnProperty.call(map, ext) ? map[ext] : 'plaintext';
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function formatBytes(size) {
|
|
477
|
+
if (typeof size !== 'number' || !Number.isFinite(size) || size < 0) return null;
|
|
478
|
+
if (size < 1024) return String(size) + ' B';
|
|
479
|
+
if (size < 1024 * 1024) return (size / 1024).toFixed(1) + ' KiB';
|
|
480
|
+
return (size / (1024 * 1024)).toFixed(1) + ' MiB';
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
var fileRelPath = parseRelativePathFromLocation();
|
|
484
|
+
if (!fileRelPath) {
|
|
485
|
+
filePathEl.textContent = 'Invalid file path';
|
|
486
|
+
setError('Invalid preview path. Expected /f/<rtws-relative-path> and no ..');
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
var search = new URLSearchParams(window.location.search);
|
|
491
|
+
var line = parsePositiveInt(search.get('line'));
|
|
492
|
+
var column = parsePositiveInt(search.get('column'));
|
|
493
|
+
var authFromUrl = search.get('auth');
|
|
494
|
+
var authFromStorage = null;
|
|
495
|
+
try { authFromStorage = window.localStorage.getItem('dominds.authKey'); } catch {}
|
|
496
|
+
var token =
|
|
497
|
+
(typeof authFromUrl === 'string' && authFromUrl.trim() !== '' ? authFromUrl.trim() : null) ||
|
|
498
|
+
(typeof authFromStorage === 'string' && authFromStorage.trim() !== '' ? authFromStorage.trim() : null);
|
|
499
|
+
|
|
500
|
+
filePathEl.textContent = fileRelPath;
|
|
501
|
+
var meta = [];
|
|
502
|
+
if (line !== null) {
|
|
503
|
+
meta.push('Line ' + String(line) + (column !== null ? ':' + String(column) : ''));
|
|
504
|
+
}
|
|
505
|
+
if (meta.length > 0) {
|
|
506
|
+
fileMetaEl.textContent = meta.join(' | ');
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
var headers = { Accept: 'application/json' };
|
|
510
|
+
if (token !== null) {
|
|
511
|
+
headers['Authorization'] = 'Bearer ' + token;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
fetch('/api/workspace/file?file=' + encodeURIComponent(fileRelPath), {
|
|
515
|
+
method: 'GET',
|
|
516
|
+
headers: headers,
|
|
517
|
+
cache: 'no-store'
|
|
518
|
+
})
|
|
519
|
+
.then(function (resp) {
|
|
520
|
+
return resp.json().catch(function () { return {}; }).then(function (payload) {
|
|
521
|
+
return { ok: resp.ok, status: resp.status, payload: payload };
|
|
522
|
+
});
|
|
523
|
+
})
|
|
524
|
+
.then(function (result) {
|
|
525
|
+
if (!result.ok || !result.payload || result.payload.success !== true || typeof result.payload.raw !== 'string') {
|
|
526
|
+
var msg = result.payload && typeof result.payload.error === 'string' && result.payload.error !== ''
|
|
527
|
+
? result.payload.error
|
|
528
|
+
: ('Request failed: HTTP ' + String(result.status));
|
|
529
|
+
setError(msg);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
statusEl.style.display = 'none';
|
|
534
|
+
codeWrapEl.style.display = 'block';
|
|
535
|
+
var lang = detectLang(fileRelPath);
|
|
536
|
+
var sizeText = formatBytes(result.payload.size);
|
|
537
|
+
var metaItems = [];
|
|
538
|
+
if (line !== null) metaItems.push('Line ' + String(line) + (column !== null ? ':' + String(column) : ''));
|
|
539
|
+
metaItems.push(lang);
|
|
540
|
+
if (sizeText !== null) metaItems.push(sizeText);
|
|
541
|
+
fileMetaEl.textContent = metaItems.join(' | ');
|
|
542
|
+
|
|
543
|
+
codeEl.className = 'language-' + lang;
|
|
544
|
+
codeEl.textContent = result.payload.raw;
|
|
545
|
+
if (window.hljs && typeof window.hljs.highlightElement === 'function') {
|
|
546
|
+
window.hljs.highlightElement(codeEl);
|
|
547
|
+
}
|
|
548
|
+
})
|
|
549
|
+
.catch(function (err) {
|
|
550
|
+
var msg = err && typeof err.message === 'string' ? err.message : 'Failed to load file';
|
|
551
|
+
setError(msg);
|
|
552
|
+
});
|
|
553
|
+
})();
|
|
554
|
+
</script>
|
|
555
|
+
</body>
|
|
556
|
+
</html>`;
|
|
557
|
+
res.writeHead(200, {
|
|
558
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
559
|
+
'Cache-Control': 'no-store',
|
|
560
|
+
});
|
|
561
|
+
res.end(html);
|
|
562
|
+
return true;
|
|
563
|
+
}
|
|
318
564
|
/**
|
|
319
565
|
* Handle API routes
|
|
320
566
|
*/
|
|
@@ -535,6 +781,10 @@ async function handleApiRoute(req, res, pathname, context) {
|
|
|
535
781
|
if (pathname === '/api/docs/read' && req.method === 'GET') {
|
|
536
782
|
return await handleReadDocsMarkdown(req, res);
|
|
537
783
|
}
|
|
784
|
+
// Read workspace file content for markdown file-link preview.
|
|
785
|
+
if (pathname === '/api/workspace/file' && req.method === 'GET') {
|
|
786
|
+
return await handleReadWorkspaceFile(req, res);
|
|
787
|
+
}
|
|
538
788
|
if (pathname === '/api/snippets/builtin' && req.method === 'GET') {
|
|
539
789
|
const payload = await (0, snippets_routes_1.handleGetBuiltinSnippets)();
|
|
540
790
|
respondJson(res, payload.success ? 200 : 500, payload);
|
|
@@ -774,6 +1024,89 @@ async function handleReadDocsMarkdown(req, res) {
|
|
|
774
1024
|
respondJson(res, 404, { success: false, error: 'Doc not found' });
|
|
775
1025
|
return true;
|
|
776
1026
|
}
|
|
1027
|
+
const WORKSPACE_FILE_PREVIEW_MAX_BYTES = 2 * 1024 * 1024;
|
|
1028
|
+
function ensurePathSuffixSeparator(input) {
|
|
1029
|
+
if (input.endsWith(path.sep))
|
|
1030
|
+
return input;
|
|
1031
|
+
return `${input}${path.sep}`;
|
|
1032
|
+
}
|
|
1033
|
+
function isWithinResolvedRoot(targetAbsPath, rootAbsPath) {
|
|
1034
|
+
if (targetAbsPath === rootAbsPath)
|
|
1035
|
+
return true;
|
|
1036
|
+
return targetAbsPath.startsWith(ensurePathSuffixSeparator(rootAbsPath));
|
|
1037
|
+
}
|
|
1038
|
+
function normalizeRtwsRelativeFilePath(input) {
|
|
1039
|
+
const trimmed = input.trim();
|
|
1040
|
+
if (trimmed.length < 1)
|
|
1041
|
+
return null;
|
|
1042
|
+
if (trimmed.includes('\0'))
|
|
1043
|
+
return null;
|
|
1044
|
+
if (trimmed.includes('\\'))
|
|
1045
|
+
return null;
|
|
1046
|
+
if (path.posix.isAbsolute(trimmed))
|
|
1047
|
+
return null;
|
|
1048
|
+
const normalized = path.posix.normalize(trimmed);
|
|
1049
|
+
if (normalized.length < 1 || normalized === '.' || normalized === '..')
|
|
1050
|
+
return null;
|
|
1051
|
+
if (normalized.startsWith('../'))
|
|
1052
|
+
return null;
|
|
1053
|
+
if (normalized.includes('/../'))
|
|
1054
|
+
return null;
|
|
1055
|
+
if (normalized.startsWith('/'))
|
|
1056
|
+
return null;
|
|
1057
|
+
const segments = normalized.split('/');
|
|
1058
|
+
if (segments.some((segment) => segment.length < 1 || segment === '.' || segment === '..')) {
|
|
1059
|
+
return null;
|
|
1060
|
+
}
|
|
1061
|
+
return normalized;
|
|
1062
|
+
}
|
|
1063
|
+
async function handleReadWorkspaceFile(req, res) {
|
|
1064
|
+
const urlObj = new URL(req.url ?? '', 'http://127.0.0.1');
|
|
1065
|
+
const fileRaw = urlObj.searchParams.get('file');
|
|
1066
|
+
const fileRelPath = typeof fileRaw === 'string' ? normalizeRtwsRelativeFilePath(fileRaw) : null;
|
|
1067
|
+
if (fileRelPath === null) {
|
|
1068
|
+
respondJson(res, 400, { success: false, error: 'Invalid file path' });
|
|
1069
|
+
return true;
|
|
1070
|
+
}
|
|
1071
|
+
const workspaceRootAbs = path.resolve(process.cwd());
|
|
1072
|
+
const candidateAbsPath = path.resolve(workspaceRootAbs, fileRelPath);
|
|
1073
|
+
if (!isWithinResolvedRoot(candidateAbsPath, workspaceRootAbs)) {
|
|
1074
|
+
respondJson(res, 403, {
|
|
1075
|
+
success: false,
|
|
1076
|
+
error: 'File path is outside rtws',
|
|
1077
|
+
path: fileRelPath,
|
|
1078
|
+
});
|
|
1079
|
+
return true;
|
|
1080
|
+
}
|
|
1081
|
+
try {
|
|
1082
|
+
const stat = await promises_1.default.stat(candidateAbsPath);
|
|
1083
|
+
if (!stat.isFile()) {
|
|
1084
|
+
respondJson(res, 400, { success: false, error: 'Path must be a file', path: fileRelPath });
|
|
1085
|
+
return true;
|
|
1086
|
+
}
|
|
1087
|
+
if (stat.size > WORKSPACE_FILE_PREVIEW_MAX_BYTES) {
|
|
1088
|
+
respondJson(res, 413, {
|
|
1089
|
+
success: false,
|
|
1090
|
+
error: `File too large for preview (max ${WORKSPACE_FILE_PREVIEW_MAX_BYTES} bytes)`,
|
|
1091
|
+
path: fileRelPath,
|
|
1092
|
+
size: stat.size,
|
|
1093
|
+
});
|
|
1094
|
+
return true;
|
|
1095
|
+
}
|
|
1096
|
+
const raw = await promises_1.default.readFile(candidateAbsPath, 'utf-8');
|
|
1097
|
+
respondJson(res, 200, { success: true, path: fileRelPath, raw, size: stat.size });
|
|
1098
|
+
return true;
|
|
1099
|
+
}
|
|
1100
|
+
catch (error) {
|
|
1101
|
+
if (getErrorCode(error) === 'ENOENT') {
|
|
1102
|
+
respondJson(res, 404, { success: false, error: 'File not found', path: fileRelPath });
|
|
1103
|
+
return true;
|
|
1104
|
+
}
|
|
1105
|
+
log.error('Failed to read workspace file', error, { path: fileRelPath });
|
|
1106
|
+
respondJson(res, 500, { success: false, error: 'Failed to read workspace file' });
|
|
1107
|
+
return true;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
777
1110
|
async function handleGetToolsRegistry(res) {
|
|
778
1111
|
try {
|
|
779
1112
|
const snapshot = (0, registry_snapshot_1.createToolsRegistrySnapshot)();
|