noteconnection 1.6.8 → 1.8.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/LICENSE +674 -21
- package/README.md +258 -64
- package/dist/src/agent_workspace.contract.parity.test.js +475 -0
- package/dist/src/agent_workspace.frontend.test.js +9989 -0
- package/dist/src/agent_workspace.locale.contract.test.js +95 -0
- package/dist/src/agent_workspace.runtime.behavior.test.js +5072 -0
- package/dist/src/copy.assets.contract.test.js +130 -0
- package/dist/src/core/PathBridge.js +28 -3
- package/dist/src/export/WorkspaceExportBundle.js +1130 -0
- package/dist/src/export/WorkspaceExportBundle.test.js +1480 -0
- package/dist/src/export/index.js +18 -0
- package/dist/src/export/types.js +2 -0
- package/dist/src/fixrisk.issue.verifier.contract.test.js +3 -1
- package/dist/src/foundation.ann.runtime.contract.test.js +81 -0
- package/dist/src/foundation.release.evidence.contract.test.js +406 -0
- package/dist/src/foundation.sqlite.runtime.contract.test.js +82 -0
- package/dist/src/frontend/README.md +258 -64
- package/dist/src/frontend/agent_workspace.js +5353 -0
- package/dist/src/frontend/agent_workspace_runtime.js +4434 -0
- package/dist/src/frontend/analysis.js +31 -4
- package/dist/src/frontend/app.js +3597 -141
- package/dist/src/frontend/focus_mode_interactions.js +33 -0
- package/dist/src/frontend/godot_future_path_renderer.js +540 -0
- package/dist/src/frontend/godot_tree_interactions.js +178 -0
- package/dist/src/frontend/graph_state.mjs +105 -0
- package/dist/src/frontend/hosted_future_path_runtime.js +157 -0
- package/dist/src/frontend/i18n.mjs +186 -0
- package/dist/src/frontend/index.html +641 -266
- package/dist/src/frontend/layout_gpu.js +12 -4
- package/dist/src/frontend/locales/en.json +721 -5
- package/dist/src/frontend/locales/zh.json +721 -5
- package/dist/src/frontend/main.mjs +60 -0
- package/dist/src/frontend/markdown_runtime.js +827 -0
- package/dist/src/frontend/notemd.css +49 -0
- package/dist/src/frontend/notemd.html +7 -1
- package/dist/src/frontend/notemd.js +64 -0
- package/dist/src/frontend/path.html +107 -0
- package/dist/src/frontend/path_app.js +2189 -150
- package/dist/src/frontend/path_layout.mjs +143 -0
- package/dist/src/frontend/path_mermaid_utils.mjs +108 -0
- package/dist/src/frontend/path_modules_bridge.js +486 -0
- package/dist/src/frontend/path_state.mjs +118 -0
- package/dist/src/frontend/path_styles.css +146 -0
- package/dist/src/frontend/path_worker_bridge.mjs +85 -0
- package/dist/src/frontend/reader.js +522 -27
- package/dist/src/frontend/runtime_bridge.js +67 -54
- package/dist/src/frontend/runtime_bridge.mjs +279 -0
- package/dist/src/frontend/settings.js +130 -12
- package/dist/src/frontend/simulationWorker.js +241 -6
- package/dist/src/frontend/source_manager.js +190 -21
- package/dist/src/frontend/styles.css +2853 -72
- package/dist/src/frontend/workbench_state.mjs +101 -0
- package/dist/src/frontend/workspace_panes.js +10168 -0
- package/dist/src/frontend.locale.contract.test.js +62 -0
- package/dist/src/godot.sidecar.bootstrap.contract.test.js +244 -0
- package/dist/src/indexing/IndexLifecycle.js +195 -0
- package/dist/src/indexing/IndexLifecycle.test.js +49 -0
- package/dist/src/indexing/SegmentBuilder.js +64 -0
- package/dist/src/indexing/UnitBuilder.js +48 -0
- package/dist/src/indexing/types.js +2 -0
- package/dist/src/knowledge.api.contract.test.js +170 -0
- package/dist/src/learning/KnowledgeLearningPlatform.js +10386 -0
- package/dist/src/learning/KnowledgeLearningPlatform.persistence.test.js +327 -0
- package/dist/src/learning/KnowledgeLearningPlatform.program-f.test.js +99 -0
- package/dist/src/learning/KnowledgeLearningPlatform.test.js +2971 -0
- package/dist/src/learning/KnowledgeWorkspaceConversationRegression.js +2974 -0
- package/dist/src/learning/KnowledgeWorkspaceConversationRegression.test.js +3928 -0
- package/dist/src/learning/answerReleaseReview.js +4319 -0
- package/dist/src/learning/answerReleaseReview.test.js +2888 -0
- package/dist/src/learning/api.js +2 -0
- package/dist/src/learning/conversationComposer.js +1480 -0
- package/dist/src/learning/conversationComposer.test.js +1817 -0
- package/dist/src/learning/domains/ConversationManager.js +53 -0
- package/dist/src/learning/domains/KnowledgeIngestor.js +238 -0
- package/dist/src/learning/domains/KnowledgeQuerier.js +187 -0
- package/dist/src/learning/domains/MasteryEngine.js +387 -0
- package/dist/src/learning/domains/MemoryPolicyManager.js +408 -0
- package/dist/src/learning/domains/QualityEvaluator.js +307 -0
- package/dist/src/learning/domains/TutorRouter.js +313 -0
- package/dist/src/learning/domains/index.js +33 -0
- package/dist/src/learning/domains/types.js +7 -0
- package/dist/src/learning/errors.js +29 -0
- package/dist/src/learning/evidenceContextAssembler.js +1176 -0
- package/dist/src/learning/evidenceContextAssembler.test.js +6332 -0
- package/dist/src/learning/graphContextAssembler.js +870 -0
- package/dist/src/learning/graphContextAssembler.test.js +1033 -0
- package/dist/src/learning/index.js +28 -0
- package/dist/src/learning/queryBackend.js +1898 -0
- package/dist/src/learning/queryBackend.test.js +955 -0
- package/dist/src/learning/ragContextPack.js +257 -0
- package/dist/src/learning/ragContextPack.test.js +160 -0
- package/dist/src/learning/ragPublicText.js +38 -0
- package/dist/src/learning/ragSufficiencyJudge.js +161 -0
- package/dist/src/learning/ragSufficiencyJudge.test.js +177 -0
- package/dist/src/learning/ragSufficiencyProviderJudge.js +227 -0
- package/dist/src/learning/ragSufficiencyProviderJudge.test.js +156 -0
- package/dist/src/learning/requestNormalization.js +198 -0
- package/dist/src/learning/runtimeCapability.js +4677 -0
- package/dist/src/learning/runtimeCapability.test.js +3635 -0
- package/dist/src/learning/store.js +1240 -0
- package/dist/src/learning/store.test.js +1126 -0
- package/dist/src/learning/tutorAdapter.js +2 -0
- package/dist/src/learning/types.js +2 -0
- package/dist/src/learning/vectorAccelerationAdapter.js +942 -0
- package/dist/src/learning/vectorAccelerationAdapter.test.js +382 -0
- package/dist/src/lfs.asset.policy.contract.test.js +153 -0
- package/dist/src/license.policy.contract.test.js +66 -0
- package/dist/src/memory/MemoryGovernance.js +74 -0
- package/dist/src/memory/MemoryGovernance.test.js +46 -0
- package/dist/src/memory/types.js +2 -0
- package/dist/src/mermaid.frontend.guard.contract.test.js +77 -0
- package/dist/src/middleware/auth.js +17 -0
- package/dist/src/middleware/body-parser.js +45 -0
- package/dist/src/middleware/cors.js +44 -0
- package/dist/src/middleware/index.js +21 -0
- package/dist/src/middleware/request-trace.js +96 -0
- package/dist/src/notemd/AppConfigToml.js +6 -4
- package/dist/src/notemd/MermaidProcessor.js +400 -50
- package/dist/src/notemd/NotemdService.js +498 -13
- package/dist/src/notemd/PromptManager.js +15 -0
- package/dist/src/notemd/cli/commands.js +357 -0
- package/dist/src/notemd/cli/dispatcher.js +225 -0
- package/dist/src/notemd/cli/index.js +169 -0
- package/dist/src/notemd/cli/parser.js +68 -0
- package/dist/src/notemd/cli/types.js +2 -0
- package/dist/src/notemd/constants.js +43 -0
- package/dist/src/notemd/diagram/diagramGenerationService.js +78 -0
- package/dist/src/notemd/diagram/diagramSpec.js +79 -0
- package/dist/src/notemd/diagram/diagramSpecResponseParser.js +131 -0
- package/dist/src/notemd/diagram/intent.js +95 -0
- package/dist/src/notemd/diagram/planner.js +71 -0
- package/dist/src/notemd/diagram/prompts/diagramSpecPrompt.js +42 -0
- package/dist/src/notemd/diagram/types.js +18 -0
- package/dist/src/notemd/index.js +26 -0
- package/dist/src/notemd/operations/capabilityManifest.js +23 -0
- package/dist/src/notemd/operations/cliContracts.js +17 -0
- package/dist/src/notemd/operations/configProfileCommands.js +85 -0
- package/dist/src/notemd/operations/registry.contract.test.js +95 -0
- package/dist/src/notemd/operations/registry.js +991 -0
- package/dist/src/notemd/operations/types.js +2 -0
- package/dist/src/notemd/providerDiagnostics.js +220 -0
- package/dist/src/notemd/providerProfiles.js +42 -0
- package/dist/src/notemd/providerTemplates.js +231 -0
- package/dist/src/notemd/search/DuckDuckGoProvider.js +39 -0
- package/dist/src/notemd/search/SearchManager.js +13 -0
- package/dist/src/notemd/search/SearchProvider.js +2 -0
- package/dist/src/notemd/search/TavilyProvider.js +44 -0
- package/dist/src/notemd.agent.manifest.test.js +85 -0
- package/dist/src/notemd.api.contract.test.js +14 -1
- package/dist/src/notemd.app_config_toml.test.js +2 -1
- package/dist/src/notemd.batch.workflow.test.js +117 -0
- package/dist/src/notemd.cli.e2e.test.js +136 -0
- package/dist/src/notemd.core.test.js +51 -0
- package/dist/src/notemd.diagram.pipeline.test.js +233 -0
- package/dist/src/notemd.providerTemplates.test.js +34 -0
- package/dist/src/notemd.server.integration.test.js +143 -35
- package/dist/src/notemd.workflow.pipeline.test.js +162 -0
- package/dist/src/pathbridge.handshake.contract.test.js +16 -2
- package/dist/src/pathmode.background.contract.test.js +69 -0
- package/dist/src/pathmode.settings.api.contract.test.js +9 -0
- package/dist/src/pkg.sidecar.contract.test.js +9 -3
- package/dist/src/platform/ExportProfile.js +58 -0
- package/dist/src/platform/PlatformCapabilities.js +45 -0
- package/dist/src/platform/PlatformCapabilities.test.js +30 -0
- package/dist/src/platform/RenderMaterializer.js +33 -0
- package/dist/src/platform/RenderMaterializer.test.js +32 -0
- package/dist/src/query_backend.external_http.integration.test.js +410 -0
- package/dist/src/reader_renderer.js +404 -3
- package/dist/src/reader_renderer.test.js +87 -0
- package/dist/src/release.godot.mirror.contract.test.js +73 -0
- package/dist/src/resources/ResourceRegistry.js +223 -0
- package/dist/src/resources/ResourceRegistry.test.js +61 -0
- package/dist/src/resources/types.js +2 -0
- package/dist/src/routes/agentWorkspaceDiagnostics.js +173 -0
- package/dist/src/routes/data.js +267 -0
- package/dist/src/routes/diagnostics.js +51 -0
- package/dist/src/routes/index.js +23 -0
- package/dist/src/routes/knowledge.js +968 -0
- package/dist/src/routes/markdown.js +287 -0
- package/dist/src/routes/notemd.js +565 -0
- package/dist/src/routes/registry.contract.test.js +130 -0
- package/dist/src/routes/render.js +285 -0
- package/dist/src/routes/runtimeRunbookRouteOps.js +149 -0
- package/dist/src/routes/runtimeRunbookRouteOps.test.js +194 -0
- package/dist/src/routes/settings.js +6 -0
- package/dist/src/routes/staticFiles.js +94 -0
- package/dist/src/routes/types.js +2 -0
- package/dist/src/runtime.transport.adapter.contract.test.js +81 -0
- package/dist/src/server.js +11090 -1549
- package/dist/src/server.migration.test.js +193 -21
- package/dist/src/server.port.fallback.contract.test.js +63 -0
- package/dist/src/session/SessionStateStore.js +81 -0
- package/dist/src/session/SessionStateStore.test.js +58 -0
- package/dist/src/session/types.js +2 -0
- package/dist/src/settings.runtime.contract.test.js +50 -0
- package/dist/src/shared/types.contract.test.js +107 -0
- package/dist/src/shared/types.js +22 -0
- package/dist/src/sidecar.replacement.boundary.contract.test.js +128 -0
- package/dist/src/sidecar.supply.readiness.contract.test.js +144 -0
- package/dist/src/source_manager.loadflow.test.js +46 -0
- package/dist/src/startup.layout.snapshot.contract.test.js +57 -0
- package/dist/src/tauri.frontend.build.contract.test.js +60 -0
- package/dist/src/tauri.sidecar.cleanup.contract.test.js +21 -0
- package/dist/src/utils/RuntimePaths.js +4 -13
- package/dist/src/utils/platform.js +153 -0
- package/dist/src/workflows/WorkflowArtifactStore.js +96 -0
- package/dist/src/workflows/WorkflowArtifactStore.test.js +80 -0
- package/dist/src/workflows/types.js +2 -0
- package/dist/src/workspace/WorkspaceRegistry.js +122 -0
- package/dist/src/workspace/WorkspaceRegistry.test.js +29 -0
- package/dist/src/workspace/types.js +2 -0
- package/package.json +61 -10
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeGovernedMemoryType = normalizeGovernedMemoryType;
|
|
4
|
+
exports.normalizeGovernedMemoryPurpose = normalizeGovernedMemoryPurpose;
|
|
5
|
+
exports.classifyMemoryEntry = classifyMemoryEntry;
|
|
6
|
+
exports.computeGovernedMemoryWeight = computeGovernedMemoryWeight;
|
|
7
|
+
exports.buildMemoryAuditRecord = buildMemoryAuditRecord;
|
|
8
|
+
function normalizeGovernedMemoryType(value) {
|
|
9
|
+
const normalized = String(value || '').trim().toLowerCase();
|
|
10
|
+
if (normalized === 'study' || normalized === 'note' || normalized === 'system') {
|
|
11
|
+
return normalized;
|
|
12
|
+
}
|
|
13
|
+
return 'fact';
|
|
14
|
+
}
|
|
15
|
+
function normalizeGovernedMemoryPurpose(value) {
|
|
16
|
+
const normalized = String(value || '').trim().toLowerCase();
|
|
17
|
+
if (normalized === 'internalized' || normalized === 'supplementary' || normalized === 'systemic') {
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
return 'memorized';
|
|
21
|
+
}
|
|
22
|
+
function classifyMemoryEntry(entry) {
|
|
23
|
+
const tags = Array.isArray(entry.tags) ? entry.tags.map((tag) => String(tag || '').trim().toLowerCase()) : [];
|
|
24
|
+
const rawText = `${entry.key} ${entry.value} ${tags.join(' ')}`.toLowerCase();
|
|
25
|
+
const memoryType = normalizeGovernedMemoryType(entry.memoryType
|
|
26
|
+
|| (tags.includes('study') || rawText.includes('quiz') || rawText.includes('review') ? 'study'
|
|
27
|
+
: tags.includes('note') || rawText.includes('note') ? 'note'
|
|
28
|
+
: tags.includes('system') ? 'system'
|
|
29
|
+
: 'fact'));
|
|
30
|
+
const memoryPurpose = normalizeGovernedMemoryPurpose(entry.memoryPurpose
|
|
31
|
+
|| (memoryType === 'study' ? 'internalized'
|
|
32
|
+
: memoryType === 'system' ? 'systemic'
|
|
33
|
+
: memoryType === 'note' ? 'supplementary'
|
|
34
|
+
: 'memorized'));
|
|
35
|
+
return {
|
|
36
|
+
memoryType,
|
|
37
|
+
memoryPurpose,
|
|
38
|
+
classificationConfidence: Math.max(0.45, Math.min(0.98, Number(entry.confidence || 0.72))),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function computeGovernedMemoryWeight(entry) {
|
|
42
|
+
const { memoryType, memoryPurpose } = classifyMemoryEntry(entry);
|
|
43
|
+
const typeWeight = memoryType === 'study'
|
|
44
|
+
? 1.25
|
|
45
|
+
: memoryType === 'note'
|
|
46
|
+
? 1.1
|
|
47
|
+
: memoryType === 'system'
|
|
48
|
+
? 0.7
|
|
49
|
+
: 1;
|
|
50
|
+
const purposeWeight = memoryPurpose === 'internalized'
|
|
51
|
+
? 1.35
|
|
52
|
+
: memoryPurpose === 'supplementary'
|
|
53
|
+
? 0.92
|
|
54
|
+
: memoryPurpose === 'systemic'
|
|
55
|
+
? 0.75
|
|
56
|
+
: 1;
|
|
57
|
+
return Number((typeWeight * purposeWeight).toFixed(4));
|
|
58
|
+
}
|
|
59
|
+
function buildMemoryAuditRecord(nextId, params) {
|
|
60
|
+
const classification = classifyMemoryEntry(params.entry);
|
|
61
|
+
return {
|
|
62
|
+
auditId: nextId('memory_audit'),
|
|
63
|
+
userId: params.userId,
|
|
64
|
+
operation: params.operation,
|
|
65
|
+
layer: params.layer,
|
|
66
|
+
memoryKey: params.entry.key,
|
|
67
|
+
memoryType: classification.memoryType,
|
|
68
|
+
memoryPurpose: classification.memoryPurpose,
|
|
69
|
+
reason: params.reason,
|
|
70
|
+
scopeWorkspaceId: params.scopeWorkspaceId || null,
|
|
71
|
+
scopeCorpusId: params.scopeCorpusId || null,
|
|
72
|
+
recordedAt: params.recordedAt,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const MemoryGovernance_1 = require("./MemoryGovernance");
|
|
4
|
+
describe('MemoryGovernance', () => {
|
|
5
|
+
test('classifies study memories and raises their retrieval weight', () => {
|
|
6
|
+
const entry = {
|
|
7
|
+
key: 'quiz_note',
|
|
8
|
+
value: 'Review this quiz correction before the next session.',
|
|
9
|
+
tags: ['study', 'review'],
|
|
10
|
+
confidence: 0.84,
|
|
11
|
+
references: ['atom_1'],
|
|
12
|
+
createdAt: '2026-05-26T00:00:00.000Z',
|
|
13
|
+
updatedAt: '2026-05-26T00:00:00.000Z',
|
|
14
|
+
};
|
|
15
|
+
const classification = (0, MemoryGovernance_1.classifyMemoryEntry)(entry);
|
|
16
|
+
expect(classification.memoryType).toBe('study');
|
|
17
|
+
expect(classification.memoryPurpose).toBe('internalized');
|
|
18
|
+
expect((0, MemoryGovernance_1.computeGovernedMemoryWeight)(entry)).toBeGreaterThan(1);
|
|
19
|
+
});
|
|
20
|
+
test('builds audit records with explicit scope fields', () => {
|
|
21
|
+
const entry = {
|
|
22
|
+
key: 'memory_1',
|
|
23
|
+
value: 'Scoped note',
|
|
24
|
+
tags: ['note'],
|
|
25
|
+
confidence: 0.7,
|
|
26
|
+
references: [],
|
|
27
|
+
scopeWorkspaceId: 'optics',
|
|
28
|
+
scopeCorpusId: 'optics',
|
|
29
|
+
createdAt: '2026-05-26T00:00:00.000Z',
|
|
30
|
+
updatedAt: '2026-05-26T00:00:00.000Z',
|
|
31
|
+
};
|
|
32
|
+
const audit = (0, MemoryGovernance_1.buildMemoryAuditRecord)((prefix = 'memory_audit') => `${prefix}_1`, {
|
|
33
|
+
userId: 'user_a',
|
|
34
|
+
operation: 'write',
|
|
35
|
+
layer: 'session',
|
|
36
|
+
entry,
|
|
37
|
+
reason: 'test',
|
|
38
|
+
scopeWorkspaceId: 'optics',
|
|
39
|
+
scopeCorpusId: 'optics',
|
|
40
|
+
recordedAt: '2026-05-26T00:01:00.000Z',
|
|
41
|
+
});
|
|
42
|
+
expect(audit.scopeWorkspaceId).toBe('optics');
|
|
43
|
+
expect(audit.scopeCorpusId).toBe('optics');
|
|
44
|
+
expect(audit.memoryKey).toBe('memory_1');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
describe('mermaid frontend guard contract', () => {
|
|
39
|
+
const repoRoot = path.resolve(__dirname, '..');
|
|
40
|
+
const appPath = path.join(repoRoot, 'src', 'frontend', 'app.js');
|
|
41
|
+
const readerPath = path.join(repoRoot, 'src', 'frontend', 'reader.js');
|
|
42
|
+
const stylesPath = path.join(repoRoot, 'src', 'frontend', 'styles.css');
|
|
43
|
+
test('installs a global Mermaid artifact suppression observer for leaked error SVGs', () => {
|
|
44
|
+
const source = fs.readFileSync(appPath, 'utf8');
|
|
45
|
+
expect(source).toContain('function suppressMermaidErrorArtifacts(root, context = {})');
|
|
46
|
+
expect(source).toContain('function installMermaidErrorArtifactObserver()');
|
|
47
|
+
expect(source).toContain('function installMermaidRuntimeGuards()');
|
|
48
|
+
expect(source).toContain('function exposeMermaidDebugInterface()');
|
|
49
|
+
expect(source).toContain('installMermaidErrorArtifactObserver();');
|
|
50
|
+
expect(source).toContain("normalized.includes('syntax error in text')");
|
|
51
|
+
expect(source).toContain("normalized.includes('mermaid version')");
|
|
52
|
+
expect(source).toContain('captureRuntimeState: () => ({');
|
|
53
|
+
expect(source).toContain('function isProtectedMermaidSuppressionHost(host)');
|
|
54
|
+
expect(source).toContain('root !== document.body');
|
|
55
|
+
expect(source).toContain("host.id === 'reading-body'");
|
|
56
|
+
});
|
|
57
|
+
test('reader mermaid suppression never selects the page root as a removable host', () => {
|
|
58
|
+
const source = fs.readFileSync(readerPath, 'utf8');
|
|
59
|
+
expect(source).toContain('isProtectedMermaidSuppressionHost(host)');
|
|
60
|
+
expect(source).toContain('root !== document.body');
|
|
61
|
+
expect(source).toContain("host.id === 'graph-wrapper'");
|
|
62
|
+
expect(source).toContain('Reader Mermaid offscreen host mount root is unavailable.');
|
|
63
|
+
expect(source).toContain('ensureReaderStructure()');
|
|
64
|
+
expect(source).toContain("replacementBody.id = 'reading-body'");
|
|
65
|
+
expect(source).toContain('this.contentBox.appendChild(replacementBody);');
|
|
66
|
+
expect(source).toContain('lookupNodeDataById(nodeId)');
|
|
67
|
+
expect(source).toContain("typeof graphData !== 'undefined'");
|
|
68
|
+
expect(source).toContain('isReaderBodyVisiblyEmpty()');
|
|
69
|
+
expect(source).toContain('Markdown protocol path completed without visible content. Falling back to raw markdown render.');
|
|
70
|
+
});
|
|
71
|
+
test('ships compact inline and toast styles for suppressed Mermaid errors', () => {
|
|
72
|
+
const source = fs.readFileSync(stylesPath, 'utf8');
|
|
73
|
+
expect(source).toContain('.mermaid-inline-guard');
|
|
74
|
+
expect(source).toContain('.mermaid-error-toast-stack');
|
|
75
|
+
expect(source).toContain('.mermaid-error-toast');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setSidecarAuthToken = setSidecarAuthToken;
|
|
4
|
+
exports.isAuthorizedRequest = isAuthorizedRequest;
|
|
5
|
+
let sidecarAuthToken = null;
|
|
6
|
+
function setSidecarAuthToken(token) {
|
|
7
|
+
sidecarAuthToken = token;
|
|
8
|
+
}
|
|
9
|
+
function isAuthorizedRequest(req) {
|
|
10
|
+
if (!sidecarAuthToken)
|
|
11
|
+
return true;
|
|
12
|
+
const authHeader = req.headers.authorization || '';
|
|
13
|
+
if (authHeader.startsWith('Bearer ')) {
|
|
14
|
+
return authHeader.slice(7) === sidecarAuthToken;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readRequestBody = readRequestBody;
|
|
4
|
+
exports.parseJsonBody = parseJsonBody;
|
|
5
|
+
exports.sendJson = sendJson;
|
|
6
|
+
exports.sendError = sendError;
|
|
7
|
+
const MAX_BODY_SIZE = 50 * 1024 * 1024; // 50MB
|
|
8
|
+
async function readRequestBody(req) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const chunks = [];
|
|
11
|
+
let totalSize = 0;
|
|
12
|
+
req.on('data', (chunk) => {
|
|
13
|
+
totalSize += chunk.length;
|
|
14
|
+
if (totalSize > MAX_BODY_SIZE) {
|
|
15
|
+
req.destroy();
|
|
16
|
+
reject(new Error('Request body exceeds maximum size'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
chunks.push(chunk);
|
|
20
|
+
});
|
|
21
|
+
req.on('end', () => {
|
|
22
|
+
resolve(Buffer.concat(chunks).toString('utf8'));
|
|
23
|
+
});
|
|
24
|
+
req.on('error', reject);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function parseJsonBody(req) {
|
|
28
|
+
const raw = await readRequestBody(req);
|
|
29
|
+
if (!raw.trim())
|
|
30
|
+
return {};
|
|
31
|
+
return JSON.parse(raw);
|
|
32
|
+
}
|
|
33
|
+
function sendJson(res, statusCode, data) {
|
|
34
|
+
res.writeHead(statusCode, { 'Content-Type': 'application/json' });
|
|
35
|
+
res.end(JSON.stringify(data));
|
|
36
|
+
}
|
|
37
|
+
function sendError(res, statusCode, error, errorCode) {
|
|
38
|
+
if (errorCode) {
|
|
39
|
+
res.setHeader('x-nc-error-code', errorCode);
|
|
40
|
+
}
|
|
41
|
+
sendJson(res, statusCode, {
|
|
42
|
+
success: false,
|
|
43
|
+
error: error instanceof Error ? error.message : String(error),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyCorsHeaders = applyCorsHeaders;
|
|
4
|
+
const ALLOWED_ORIGINS = new Set([
|
|
5
|
+
'http://localhost:3000',
|
|
6
|
+
'http://127.0.0.1:3000',
|
|
7
|
+
'http://localhost:5173',
|
|
8
|
+
'http://127.0.0.1:5173',
|
|
9
|
+
'tauri://localhost',
|
|
10
|
+
'https://tauri.localhost',
|
|
11
|
+
]);
|
|
12
|
+
const ALLOWED_HEADER_NAMES = [
|
|
13
|
+
'Content-Type',
|
|
14
|
+
'Authorization',
|
|
15
|
+
'X-Request-Id',
|
|
16
|
+
'X-NoteConnection-Token',
|
|
17
|
+
'X-Agent-Conversation-Turn-Id',
|
|
18
|
+
'X-Agent-Conversation-Resume-Turn-Id',
|
|
19
|
+
];
|
|
20
|
+
const EXPOSED_HEADER_NAMES = [
|
|
21
|
+
'X-Request-Id',
|
|
22
|
+
'X-Error-Code',
|
|
23
|
+
'X-Agent-Conversation-Turn-Id',
|
|
24
|
+
'X-Agent-Conversation-Replay',
|
|
25
|
+
];
|
|
26
|
+
function applyCorsHeaders(req, res) {
|
|
27
|
+
const origin = req.headers.origin;
|
|
28
|
+
if (!origin) {
|
|
29
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
30
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
31
|
+
res.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADER_NAMES.join(', '));
|
|
32
|
+
res.setHeader('Access-Control-Expose-Headers', EXPOSED_HEADER_NAMES.join(', '));
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (ALLOWED_ORIGINS.has(origin)) {
|
|
36
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
37
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
38
|
+
res.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADER_NAMES.join(', '));
|
|
39
|
+
res.setHeader('Access-Control-Expose-Headers', EXPOSED_HEADER_NAMES.join(', '));
|
|
40
|
+
res.setHeader('Vary', 'Origin');
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendError = exports.sendJson = exports.parseJsonBody = exports.readRequestBody = exports.ERROR_CODE_HEADER = exports.appendRuntimeApiRequestTrace = exports.getRuntimeRequestTrace = exports.normalizeApiErrorCodeToken = exports.finishRequestTrace = exports.startRequestTraceHandler = exports.resolveRequestId = exports.setSidecarAuthToken = exports.isAuthorizedRequest = exports.applyCorsHeaders = void 0;
|
|
4
|
+
var cors_1 = require("./cors");
|
|
5
|
+
Object.defineProperty(exports, "applyCorsHeaders", { enumerable: true, get: function () { return cors_1.applyCorsHeaders; } });
|
|
6
|
+
var auth_1 = require("./auth");
|
|
7
|
+
Object.defineProperty(exports, "isAuthorizedRequest", { enumerable: true, get: function () { return auth_1.isAuthorizedRequest; } });
|
|
8
|
+
Object.defineProperty(exports, "setSidecarAuthToken", { enumerable: true, get: function () { return auth_1.setSidecarAuthToken; } });
|
|
9
|
+
var request_trace_1 = require("./request-trace");
|
|
10
|
+
Object.defineProperty(exports, "resolveRequestId", { enumerable: true, get: function () { return request_trace_1.resolveRequestId; } });
|
|
11
|
+
Object.defineProperty(exports, "startRequestTraceHandler", { enumerable: true, get: function () { return request_trace_1.startRequestTraceHandler; } });
|
|
12
|
+
Object.defineProperty(exports, "finishRequestTrace", { enumerable: true, get: function () { return request_trace_1.finishRequestTrace; } });
|
|
13
|
+
Object.defineProperty(exports, "normalizeApiErrorCodeToken", { enumerable: true, get: function () { return request_trace_1.normalizeApiErrorCodeToken; } });
|
|
14
|
+
Object.defineProperty(exports, "getRuntimeRequestTrace", { enumerable: true, get: function () { return request_trace_1.getRuntimeRequestTrace; } });
|
|
15
|
+
Object.defineProperty(exports, "appendRuntimeApiRequestTrace", { enumerable: true, get: function () { return request_trace_1.appendRuntimeApiRequestTrace; } });
|
|
16
|
+
Object.defineProperty(exports, "ERROR_CODE_HEADER", { enumerable: true, get: function () { return request_trace_1.ERROR_CODE_HEADER; } });
|
|
17
|
+
var body_parser_1 = require("./body-parser");
|
|
18
|
+
Object.defineProperty(exports, "readRequestBody", { enumerable: true, get: function () { return body_parser_1.readRequestBody; } });
|
|
19
|
+
Object.defineProperty(exports, "parseJsonBody", { enumerable: true, get: function () { return body_parser_1.parseJsonBody; } });
|
|
20
|
+
Object.defineProperty(exports, "sendJson", { enumerable: true, get: function () { return body_parser_1.sendJson; } });
|
|
21
|
+
Object.defineProperty(exports, "sendError", { enumerable: true, get: function () { return body_parser_1.sendError; } });
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ERROR_CODE_HEADER = void 0;
|
|
37
|
+
exports.resolveRequestId = resolveRequestId;
|
|
38
|
+
exports.normalizeApiErrorCodeToken = normalizeApiErrorCodeToken;
|
|
39
|
+
exports.appendRuntimeApiRequestTrace = appendRuntimeApiRequestTrace;
|
|
40
|
+
exports.getRuntimeRequestTrace = getRuntimeRequestTrace;
|
|
41
|
+
exports.startRequestTraceHandler = startRequestTraceHandler;
|
|
42
|
+
exports.finishRequestTrace = finishRequestTrace;
|
|
43
|
+
const crypto = __importStar(require("crypto"));
|
|
44
|
+
const ERROR_CODE_HEADER = 'x-nc-error-code';
|
|
45
|
+
exports.ERROR_CODE_HEADER = ERROR_CODE_HEADER;
|
|
46
|
+
const MAX_TRACE_RECORDS = 5000;
|
|
47
|
+
const traceRecords = [];
|
|
48
|
+
function resolveRequestId(req) {
|
|
49
|
+
return req.headers['x-request-id'] || crypto.randomUUID();
|
|
50
|
+
}
|
|
51
|
+
function normalizeApiErrorCodeToken(value, fallback) {
|
|
52
|
+
if (typeof value === 'string')
|
|
53
|
+
return value.trim();
|
|
54
|
+
return fallback;
|
|
55
|
+
}
|
|
56
|
+
function appendRuntimeApiRequestTrace(record) {
|
|
57
|
+
traceRecords.push(record);
|
|
58
|
+
while (traceRecords.length > MAX_TRACE_RECORDS) {
|
|
59
|
+
traceRecords.shift();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getRuntimeRequestTrace(requestId) {
|
|
63
|
+
if (requestId) {
|
|
64
|
+
return traceRecords.filter((r) => r.requestId === requestId);
|
|
65
|
+
}
|
|
66
|
+
return traceRecords.slice(-100);
|
|
67
|
+
}
|
|
68
|
+
function startRequestTraceHandler(req, res) {
|
|
69
|
+
const requestId = resolveRequestId(req);
|
|
70
|
+
const requestStartedAtMs = Date.now();
|
|
71
|
+
const requestStartedAt = new Date(requestStartedAtMs).toISOString();
|
|
72
|
+
res.setHeader('X-Request-Id', requestId);
|
|
73
|
+
return { requestId, requestStartedAtMs, requestStartedAt };
|
|
74
|
+
}
|
|
75
|
+
function finishRequestTrace(req, res, requestId, requestStartedAtMs, requestStartedAt, requestPath, ERROR_CODE_HEADER) {
|
|
76
|
+
const responseContentLengthHeader = Number(res.getHeader('content-length'));
|
|
77
|
+
const responseContentLength = Number.isFinite(responseContentLengthHeader)
|
|
78
|
+
? Math.max(0, Math.floor(responseContentLengthHeader))
|
|
79
|
+
: null;
|
|
80
|
+
const responseErrorCode = normalizeApiErrorCodeToken(res.getHeader(ERROR_CODE_HEADER), '');
|
|
81
|
+
appendRuntimeApiRequestTrace({
|
|
82
|
+
requestId,
|
|
83
|
+
method: String(req.method || 'GET').trim().toUpperCase(),
|
|
84
|
+
path: requestPath,
|
|
85
|
+
statusCode: Number(res.statusCode || 0),
|
|
86
|
+
errorCode: responseErrorCode || undefined,
|
|
87
|
+
durationMs: Number((Date.now() - requestStartedAtMs).toFixed(4)),
|
|
88
|
+
startedAt: requestStartedAt,
|
|
89
|
+
finishedAt: new Date().toISOString(),
|
|
90
|
+
responseContentType: String(res.getHeader('content-type') || '').trim(),
|
|
91
|
+
responseContentLength,
|
|
92
|
+
requestContentLength: null,
|
|
93
|
+
remoteAddress: String(req.socket?.remoteAddress || '').trim(),
|
|
94
|
+
userAgent: String(req.headers['user-agent'] || '').trim().slice(0, 180),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
@@ -48,6 +48,7 @@ const os = __importStar(require("os"));
|
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
const TOML = __importStar(require("@iarna/toml"));
|
|
50
50
|
const constants_1 = require("./constants");
|
|
51
|
+
const providerTemplates_1 = require("./providerTemplates");
|
|
51
52
|
const NOTEMD_BOOLEAN_KEYS = [
|
|
52
53
|
'developerMode',
|
|
53
54
|
'useCustomConceptNoteFolder',
|
|
@@ -142,8 +143,8 @@ exports.DEFAULT_PATH_MODE_SETTINGS = {
|
|
|
142
143
|
auto_reconstruct: true,
|
|
143
144
|
retain_history: true,
|
|
144
145
|
focus_mode: true,
|
|
145
|
-
background: '
|
|
146
|
-
bg_brightness: 1
|
|
146
|
+
background: '',
|
|
147
|
+
bg_brightness: 0.1,
|
|
147
148
|
reading_mode: 'window',
|
|
148
149
|
reader_render_mode: 'render',
|
|
149
150
|
reader_toggle_source_shortcut: 'Ctrl+M',
|
|
@@ -382,7 +383,7 @@ function normalizePathModeSettingsValue(raw) {
|
|
|
382
383
|
}
|
|
383
384
|
const brightness = readNumber(section, 'bg_brightness');
|
|
384
385
|
if (typeof brightness === 'number') {
|
|
385
|
-
merged.bg_brightness = clampNumber(brightness, 0.
|
|
386
|
+
merged.bg_brightness = clampNumber(brightness, 0.0, 0.1);
|
|
386
387
|
}
|
|
387
388
|
merged.reading_mode = normalizePathModeReadingMode(readString(section, 'reading_mode') || merged.reading_mode);
|
|
388
389
|
merged.reader_render_mode = normalizePathModeRenderMode(readString(section, 'reader_render_mode') || merged.reader_render_mode);
|
|
@@ -597,7 +598,7 @@ function extractNotemdSettingsFromAppConfig(appConfig) {
|
|
|
597
598
|
return mergedSettings;
|
|
598
599
|
}
|
|
599
600
|
function applyNotemdSettingsToAppConfig(appConfig, settings) {
|
|
600
|
-
|
|
601
|
+
let nextNotemdSection = isObjectRecord(appConfig.notemd) ? { ...appConfig.notemd } : {};
|
|
601
602
|
const activeProvider = settings.providers.find((provider) => provider.name === settings.activeProvider) ||
|
|
602
603
|
settings.providers[0] ||
|
|
603
604
|
constants_1.DEFAULT_SETTINGS.providers[0];
|
|
@@ -656,6 +657,7 @@ function applyNotemdSettingsToAppConfig(appConfig, settings) {
|
|
|
656
657
|
api_version: activeProvider.apiVersion || '',
|
|
657
658
|
temperature: activeProvider.temperature,
|
|
658
659
|
};
|
|
660
|
+
nextNotemdSection = (0, providerTemplates_1.mergeProviderTemplatesIntoNotemdSection)(nextNotemdSection);
|
|
659
661
|
return {
|
|
660
662
|
...appConfig,
|
|
661
663
|
notemd: nextNotemdSection,
|