@undefineds.co/xpod 0.3.18 → 0.3.23

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.
Files changed (115) hide show
  1. package/config/bun.json +57 -11
  2. package/config/cloud.json +14 -12
  3. package/config/local.json +16 -14
  4. package/config/xpod.json +47 -9
  5. package/dist/api/matrix/PodMatrixStore.d.ts +4 -7
  6. package/dist/api/matrix/PodMatrixStore.js +116 -148
  7. package/dist/api/matrix/PodMatrixStore.js.map +1 -1
  8. package/dist/api/matrix/types.d.ts +2 -0
  9. package/dist/api/matrix/types.js.map +1 -1
  10. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +1 -0
  11. package/dist/api/runs/PiAgentRuntimeDriver.js +4 -1
  12. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  13. package/dist/components/components.jsonld +3 -0
  14. package/dist/components/context.jsonld +71 -32
  15. package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -0
  16. package/dist/http/SubgraphSparqlHttpHandler.js +27 -4
  17. package/dist/http/SubgraphSparqlHttpHandler.js.map +1 -1
  18. package/dist/http/SubgraphSparqlHttpHandler.jsonld +4 -0
  19. package/dist/http/vector/VectorHttpHandler.d.ts +5 -1
  20. package/dist/http/vector/VectorHttpHandler.js +5 -5
  21. package/dist/http/vector/VectorHttpHandler.js.map +1 -1
  22. package/dist/http/vector/VectorHttpHandler.jsonld +40 -28
  23. package/dist/index.d.ts +5 -2
  24. package/dist/index.js +9 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/runtime/Proxy.d.ts +3 -0
  27. package/dist/runtime/Proxy.js +31 -7
  28. package/dist/runtime/Proxy.js.map +1 -1
  29. package/dist/solidfs/LocalSolidFS.js +31 -124
  30. package/dist/solidfs/LocalSolidFS.js.map +1 -1
  31. package/dist/solidfs/SolidFsPathUtils.d.ts +13 -0
  32. package/dist/solidfs/SolidFsPathUtils.js +114 -0
  33. package/dist/solidfs/SolidFsPathUtils.js.map +1 -0
  34. package/dist/solidfs/SolidFsSyncJournal.d.ts +117 -0
  35. package/dist/solidfs/SolidFsSyncJournal.js +553 -0
  36. package/dist/solidfs/SolidFsSyncJournal.js.map +1 -0
  37. package/dist/solidfs/index.d.ts +1 -0
  38. package/dist/solidfs/index.js +1 -0
  39. package/dist/solidfs/index.js.map +1 -1
  40. package/dist/solidfs/types.d.ts +1 -0
  41. package/dist/solidfs/types.js.map +1 -1
  42. package/dist/storage/SparqlUpdateResourceStore.js +94 -33
  43. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  44. package/dist/storage/accessors/MixDataAccessor.d.ts +22 -5
  45. package/dist/storage/accessors/MixDataAccessor.js +376 -61
  46. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  47. package/dist/storage/accessors/MixDataAccessor.jsonld +73 -5
  48. package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js +32 -10
  49. package/dist/storage/accessors/QuadstoreSparqlDataAccessor.js.map +1 -1
  50. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +28 -6
  51. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  52. package/dist/storage/accessors/SolidRdfDataAccessor.d.ts +45 -0
  53. package/dist/storage/accessors/SolidRdfDataAccessor.js +277 -0
  54. package/dist/storage/accessors/SolidRdfDataAccessor.js.map +1 -0
  55. package/dist/storage/accessors/SolidRdfDataAccessor.jsonld +161 -0
  56. package/dist/storage/rdf/Rdf3xIndex.d.ts +122 -0
  57. package/dist/storage/rdf/Rdf3xIndex.js +2695 -0
  58. package/dist/storage/rdf/Rdf3xIndex.js.map +1 -0
  59. package/dist/storage/rdf/Rdf3xIndex.jsonld +528 -0
  60. package/dist/storage/rdf/Rdf3xSchema.d.ts +20 -0
  61. package/dist/storage/rdf/Rdf3xSchema.js +65 -0
  62. package/dist/storage/rdf/Rdf3xSchema.js.map +1 -0
  63. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +10 -4
  64. package/dist/storage/rdf/RdfLocalQueryEngine.js +607 -127
  65. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
  66. package/dist/storage/rdf/RdfQuadIndex.d.ts +12 -1
  67. package/dist/storage/rdf/RdfQuadIndex.js +152 -22
  68. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -1
  69. package/dist/storage/rdf/RdfQuadIndex.jsonld +36 -4
  70. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +20 -2
  71. package/dist/storage/rdf/RdfSparqlAdapter.js +364 -40
  72. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -1
  73. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +60 -0
  74. package/dist/storage/rdf/RdfTermDictionary.d.ts +8 -0
  75. package/dist/storage/rdf/RdfTermDictionary.js +141 -70
  76. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -1
  77. package/dist/storage/rdf/RdfTermDictionary.jsonld +24 -0
  78. package/dist/storage/rdf/RdfTextIndex.js +10 -3
  79. package/dist/storage/rdf/RdfTextIndex.js.map +1 -1
  80. package/dist/storage/rdf/SolidRdfEngine.d.ts +15 -6
  81. package/dist/storage/rdf/SolidRdfEngine.js +218 -25
  82. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  83. package/dist/storage/rdf/SolidRdfEngine.jsonld +70 -7
  84. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +11 -7
  85. package/dist/storage/rdf/SolidRdfSparqlEngine.js +60 -47
  86. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
  87. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +9 -5
  88. package/dist/storage/rdf/index.d.ts +2 -2
  89. package/dist/storage/rdf/index.js +3 -3
  90. package/dist/storage/rdf/index.js.map +1 -1
  91. package/dist/storage/rdf/models-benchmark.d.ts +12 -1
  92. package/dist/storage/rdf/models-benchmark.js +549 -32
  93. package/dist/storage/rdf/models-benchmark.js.map +1 -1
  94. package/dist/storage/rdf/types.d.ts +81 -7
  95. package/dist/storage/rdf/types.js.map +1 -1
  96. package/dist/storage/sparql/CompatibilitySparqlEngine.d.ts +36 -0
  97. package/dist/storage/sparql/CompatibilitySparqlEngine.js +96 -0
  98. package/dist/storage/sparql/CompatibilitySparqlEngine.js.map +1 -0
  99. package/dist/storage/sparql/CompatibilitySparqlEngine.jsonld +123 -0
  100. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.d.ts +35 -0
  101. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js +112 -0
  102. package/dist/storage/sparql/CompatibilitySparqlEngineImpl.js.map +1 -0
  103. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -36
  104. package/dist/storage/sparql/SubgraphQueryEngine.js +2 -115
  105. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  106. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +1 -124
  107. package/dist/terminal/AclPermissionService.d.ts +2 -1
  108. package/dist/terminal/AclPermissionService.js +26 -3
  109. package/dist/terminal/AclPermissionService.js.map +1 -1
  110. package/dist/terminal/TerminalSessionManager.js +25 -3
  111. package/dist/terminal/TerminalSessionManager.js.map +1 -1
  112. package/package.json +1 -1
  113. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +0 -55
  114. package/dist/storage/rdf/Rdf3xTripleIndex.js +0 -1235
  115. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +0 -1
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QuintstoreSparqlEngine = exports.QuadstoreSparqlEngine = void 0;
4
+ const ComunicaQuintEngine_1 = require("./ComunicaQuintEngine");
5
+ const QuintEngine_1 = require("./QuintEngine");
6
+ /**
7
+ * @deprecated Compatibility wrapper preserved for older call sites.
8
+ * Mainline xpod uses SolidRdfEngine for server-owned Pod queries.
9
+ */
10
+ class QuadstoreSparqlEngine {
11
+ constructor(endpoint) {
12
+ const store = new QuintEngine_1.QuintEngine({ endpoint }).getStore();
13
+ this.delegate = new QuintstoreSparqlEngine(store);
14
+ }
15
+ async queryBindings(query, basePath) {
16
+ return this.delegate.queryBindings(query, basePath);
17
+ }
18
+ async queryQuads(query, basePath) {
19
+ return this.delegate.queryQuads(query, basePath);
20
+ }
21
+ async queryBoolean(query, basePath) {
22
+ return this.delegate.queryBoolean(query, basePath);
23
+ }
24
+ async queryVoid(query, basePath) {
25
+ await this.delegate.queryVoid(query, basePath);
26
+ }
27
+ async constructGraph(graph, basePath) {
28
+ return this.delegate.constructGraph(graph, basePath);
29
+ }
30
+ async listGraphs(basePath) {
31
+ return this.delegate.listGraphs(basePath);
32
+ }
33
+ async close() {
34
+ await this.delegate.close();
35
+ }
36
+ }
37
+ exports.QuadstoreSparqlEngine = QuadstoreSparqlEngine;
38
+ /**
39
+ * Comunica-backed compatibility engine.
40
+ */
41
+ class QuintstoreSparqlEngine {
42
+ constructor(store) {
43
+ this.store = store;
44
+ this.engine = new ComunicaQuintEngine_1.ComunicaQuintEngine(this.store);
45
+ this.ready = this.store.open();
46
+ }
47
+ async queryBindings(query, basePath) {
48
+ await this.ready;
49
+ return this.engine.queryBindings(query, {
50
+ baseIRI: basePath,
51
+ filters: { graph: { $startsWith: basePath } },
52
+ });
53
+ }
54
+ async queryQuads(query, basePath) {
55
+ await this.ready;
56
+ return this.engine.queryQuads(query, {
57
+ baseIRI: basePath,
58
+ filters: { graph: { $startsWith: basePath } },
59
+ });
60
+ }
61
+ async queryBoolean(query, basePath) {
62
+ await this.ready;
63
+ return this.engine.queryBoolean(query, {
64
+ baseIRI: basePath,
65
+ filters: { graph: { $startsWith: basePath } },
66
+ });
67
+ }
68
+ async queryVoid(query, basePath) {
69
+ await this.ready;
70
+ return this.engine.queryVoid(query, {
71
+ baseIRI: basePath,
72
+ filters: { graph: { $startsWith: basePath } },
73
+ });
74
+ }
75
+ async constructGraph(graph, basePath) {
76
+ await this.ready;
77
+ const constructQuery = `CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <${graph}> { ?s ?p ?o } }`;
78
+ return this.engine.queryQuads(constructQuery, {
79
+ baseIRI: basePath,
80
+ filters: { graph: { $startsWith: basePath } },
81
+ });
82
+ }
83
+ async listGraphs(basePath) {
84
+ await this.ready;
85
+ const graphs = new Set();
86
+ const query = 'SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }';
87
+ const stream = await this.engine.queryBindings(query, {
88
+ baseIRI: basePath,
89
+ filters: { graph: { $startsWith: basePath } },
90
+ });
91
+ try {
92
+ for await (const binding of stream) {
93
+ const value = binding.get('g');
94
+ if (value?.termType === 'NamedNode') {
95
+ graphs.add(value.value);
96
+ }
97
+ }
98
+ }
99
+ finally {
100
+ const close = stream.close;
101
+ if (typeof close === 'function') {
102
+ close();
103
+ }
104
+ }
105
+ return graphs;
106
+ }
107
+ async close() {
108
+ await this.store.close();
109
+ }
110
+ }
111
+ exports.QuintstoreSparqlEngine = QuintstoreSparqlEngine;
112
+ //# sourceMappingURL=CompatibilitySparqlEngineImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompatibilitySparqlEngineImpl.js","sourceRoot":"","sources":["../../../src/storage/sparql/CompatibilitySparqlEngineImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quad, Variable } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { ComunicaQuintEngine } from './ComunicaQuintEngine';\nimport { QuintEngine } from './QuintEngine';\nimport type { SparqlEngine } from './SubgraphQueryEngine';\nimport type { QuintStore } from '../quint/types';\n\n/**\n * @deprecated Compatibility wrapper preserved for older call sites.\n * Mainline xpod uses SolidRdfEngine for server-owned Pod queries.\n */\nexport class QuadstoreSparqlEngine implements SparqlEngine {\n private readonly delegate: QuintstoreSparqlEngine;\n\n public constructor(endpoint: string) {\n const store = new QuintEngine({ endpoint }).getStore();\n this.delegate = new QuintstoreSparqlEngine(store);\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n return this.delegate.queryBindings(query, basePath);\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n return this.delegate.queryQuads(query, basePath);\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n return this.delegate.queryBoolean(query, basePath);\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n await this.delegate.queryVoid(query, basePath);\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n return this.delegate.constructGraph(graph, basePath);\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n return this.delegate.listGraphs(basePath);\n }\n\n public async close(): Promise<void> {\n await this.delegate.close();\n }\n}\n\n/**\n * Comunica-backed compatibility engine.\n */\nexport class QuintstoreSparqlEngine implements SparqlEngine {\n private readonly store: QuintStore;\n private readonly engine: ComunicaQuintEngine;\n private readonly ready: Promise<void>;\n\n public constructor(store: QuintStore) {\n this.store = store;\n this.engine = new ComunicaQuintEngine(this.store);\n this.ready = this.store.open();\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n await this.ready;\n return this.engine.queryBindings(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n await this.ready;\n return this.engine.queryQuads(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n await this.ready;\n return this.engine.queryBoolean(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n await this.ready;\n return this.engine.queryVoid(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n await this.ready;\n const constructQuery = `CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <${graph}> { ?s ?p ?o } }`;\n return this.engine.queryQuads(constructQuery, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n }) as unknown as AsyncIterator<Quad>;\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n await this.ready;\n const graphs = new Set<string>();\n const query = 'SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }';\n const stream = await this.engine.queryBindings(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n\n try {\n for await (const binding of stream as unknown as AsyncIterator<Map<string | Variable, { termType?: string; value: string }>>) {\n const value = binding.get('g');\n if (value?.termType === 'NamedNode') {\n graphs.add(value.value);\n }\n }\n } finally {\n const close = (stream as unknown as { close?: () => void }).close;\n if (typeof close === 'function') {\n close();\n }\n }\n\n return graphs;\n }\n\n public async close(): Promise<void> {\n await this.store.close();\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { Quad } from '@rdfjs/types';
2
2
  import type { AsyncIterator } from 'asynciterator';
3
- import type { QuintStore } from '../quint/types';
4
3
  /**
5
4
  * SPARQL Engine interface - common abstraction for SPARQL query engines
6
5
  */
@@ -13,40 +12,6 @@ export interface SparqlEngine {
13
12
  listGraphs(basePath: string): Promise<Set<string>>;
14
13
  close(): Promise<void>;
15
14
  }
16
- /**
17
- * @deprecated Compatibility wrapper preserved for older call sites.
18
- * Mainline xpod now executes subgraph queries through QuintStore.
19
- */
20
- export declare class QuadstoreSparqlEngine implements SparqlEngine {
21
- private readonly delegate;
22
- constructor(endpoint: string);
23
- queryBindings(query: string, basePath: string): Promise<any>;
24
- queryQuads(query: string, basePath: string): Promise<any>;
25
- queryBoolean(query: string, basePath: string): Promise<boolean>;
26
- queryVoid(query: string, basePath: string): Promise<void>;
27
- constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>>;
28
- listGraphs(basePath: string): Promise<Set<string>>;
29
- close(): Promise<void>;
30
- }
31
- /**
32
- * QuintStore-based SPARQL engine implementation
33
- *
34
- * Uses security filters to enforce access boundaries,
35
- * which are pushed down to the storage layer.
36
- */
37
- export declare class QuintstoreSparqlEngine implements SparqlEngine {
38
- private readonly store;
39
- private readonly engine;
40
- private readonly ready;
41
- constructor(store: QuintStore);
42
- queryBindings(query: string, basePath: string): Promise<any>;
43
- queryQuads(query: string, basePath: string): Promise<any>;
44
- queryBoolean(query: string, basePath: string): Promise<boolean>;
45
- queryVoid(query: string, basePath: string): Promise<void>;
46
- constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>>;
47
- listGraphs(basePath: string): Promise<Set<string>>;
48
- close(): Promise<void>;
49
- }
50
15
  /**
51
16
  * SubgraphQueryEngine - SPARQL engine with subgraph (tenant) isolation
52
17
  *
@@ -57,7 +22,7 @@ export declare class SubgraphQueryEngine {
57
22
  private readonly impl;
58
23
  /**
59
24
  * Create a SubgraphQueryEngine
60
- * @param engine - A SparqlEngine implementation (QuadstoreSparqlEngine or QuintstoreSparqlEngine)
25
+ * @param engine - A SparqlEngine implementation
61
26
  */
62
27
  constructor(engine: SparqlEngine);
63
28
  queryBindings(query: string, basePath: string): Promise<any>;
@@ -1,120 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SubgraphQueryEngine = exports.QuintstoreSparqlEngine = exports.QuadstoreSparqlEngine = void 0;
3
+ exports.SubgraphQueryEngine = void 0;
4
4
  const global_logger_factory_1 = require("global-logger-factory");
5
- const ComunicaQuintEngine_1 = require("./ComunicaQuintEngine");
6
- const QuintEngine_1 = require("./QuintEngine");
7
- /**
8
- * @deprecated Compatibility wrapper preserved for older call sites.
9
- * Mainline xpod now executes subgraph queries through QuintStore.
10
- */
11
- class QuadstoreSparqlEngine {
12
- constructor(endpoint) {
13
- const store = new QuintEngine_1.QuintEngine({ endpoint }).getStore();
14
- this.delegate = new QuintstoreSparqlEngine(store);
15
- }
16
- async queryBindings(query, basePath) {
17
- return this.delegate.queryBindings(query, basePath);
18
- }
19
- async queryQuads(query, basePath) {
20
- return this.delegate.queryQuads(query, basePath);
21
- }
22
- async queryBoolean(query, basePath) {
23
- return this.delegate.queryBoolean(query, basePath);
24
- }
25
- async queryVoid(query, basePath) {
26
- await this.delegate.queryVoid(query, basePath);
27
- }
28
- async constructGraph(graph, basePath) {
29
- return this.delegate.constructGraph(graph, basePath);
30
- }
31
- async listGraphs(basePath) {
32
- return this.delegate.listGraphs(basePath);
33
- }
34
- async close() {
35
- await this.delegate.close();
36
- }
37
- }
38
- exports.QuadstoreSparqlEngine = QuadstoreSparqlEngine;
39
- /**
40
- * QuintStore-based SPARQL engine implementation
41
- *
42
- * Uses security filters to enforce access boundaries,
43
- * which are pushed down to the storage layer.
44
- */
45
- class QuintstoreSparqlEngine {
46
- constructor(store) {
47
- this.store = store;
48
- this.engine = new ComunicaQuintEngine_1.ComunicaQuintEngine(this.store);
49
- this.ready = this.store.open();
50
- }
51
- async queryBindings(query, basePath) {
52
- await this.ready;
53
- return this.engine.queryBindings(query, {
54
- baseIRI: basePath,
55
- filters: { graph: { $startsWith: basePath } },
56
- });
57
- }
58
- async queryQuads(query, basePath) {
59
- await this.ready;
60
- return this.engine.queryQuads(query, {
61
- baseIRI: basePath,
62
- filters: { graph: { $startsWith: basePath } },
63
- });
64
- }
65
- async queryBoolean(query, basePath) {
66
- await this.ready;
67
- return this.engine.queryBoolean(query, {
68
- baseIRI: basePath,
69
- filters: { graph: { $startsWith: basePath } },
70
- });
71
- }
72
- async queryVoid(query, basePath) {
73
- await this.ready;
74
- // UPDATE queries have their own graph validation in SubgraphSparqlHttpHandler
75
- return this.engine.queryVoid(query, {
76
- baseIRI: basePath,
77
- filters: { graph: { $startsWith: basePath } },
78
- });
79
- }
80
- async constructGraph(graph, basePath) {
81
- await this.ready;
82
- // CONSTRUCT with explicit graph IRI - security filter still applies
83
- const constructQuery = `CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <${graph}> { ?s ?p ?o } }`;
84
- return this.engine.queryQuads(constructQuery, {
85
- baseIRI: basePath,
86
- filters: { graph: { $startsWith: basePath } },
87
- });
88
- }
89
- async listGraphs(basePath) {
90
- await this.ready;
91
- const graphs = new Set();
92
- const query = `SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }`;
93
- const stream = await this.engine.queryBindings(query, {
94
- baseIRI: basePath,
95
- filters: { graph: { $startsWith: basePath } },
96
- });
97
- try {
98
- for await (const binding of stream) {
99
- const value = binding.get('g');
100
- if (value && typeof value === 'object' && 'termType' in value && value.termType === 'NamedNode') {
101
- graphs.add(value.value);
102
- }
103
- }
104
- }
105
- finally {
106
- const close = stream.close;
107
- if (typeof close === 'function') {
108
- close();
109
- }
110
- }
111
- return graphs;
112
- }
113
- async close() {
114
- await this.store.close();
115
- }
116
- }
117
- exports.QuintstoreSparqlEngine = QuintstoreSparqlEngine;
118
5
  /**
119
6
  * SubgraphQueryEngine - SPARQL engine with subgraph (tenant) isolation
120
7
  *
@@ -123,7 +10,7 @@ exports.QuintstoreSparqlEngine = QuintstoreSparqlEngine;
123
10
  class SubgraphQueryEngine {
124
11
  /**
125
12
  * Create a SubgraphQueryEngine
126
- * @param engine - A SparqlEngine implementation (QuadstoreSparqlEngine or QuintstoreSparqlEngine)
13
+ * @param engine - A SparqlEngine implementation
127
14
  */
128
15
  constructor(engine) {
129
16
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
@@ -1 +1 @@
1
- {"version":3,"file":"SubgraphQueryEngine.js","sourceRoot":"","sources":["../../../src/storage/sparql/SubgraphQueryEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quad } from '@rdfjs/types';\nimport type { Bindings } from '@comunica/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { ComunicaQuintEngine } from './ComunicaQuintEngine';\nimport { QuintEngine } from './QuintEngine';\nimport type { QuintStore } from '../quint/types';\n\n/**\n * SPARQL Engine interface - common abstraction for SPARQL query engines\n */\nexport interface SparqlEngine {\n queryBindings(query: string, basePath: string): Promise<any>;\n queryQuads(query: string, basePath: string): Promise<any>;\n queryBoolean(query: string, basePath: string): Promise<boolean>;\n queryVoid(query: string, basePath: string): Promise<void>;\n constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>>;\n listGraphs(basePath: string): Promise<Set<string>>;\n close(): Promise<void>;\n}\n\n/**\n * @deprecated Compatibility wrapper preserved for older call sites.\n * Mainline xpod now executes subgraph queries through QuintStore.\n */\nexport class QuadstoreSparqlEngine implements SparqlEngine {\n private readonly delegate: QuintstoreSparqlEngine;\n\n public constructor(endpoint: string) {\n const store = new QuintEngine({ endpoint }).getStore();\n this.delegate = new QuintstoreSparqlEngine(store);\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n return this.delegate.queryBindings(query, basePath);\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n return this.delegate.queryQuads(query, basePath);\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n return this.delegate.queryBoolean(query, basePath);\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n await this.delegate.queryVoid(query, basePath);\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n return this.delegate.constructGraph(graph, basePath);\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n return this.delegate.listGraphs(basePath);\n }\n\n public async close(): Promise<void> {\n await this.delegate.close();\n }\n}\n\n/**\n * QuintStore-based SPARQL engine implementation\n * \n * Uses security filters to enforce access boundaries,\n * which are pushed down to the storage layer.\n */\nexport class QuintstoreSparqlEngine implements SparqlEngine {\n private readonly store: QuintStore;\n private readonly engine: ComunicaQuintEngine;\n private readonly ready: Promise<void>;\n\n public constructor(store: QuintStore) {\n this.store = store;\n this.engine = new ComunicaQuintEngine(this.store);\n this.ready = this.store.open();\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n await this.ready;\n return this.engine.queryBindings(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n await this.ready;\n return this.engine.queryQuads(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n await this.ready;\n return this.engine.queryBoolean(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n await this.ready;\n // UPDATE queries have their own graph validation in SubgraphSparqlHttpHandler\n return this.engine.queryVoid(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n await this.ready;\n // CONSTRUCT with explicit graph IRI - security filter still applies\n const constructQuery = `CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <${graph}> { ?s ?p ?o } }`;\n return this.engine.queryQuads(constructQuery, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n }) as unknown as AsyncIterator<Quad>;\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n await this.ready;\n const graphs = new Set<string>();\n \n const query = `SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }`;\n \n const stream = await this.engine.queryBindings(query, {\n baseIRI: basePath,\n filters: { graph: { $startsWith: basePath } },\n });\n \n try {\n for await (const binding of stream as unknown as AsyncIterator<Bindings>) {\n const value = binding.get('g');\n if (value && typeof value === 'object' && 'termType' in value && value.termType === 'NamedNode') {\n graphs.add(value.value);\n }\n }\n } finally {\n const close = (stream as unknown as { close?: () => void }).close;\n if (typeof close === 'function') {\n close();\n }\n }\n \n return graphs;\n }\n\n public async close(): Promise<void> {\n await this.store.close();\n }\n}\n\n/**\n * SubgraphQueryEngine - SPARQL engine with subgraph (tenant) isolation\n * \n * Wraps a SparqlEngine implementation for use in the system.\n */\nexport class SubgraphQueryEngine {\n private readonly logger = getLoggerFor(this);\n private readonly impl: SparqlEngine;\n\n /**\n * Create a SubgraphQueryEngine\n * @param engine - A SparqlEngine implementation (QuadstoreSparqlEngine or QuintstoreSparqlEngine)\n */\n public constructor(engine: SparqlEngine) {\n this.impl = engine;\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n return this.impl.queryBindings(query, basePath);\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n return this.impl.queryQuads(query, basePath);\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n return this.impl.queryBoolean(query, basePath);\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n return this.impl.queryVoid(query, basePath);\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n return this.impl.constructGraph(graph, basePath);\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n return this.impl.listGraphs(basePath);\n }\n\n public async close(): Promise<void> {\n return this.impl.close();\n }\n}\n"]}
1
+ {"version":3,"file":"SubgraphQueryEngine.js","sourceRoot":"","sources":["../../../src/storage/sparql/SubgraphQueryEngine.ts"],"names":[],"mappings":";;;AAEA,iEAAqD;AAerD;;;;GAIG;AACH,MAAa,mBAAmB;IAI9B;;;OAGG;IACH,YAAmB,MAAoB;QAPtB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAQ3C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,QAAgB;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,QAAgB;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,QAAgB;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,QAAgB;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB;QACzD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAgB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AAvCD,kDAuCC","sourcesContent":["import type { Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport { getLoggerFor } from 'global-logger-factory';\n\n/**\n * SPARQL Engine interface - common abstraction for SPARQL query engines\n */\nexport interface SparqlEngine {\n queryBindings(query: string, basePath: string): Promise<any>;\n queryQuads(query: string, basePath: string): Promise<any>;\n queryBoolean(query: string, basePath: string): Promise<boolean>;\n queryVoid(query: string, basePath: string): Promise<void>;\n constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>>;\n listGraphs(basePath: string): Promise<Set<string>>;\n close(): Promise<void>;\n}\n\n/**\n * SubgraphQueryEngine - SPARQL engine with subgraph (tenant) isolation\n * \n * Wraps a SparqlEngine implementation for use in the system.\n */\nexport class SubgraphQueryEngine {\n private readonly logger = getLoggerFor(this);\n private readonly impl: SparqlEngine;\n\n /**\n * Create a SubgraphQueryEngine\n * @param engine - A SparqlEngine implementation\n */\n public constructor(engine: SparqlEngine) {\n this.impl = engine;\n }\n\n public async queryBindings(query: string, basePath: string): Promise<any> {\n return this.impl.queryBindings(query, basePath);\n }\n\n public async queryQuads(query: string, basePath: string): Promise<any> {\n return this.impl.queryQuads(query, basePath);\n }\n\n public async queryBoolean(query: string, basePath: string): Promise<boolean> {\n return this.impl.queryBoolean(query, basePath);\n }\n\n public async queryVoid(query: string, basePath: string): Promise<void> {\n return this.impl.queryVoid(query, basePath);\n }\n\n public async constructGraph(graph: string, basePath: string): Promise<AsyncIterator<Quad>> {\n return this.impl.constructGraph(graph, basePath);\n }\n\n public async listGraphs(basePath: string): Promise<Set<string>> {\n return this.impl.listGraphs(basePath);\n }\n\n public async close(): Promise<void> {\n return this.impl.close();\n }\n}\n"]}
@@ -51,7 +51,7 @@
51
51
  {
52
52
  "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SubgraphQueryEngine_engine",
53
53
  "range": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SparqlEngine",
54
- "comment": "A SparqlEngine implementation (QuadstoreSparqlEngine or QuintstoreSparqlEngine)"
54
+ "comment": "A SparqlEngine implementation"
55
55
  }
56
56
  ],
57
57
  "memberFields": [
@@ -101,129 +101,6 @@
101
101
  "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SubgraphQueryEngine_engine"
102
102
  }
103
103
  ]
104
- },
105
- {
106
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine",
107
- "@type": "Class",
108
- "requireElement": "QuadstoreSparqlEngine",
109
- "extends": [
110
- "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SparqlEngine"
111
- ],
112
- "parameters": [
113
- {
114
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine_endpoint",
115
- "range": "xsd:string"
116
- }
117
- ],
118
- "memberFields": [
119
- {
120
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_delegate",
121
- "memberFieldName": "delegate"
122
- },
123
- {
124
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_constructor",
125
- "memberFieldName": "constructor"
126
- },
127
- {
128
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_queryBindings",
129
- "memberFieldName": "queryBindings"
130
- },
131
- {
132
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_queryQuads",
133
- "memberFieldName": "queryQuads"
134
- },
135
- {
136
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_queryBoolean",
137
- "memberFieldName": "queryBoolean"
138
- },
139
- {
140
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_queryVoid",
141
- "memberFieldName": "queryVoid"
142
- },
143
- {
144
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_constructGraph",
145
- "memberFieldName": "constructGraph"
146
- },
147
- {
148
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_listGraphs",
149
- "memberFieldName": "listGraphs"
150
- },
151
- {
152
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine__member_close",
153
- "memberFieldName": "close"
154
- }
155
- ],
156
- "constructorArguments": [
157
- {
158
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuadstoreSparqlEngine_endpoint"
159
- }
160
- ]
161
- },
162
- {
163
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine",
164
- "@type": "Class",
165
- "requireElement": "QuintstoreSparqlEngine",
166
- "extends": [
167
- "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SparqlEngine"
168
- ],
169
- "comment": "QuintStore-based SPARQL engine implementation Uses security filters to enforce access boundaries, which are pushed down to the storage layer.",
170
- "parameters": [
171
- {
172
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine_store",
173
- "range": "undefineds:dist/storage/quint/types.jsonld#QuintStore"
174
- }
175
- ],
176
- "memberFields": [
177
- {
178
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_store",
179
- "memberFieldName": "store"
180
- },
181
- {
182
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_engine",
183
- "memberFieldName": "engine"
184
- },
185
- {
186
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_ready",
187
- "memberFieldName": "ready"
188
- },
189
- {
190
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_constructor",
191
- "memberFieldName": "constructor"
192
- },
193
- {
194
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_queryBindings",
195
- "memberFieldName": "queryBindings"
196
- },
197
- {
198
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_queryQuads",
199
- "memberFieldName": "queryQuads"
200
- },
201
- {
202
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_queryBoolean",
203
- "memberFieldName": "queryBoolean"
204
- },
205
- {
206
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_queryVoid",
207
- "memberFieldName": "queryVoid"
208
- },
209
- {
210
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_constructGraph",
211
- "memberFieldName": "constructGraph"
212
- },
213
- {
214
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_listGraphs",
215
- "memberFieldName": "listGraphs"
216
- },
217
- {
218
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine__member_close",
219
- "memberFieldName": "close"
220
- }
221
- ],
222
- "constructorArguments": [
223
- {
224
- "@id": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#QuintstoreSparqlEngine_store"
225
- }
226
- ]
227
104
  }
228
105
  ]
229
106
  }
@@ -1,9 +1,10 @@
1
+ import { SubgraphQueryEngine } from '../storage/sparql/SubgraphQueryEngine';
1
2
  export declare class AclPermissionService {
2
3
  protected readonly logger: import("global-logger-factory").Logger<unknown>;
3
4
  private engine?;
4
5
  private readonly sparqlEndpoint?;
5
6
  constructor(sparqlEndpoint?: string);
6
- private getEngine;
7
+ protected getEngine(): Promise<SubgraphQueryEngine>;
7
8
  /**
8
9
  * Check if a user has acl:Control permission on a resource.
9
10
  *
@@ -1,4 +1,27 @@
1
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.AclPermissionService = void 0;
4
27
  /**
@@ -19,7 +42,7 @@ class AclPermissionService {
19
42
  if (!this.sparqlEndpoint) {
20
43
  throw new Error('SPARQL endpoint not configured');
21
44
  }
22
- this.engine = new SubgraphQueryEngine_1.SubgraphQueryEngine(new SubgraphQueryEngine_1.QuadstoreSparqlEngine(this.sparqlEndpoint));
45
+ this.engine = Promise.resolve().then(() => __importStar(require('../storage/sparql/CompatibilitySparqlEngine'))).then(({ QuadstoreSparqlEngine }) => new SubgraphQueryEngine_1.SubgraphQueryEngine(new QuadstoreSparqlEngine(this.sparqlEndpoint)));
23
46
  }
24
47
  return this.engine;
25
48
  }
@@ -36,7 +59,7 @@ class AclPermissionService {
36
59
  * @returns true if user has Control permission
37
60
  */
38
61
  async hasControlPermission(userId, resourceUrl) {
39
- const engine = this.getEngine();
62
+ const engine = await this.getEngine();
40
63
  // Normalize resource URL (remove trailing slash for consistency)
41
64
  const normalizedResource = resourceUrl.endsWith('/')
42
65
  ? resourceUrl.slice(0, -1)
@@ -90,7 +113,7 @@ class AclPermissionService {
90
113
  * @returns Array of resource URLs with Control permission
91
114
  */
92
115
  async getControlledResources(userId, basePath) {
93
- const engine = this.getEngine();
116
+ const engine = await this.getEngine();
94
117
  const query = `
95
118
  PREFIX acl: <http://www.w3.org/ns/auth/acl#>
96
119
  PREFIX foaf: <http://xmlns.com/foaf/0.1/>
@@ -1 +1 @@
1
- {"version":3,"file":"AclPermissionService.js","sourceRoot":"","sources":["../../src/terminal/AclPermissionService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ACL Permission Service for Terminal Sidecar\n *\n * Queries Quadstore to check if a user has acl:Control permission\n * on a resource, which is required for Terminal access.\n */\nimport { getLoggerFor } from 'global-logger-factory';\nimport { SubgraphQueryEngine, QuadstoreSparqlEngine } from '../storage/sparql/SubgraphQueryEngine';\n\nexport class AclPermissionService {\n protected readonly logger = getLoggerFor(this);\n private engine?: SubgraphQueryEngine;\n private readonly sparqlEndpoint?: string;\n\n public constructor(sparqlEndpoint?: string) {\n this.sparqlEndpoint = sparqlEndpoint;\n }\n\n private getEngine(): SubgraphQueryEngine {\n if (!this.engine) {\n if (!this.sparqlEndpoint) {\n throw new Error('SPARQL endpoint not configured');\n }\n this.engine = new SubgraphQueryEngine(new QuadstoreSparqlEngine(this.sparqlEndpoint));\n }\n return this.engine;\n }\n\n /**\n * Check if a user has acl:Control permission on a resource.\n *\n * Checks for:\n * - Direct agent match: acl:agent <userId>\n * - Public access: acl:agentClass foaf:Agent\n * - Authenticated access: acl:agentClass acl:AuthenticatedAgent\n *\n * @param userId - The WebID of the user\n * @param resourceUrl - The URL of the resource to check\n * @returns true if user has Control permission\n */\n public async hasControlPermission(userId: string, resourceUrl: string): Promise<boolean> {\n const engine = this.getEngine();\n\n // Normalize resource URL (remove trailing slash for consistency)\n const normalizedResource = resourceUrl.endsWith('/')\n ? resourceUrl.slice(0, -1)\n : resourceUrl;\n\n // Also check the container version (with trailing slash)\n const containerResource = normalizedResource + '/';\n\n const query = `\n PREFIX acl: <http://www.w3.org/ns/auth/acl#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n\n ASK {\n ?auth a acl:Authorization ;\n acl:mode acl:Control .\n\n # Match either the exact resource or container\n {\n ?auth acl:accessTo <${normalizedResource}> .\n } UNION {\n ?auth acl:accessTo <${containerResource}> .\n } UNION {\n ?auth acl:default <${normalizedResource}> .\n } UNION {\n ?auth acl:default <${containerResource}> .\n }\n\n # Match user by agent, agentClass, or agentGroup\n {\n ?auth acl:agent <${userId}> .\n } UNION {\n ?auth acl:agentClass foaf:Agent .\n } UNION {\n ?auth acl:agentClass acl:AuthenticatedAgent .\n }\n }\n `;\n\n try {\n const hasPermission = await engine.queryBoolean(query, resourceUrl);\n this.logger.debug(`ACL check: user=${userId}, resource=${resourceUrl}, hasControl=${hasPermission}`);\n return hasPermission;\n } catch (error) {\n this.logger.error(`ACL query failed: ${error}`);\n return false;\n }\n }\n\n /**\n * Get all resources where user has Control permission under a base path.\n *\n * @param userId - The WebID of the user\n * @param basePath - The base path to search under\n * @returns Array of resource URLs with Control permission\n */\n public async getControlledResources(userId: string, basePath: string): Promise<string[]> {\n const engine = this.getEngine();\n\n const query = `\n PREFIX acl: <http://www.w3.org/ns/auth/acl#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n\n SELECT DISTINCT ?resource WHERE {\n ?auth a acl:Authorization ;\n acl:mode acl:Control .\n\n # Get the resource\n {\n ?auth acl:accessTo ?resource .\n } UNION {\n ?auth acl:default ?resource .\n }\n\n # Filter by base path\n FILTER(STRSTARTS(STR(?resource), \"${basePath}\"))\n\n # Match user\n {\n ?auth acl:agent <${userId}> .\n } UNION {\n ?auth acl:agentClass foaf:Agent .\n } UNION {\n ?auth acl:agentClass acl:AuthenticatedAgent .\n }\n }\n `;\n\n try {\n const resources: string[] = [];\n const stream = await engine.queryBindings(query, basePath);\n\n for await (const binding of stream) {\n const value = binding.get('resource');\n if (value && typeof value === 'object' && 'value' in value) {\n resources.push((value as { value: string }).value);\n }\n }\n\n this.logger.debug(`Found ${resources.length} controlled resources for user=${userId} under ${basePath}`);\n return resources;\n } catch (error) {\n this.logger.error(`ACL query failed: ${error}`);\n return [];\n }\n }\n}\n"]}
1
+ {"version":3,"file":"AclPermissionService.js","sourceRoot":"","sources":["../../src/terminal/AclPermissionService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ACL Permission Service for Terminal Sidecar\n *\n * Queries Quadstore to check if a user has acl:Control permission\n * on a resource, which is required for Terminal access.\n */\nimport { getLoggerFor } from 'global-logger-factory';\nimport { SubgraphQueryEngine } from '../storage/sparql/SubgraphQueryEngine';\n\nexport class AclPermissionService {\n protected readonly logger = getLoggerFor(this);\n private engine?: Promise<SubgraphQueryEngine>;\n private readonly sparqlEndpoint?: string;\n\n public constructor(sparqlEndpoint?: string) {\n this.sparqlEndpoint = sparqlEndpoint;\n }\n\n protected getEngine(): Promise<SubgraphQueryEngine> {\n if (!this.engine) {\n if (!this.sparqlEndpoint) {\n throw new Error('SPARQL endpoint not configured');\n }\n this.engine = import('../storage/sparql/CompatibilitySparqlEngine')\n .then(({ QuadstoreSparqlEngine }) => new SubgraphQueryEngine(new QuadstoreSparqlEngine(this.sparqlEndpoint!)));\n }\n return this.engine;\n }\n\n /**\n * Check if a user has acl:Control permission on a resource.\n *\n * Checks for:\n * - Direct agent match: acl:agent <userId>\n * - Public access: acl:agentClass foaf:Agent\n * - Authenticated access: acl:agentClass acl:AuthenticatedAgent\n *\n * @param userId - The WebID of the user\n * @param resourceUrl - The URL of the resource to check\n * @returns true if user has Control permission\n */\n public async hasControlPermission(userId: string, resourceUrl: string): Promise<boolean> {\n const engine = await this.getEngine();\n\n // Normalize resource URL (remove trailing slash for consistency)\n const normalizedResource = resourceUrl.endsWith('/')\n ? resourceUrl.slice(0, -1)\n : resourceUrl;\n\n // Also check the container version (with trailing slash)\n const containerResource = normalizedResource + '/';\n\n const query = `\n PREFIX acl: <http://www.w3.org/ns/auth/acl#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n\n ASK {\n ?auth a acl:Authorization ;\n acl:mode acl:Control .\n\n # Match either the exact resource or container\n {\n ?auth acl:accessTo <${normalizedResource}> .\n } UNION {\n ?auth acl:accessTo <${containerResource}> .\n } UNION {\n ?auth acl:default <${normalizedResource}> .\n } UNION {\n ?auth acl:default <${containerResource}> .\n }\n\n # Match user by agent, agentClass, or agentGroup\n {\n ?auth acl:agent <${userId}> .\n } UNION {\n ?auth acl:agentClass foaf:Agent .\n } UNION {\n ?auth acl:agentClass acl:AuthenticatedAgent .\n }\n }\n `;\n\n try {\n const hasPermission = await engine.queryBoolean(query, resourceUrl);\n this.logger.debug(`ACL check: user=${userId}, resource=${resourceUrl}, hasControl=${hasPermission}`);\n return hasPermission;\n } catch (error) {\n this.logger.error(`ACL query failed: ${error}`);\n return false;\n }\n }\n\n /**\n * Get all resources where user has Control permission under a base path.\n *\n * @param userId - The WebID of the user\n * @param basePath - The base path to search under\n * @returns Array of resource URLs with Control permission\n */\n public async getControlledResources(userId: string, basePath: string): Promise<string[]> {\n const engine = await this.getEngine();\n\n const query = `\n PREFIX acl: <http://www.w3.org/ns/auth/acl#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n\n SELECT DISTINCT ?resource WHERE {\n ?auth a acl:Authorization ;\n acl:mode acl:Control .\n\n # Get the resource\n {\n ?auth acl:accessTo ?resource .\n } UNION {\n ?auth acl:default ?resource .\n }\n\n # Filter by base path\n FILTER(STRSTARTS(STR(?resource), \"${basePath}\"))\n\n # Match user\n {\n ?auth acl:agent <${userId}> .\n } UNION {\n ?auth acl:agentClass foaf:Agent .\n } UNION {\n ?auth acl:agentClass acl:AuthenticatedAgent .\n }\n }\n `;\n\n try {\n const resources: string[] = [];\n const stream = await engine.queryBindings(query, basePath);\n\n for await (const binding of stream) {\n const value = binding.get('resource');\n if (value && typeof value === 'object' && 'value' in value) {\n resources.push((value as { value: string }).value);\n }\n }\n\n this.logger.debug(`Found ${resources.length} controlled resources for user=${userId} under ${basePath}`);\n return resources;\n } catch (error) {\n this.logger.error(`ACL query failed: ${error}`);\n return [];\n }\n }\n}\n"]}
@@ -1,10 +1,32 @@
1
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.TerminalSessionManager = void 0;
4
27
  const crypto_1 = require("crypto");
5
28
  const global_logger_factory_1 = require("global-logger-factory");
6
29
  const TerminalSession_1 = require("./TerminalSession");
7
- const AclPermissionService_1 = require("./AclPermissionService");
8
30
  const types_1 = require("./types");
9
31
  const DEFAULT_OPTIONS = {
10
32
  maxSessionsPerUser: 5,
@@ -22,7 +44,7 @@ class TerminalSessionManager {
22
44
  this.options = { ...DEFAULT_OPTIONS, ...options };
23
45
  // Initialize ACL service if SPARQL endpoint is provided
24
46
  if (this.options.sparqlEndpoint) {
25
- this.aclService = new AclPermissionService_1.AclPermissionService(this.options.sparqlEndpoint);
47
+ this.aclService = Promise.resolve().then(() => __importStar(require('./AclPermissionService'))).then(({ AclPermissionService }) => new AclPermissionService(this.options.sparqlEndpoint));
26
48
  }
27
49
  }
28
50
  /**
@@ -60,7 +82,7 @@ class TerminalSessionManager {
60
82
  this.logger.warn(`Cannot map workdir to URL: ${workdir}`);
61
83
  return false;
62
84
  }
63
- return this.aclService.hasControlPermission(userId, resourceUrl);
85
+ return (await this.aclService).hasControlPermission(userId, resourceUrl);
64
86
  }
65
87
  /**
66
88
  * Create a new terminal session