@hahnpro/hpc-api 2026.9.10 → 2026.9.11

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/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @hahnpro/hpc-api
2
2
 
3
+ # 2026.9.11
4
+
5
+ - Added `api.knowledge` client, shared types and mock support for pages, revisions, discovery and lifecycle operations #5262
6
+
3
7
  # 2026.9.10
4
8
 
5
9
  - Updated AI interface and added limit to `getValuesOfPeriod` of timeseries service
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hahnpro/hpc-api",
3
- "version": "2026.9.10",
3
+ "version": "2026.9.11",
4
4
  "description": "Module for easy access to the HahnPRO Cloud API",
5
5
  "license": "MIT",
6
6
  "author": {
package/src/lib/api.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { TimeSeriesValueFeedManagementApi } from './interfaces';
2
2
  import { QueueOptions } from './queue';
3
- import { AiService, AlertService, AssetService, AssetTypesService, AuthzService, ContentService, CrmService, DataspaceService, EndpointService, EventService, FlangeSkillControlService, FlowDeploymentService, FlowFunctionService, FlowModuleService, FlowService, HttpClientService, LabelService, LogbookService, NotificationRuleService, NotificationService, ObjectReferenceService, OrganizationsAdministrationService, OrganizationsResourcesService, OrganizationsService, ProxyService, SearchService, TaskService, TimeSeriesService, UserService, VaultService } from './services';
3
+ import { AiService, AlertService, AssetService, AssetTypesService, AuthzService, ContentService, CrmService, DataspaceService, EndpointService, EventService, FlangeSkillControlService, FlowDeploymentService, FlowFunctionService, FlowModuleService, FlowService, HttpClientService, KnowledgeService, LabelService, LogbookService, NotificationRuleService, NotificationService, ObjectReferenceService, OrganizationsAdministrationService, OrganizationsResourcesService, OrganizationsService, ProxyService, SearchService, TaskService, TimeSeriesService, UserService, VaultService } from './services';
4
4
  export declare class API {
5
5
  readonly httpClient?: HttpClientService;
6
6
  ai: AiService;
@@ -18,6 +18,7 @@ export declare class API {
18
18
  flowDeployments: FlowDeploymentService;
19
19
  flowFunctions: FlowFunctionService;
20
20
  flowModules: FlowModuleService;
21
+ knowledge: KnowledgeService;
21
22
  labels: LabelService;
22
23
  logbook: LogbookService;
23
24
  objectReferences: ObjectReferenceService;
package/src/lib/api.js CHANGED
@@ -49,6 +49,7 @@ class API {
49
49
  this.flowDeployments = new services_1.FlowDeploymentService(this.httpClient);
50
50
  this.flowFunctions = new services_1.FlowFunctionService(this.httpClient);
51
51
  this.flowModules = new services_1.FlowModuleService(this.httpClient);
52
+ this.knowledge = new services_1.KnowledgeService(this.httpClient);
52
53
  this.labels = new services_1.LabelService(this.httpClient);
53
54
  this.logbook = new services_1.LogbookService(this.httpClient);
54
55
  this.objectReferences = new services_1.ObjectReferenceService(this.httpClient);
@@ -77,3 +77,4 @@ export { WebSocketMessageType } from './websockets.interface';
77
77
  export type { AiThreadListChangedEvent, WebSocketError } from './websockets.interface';
78
78
  export * from './authz';
79
79
  export * from './crm-autonomy.interface';
80
+ export * from './knowledge.interface';
@@ -123,3 +123,4 @@ var websockets_interface_1 = require("./websockets.interface");
123
123
  Object.defineProperty(exports, "WebSocketMessageType", { enumerable: true, get: function () { return websockets_interface_1.WebSocketMessageType; } });
124
124
  tslib_1.__exportStar(require("./authz"), exports);
125
125
  tslib_1.__exportStar(require("./crm-autonomy.interface"), exports);
126
+ tslib_1.__exportStar(require("./knowledge.interface"), exports);
@@ -0,0 +1,142 @@
1
+ import type { Author } from './author.interface';
2
+ import type { Owner } from './owner.interface';
3
+ import { ResourceType } from './resource.interface';
4
+ export declare const KNOWLEDGE_TARGET_TYPES: readonly [ResourceType.KNOWLEDGE, ResourceType.ASSET, ResourceType.ASSETTYPE, ResourceType.CONTENT, ResourceType.EVENT, ResourceType.TASK];
5
+ export interface KnowledgeTarget {
6
+ resourceType: (typeof KNOWLEDGE_TARGET_TYPES)[number];
7
+ id: string;
8
+ }
9
+ export interface KnowledgeSource {
10
+ id: string;
11
+ kind: 'observation' | 'resource' | 'external';
12
+ target?: KnowledgeTarget;
13
+ text?: string;
14
+ url?: string;
15
+ version?: string;
16
+ locator?: string;
17
+ /** False means the target was not readable at response time. */
18
+ available?: boolean;
19
+ }
20
+ export interface KnowledgeLink {
21
+ target: KnowledgeTarget;
22
+ explicit: boolean;
23
+ parsed: boolean;
24
+ }
25
+ export type KnowledgeApplicability = {
26
+ mode: 'unknown' | 'organization';
27
+ } | {
28
+ mode: 'assets';
29
+ assetIds: string[];
30
+ } | {
31
+ mode: 'subtree';
32
+ rootId: string;
33
+ assetTypeId?: string;
34
+ } | {
35
+ mode: 'assetType';
36
+ assetTypeId: string;
37
+ };
38
+ export interface KnowledgeConfirmation {
39
+ actor: Author;
40
+ at: string;
41
+ revision: number;
42
+ }
43
+ export interface KnowledgePage {
44
+ id: string;
45
+ owner: Owner;
46
+ title: string;
47
+ body: string;
48
+ type: string;
49
+ description?: string;
50
+ tags: string[];
51
+ resource?: KnowledgeTarget;
52
+ origin: {
53
+ actor: Author;
54
+ at: string;
55
+ context?: KnowledgeTarget;
56
+ };
57
+ sources: KnowledgeSource[];
58
+ links: KnowledgeLink[];
59
+ applicability: KnowledgeApplicability;
60
+ readPermissions: string[];
61
+ readWritePermissions: string[];
62
+ state: 'active' | 'withdrawn';
63
+ staleAfter?: string;
64
+ confirmations: KnowledgeConfirmation[];
65
+ revision: number;
66
+ recordVersion: number;
67
+ createdBy: Author;
68
+ updatedBy: Author;
69
+ createdAt: string;
70
+ updatedAt: string;
71
+ deletedAt?: string;
72
+ }
73
+ export interface CreateKnowledge {
74
+ title: string;
75
+ body: string;
76
+ type?: string;
77
+ description?: string;
78
+ tags?: string[];
79
+ /** `null` clears the value on update. */
80
+ resource?: KnowledgeTarget | null;
81
+ /** `null` clears the value on update. */
82
+ originContext?: KnowledgeTarget | null;
83
+ sources?: Omit<KnowledgeSource, 'available'>[];
84
+ explicitLinks?: KnowledgeTarget[];
85
+ applicability?: KnowledgeApplicability;
86
+ readPermissions?: string[];
87
+ readWritePermissions?: string[];
88
+ staleAfter?: string | null;
89
+ }
90
+ export type UpdateKnowledge = Partial<CreateKnowledge> & {
91
+ recordVersion: number;
92
+ };
93
+ export interface KnowledgeVersion {
94
+ recordVersion: number;
95
+ }
96
+ export interface ConfirmKnowledge extends KnowledgeVersion {
97
+ revision: number;
98
+ }
99
+ export type KnowledgeRelation = 'OBSERVED_IN' | 'EVIDENCED_BY' | 'RELATED_TO' | 'APPLIES_TO';
100
+ export type KnowledgeScopeResult = 'matches' | 'not-established' | 'not-evaluated';
101
+ export interface KnowledgeQuery {
102
+ group?: 'direct' | 'broader' | 'related';
103
+ query?: string;
104
+ contextType?: 'asset' | 'location' | 'organization';
105
+ contextId?: string;
106
+ cursor?: string;
107
+ limit?: number;
108
+ }
109
+ export interface KnowledgeBacklinkQuery {
110
+ targetType: KnowledgeTarget['resourceType'];
111
+ targetId: string;
112
+ cursor?: string;
113
+ limit?: number;
114
+ }
115
+ export interface KnowledgePreview extends Omit<KnowledgePage, 'body'> {
116
+ excerpt: string;
117
+ scope: KnowledgeScopeResult;
118
+ relations: KnowledgeRelation[];
119
+ stale: boolean;
120
+ }
121
+ export interface KnowledgeList {
122
+ docs: KnowledgePreview[];
123
+ nextCursor?: string;
124
+ status: 'complete' | 'more' | 'incomplete' | 'unavailable';
125
+ }
126
+ export interface KnowledgeHome {
127
+ direct: KnowledgeList;
128
+ broader: KnowledgeList;
129
+ related: KnowledgeList;
130
+ }
131
+ export interface KnowledgeBatch {
132
+ docs: KnowledgePage[];
133
+ unavailableIds: string[];
134
+ }
135
+ export interface KnowledgeRevision {
136
+ page: KnowledgePage;
137
+ current: {
138
+ revision: number;
139
+ recordVersion: number;
140
+ state: KnowledgePage['state'];
141
+ };
142
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KNOWLEDGE_TARGET_TYPES = void 0;
4
+ const resource_interface_1 = require("./resource.interface");
5
+ exports.KNOWLEDGE_TARGET_TYPES = [
6
+ resource_interface_1.ResourceType.KNOWLEDGE,
7
+ resource_interface_1.ResourceType.ASSET,
8
+ resource_interface_1.ResourceType.ASSETTYPE,
9
+ resource_interface_1.ResourceType.CONTENT,
10
+ resource_interface_1.ResourceType.EVENT,
11
+ resource_interface_1.ResourceType.TASK,
12
+ ];
@@ -11,6 +11,7 @@ export declare enum ResourceType {
11
11
  FLOWDEPLOYMENT = "flowdeployment",
12
12
  FLOWFUNCTION = "flowfunction",
13
13
  FLOWMODULE = "flowmodule",
14
+ KNOWLEDGE = "knowledge",
14
15
  LABEL = "label",
15
16
  LOGBOOKENTRY = "logbookentry",
16
17
  NOTIFICATIONENDPOINT = "notificationendpoint",
@@ -33,6 +34,7 @@ export declare enum ResourceApiPath {
33
34
  FLOWDEPLOYMENT = "flow/deployments",
34
35
  FLOWFUNCTION = "flow/functions",
35
36
  FLOWMODULE = "flow/modules",
37
+ KNOWLEDGE = "knowledge",
36
38
  LABEL = "labels",
37
39
  NOTIFICATIONENDPOINT = "notification/endpoints",
38
40
  NOTIFICATIONRULE = "notification/rules",
@@ -14,6 +14,7 @@ var ResourceType;
14
14
  ResourceType["FLOWDEPLOYMENT"] = "flowdeployment";
15
15
  ResourceType["FLOWFUNCTION"] = "flowfunction";
16
16
  ResourceType["FLOWMODULE"] = "flowmodule";
17
+ ResourceType["KNOWLEDGE"] = "knowledge";
17
18
  ResourceType["LABEL"] = "label";
18
19
  ResourceType["LOGBOOKENTRY"] = "logbookentry";
19
20
  ResourceType["NOTIFICATIONENDPOINT"] = "notificationendpoint";
@@ -37,6 +38,7 @@ var ResourceApiPath;
37
38
  ResourceApiPath["FLOWDEPLOYMENT"] = "flow/deployments";
38
39
  ResourceApiPath["FLOWFUNCTION"] = "flow/functions";
39
40
  ResourceApiPath["FLOWMODULE"] = "flow/modules";
41
+ ResourceApiPath["KNOWLEDGE"] = "knowledge";
40
42
  ResourceApiPath["LABEL"] = "labels";
41
43
  ResourceApiPath["NOTIFICATIONENDPOINT"] = "notification/endpoints";
42
44
  ResourceApiPath["NOTIFICATIONRULE"] = "notification/rules";
@@ -54,6 +56,7 @@ exports.resourceApiPathToTypeMap = {
54
56
  [ResourceApiPath.FLOWDEPLOYMENT]: ResourceType.FLOWDEPLOYMENT,
55
57
  [ResourceApiPath.FLOWFUNCTION]: ResourceType.FLOWFUNCTION,
56
58
  [ResourceApiPath.FLOWMODULE]: ResourceType.FLOWMODULE,
59
+ [ResourceApiPath.KNOWLEDGE]: ResourceType.KNOWLEDGE,
57
60
  [ResourceApiPath.LABEL]: ResourceType.LABEL,
58
61
  [ResourceApiPath.NOTIFICATIONENDPOINT]: ResourceType.NOTIFICATIONENDPOINT,
59
62
  [ResourceApiPath.NOTIFICATIONRULE]: ResourceType.NOTIFICATIONRULE,
@@ -1,5 +1,5 @@
1
1
  import { API } from '../api';
2
- import { Artifact, Asset, AssetRevision, AssetType, Content, Endpoint, Event, FlowDeployment, FlowDiagram, FlowDto, FlowFunctionDto, FlowFunctionRevision, FlowModule, FlowRevision, Label, LogbookEntry, Notification, ObjectReference, Organization, Secret, Task, TimeSeries, TimeSeriesValue, TimeSeriesValueFeed, Translation, UserSettings, VaultSecret } from '../interfaces';
2
+ import { Artifact, Asset, AssetRevision, AssetType, Content, Endpoint, Event, FlowDeployment, FlowDiagram, FlowDto, FlowFunctionDto, FlowFunctionRevision, FlowModule, FlowRevision, Label, LogbookEntry, Notification, ObjectReference, Organization, Secret, Task, TimeSeries, TimeSeriesValue, TimeSeriesValueFeed, Translation, UserSettings, VaultSecret, type KnowledgePage } from '../interfaces';
3
3
  import { AiMockService } from './ai.mock.service';
4
4
  import { AlertMockService } from './alert.mock.service';
5
5
  import { AssetMockService } from './asset.mock.service';
@@ -16,6 +16,7 @@ import { FlowFunctionsMockService } from './flow-functions.mock.service';
16
16
  import { FlowModulesMockService } from './flow-modules.mock.service';
17
17
  import { FlowMockService } from './flow.mock.service';
18
18
  import { HttpClientMockService } from './http-client.mock.service';
19
+ import { KnowledgeMockService } from './knowledge.mock.service';
19
20
  import { LabelMockService } from './label.mock.service';
20
21
  import { LogbookMockService } from './logbook.mock.service';
21
22
  import { NotificationRulesMockService } from './notification-rules.mock.service';
@@ -31,6 +32,7 @@ import { TimeseriesMockService } from './timeseries.mock.service';
31
32
  import { UserMockService } from './user.mock.service';
32
33
  import { VaultMockService } from './vault.mock.service';
33
34
  export interface MockAPIInitData {
35
+ knowledge?: KnowledgePage[];
34
36
  assets?: AssetInit[];
35
37
  assetRevisions?: AssetRevisionInit[];
36
38
  contents?: ContentInit[];
@@ -58,6 +60,7 @@ export interface MockAPIInitData {
58
60
  translations?: TranslationInit[];
59
61
  }
60
62
  export declare class MockAPI implements API {
63
+ knowledge: KnowledgeMockService;
61
64
  ai: AiMockService;
62
65
  alerts: AlertMockService;
63
66
  assets: AssetMockService;
@@ -18,6 +18,7 @@ const flow_functions_mock_service_1 = require("./flow-functions.mock.service");
18
18
  const flow_modules_mock_service_1 = require("./flow-modules.mock.service");
19
19
  const flow_mock_service_1 = require("./flow.mock.service");
20
20
  const http_client_mock_service_1 = require("./http-client.mock.service");
21
+ const knowledge_mock_service_1 = require("./knowledge.mock.service");
21
22
  const label_mock_service_1 = require("./label.mock.service");
22
23
  const logbook_mock_service_1 = require("./logbook.mock.service");
23
24
  const notification_rules_mock_service_1 = require("./notification-rules.mock.service");
@@ -35,6 +36,7 @@ const vault_mock_service_1 = require("./vault.mock.service");
35
36
  class MockAPI {
36
37
  constructor(initData) {
37
38
  this.proxy = null;
39
+ this.knowledge = new knowledge_mock_service_1.KnowledgeMockService(initData.knowledge);
38
40
  const { assets = [], assetRevisions = [], contents = [], endpoints = [], secrets = [], timeSeries = [], tasks = [], events = [], users, flows = [], flowRevisions = [], deployments = [], functions = [], functionRevisions = [], modules = [], diagrams = [], labels = [], logbookEntries = [], vault = [], notifications = [], organizations = [], objectReferences = [], timeSeriesValueFeeds = [], resourceSetNames = [], translations = [], } = initData;
39
41
  // convert init data to normal data that the services usually use
40
42
  const assetTypes = assets
@@ -34,3 +34,4 @@ export { UserMockService } from './user.mock.service';
34
34
  export { VaultMockService } from './vault.mock.service';
35
35
  export { TimeseriesValueFeedManagementMockService } from './timeseries-value-feed-management.mock.service';
36
36
  export * from './authz';
37
+ export * from './knowledge.mock.service';
@@ -72,3 +72,4 @@ Object.defineProperty(exports, "VaultMockService", { enumerable: true, get: func
72
72
  var timeseries_value_feed_management_mock_service_1 = require("./timeseries-value-feed-management.mock.service");
73
73
  Object.defineProperty(exports, "TimeseriesValueFeedManagementMockService", { enumerable: true, get: function () { return timeseries_value_feed_management_mock_service_1.TimeseriesValueFeedManagementMockService; } });
74
74
  tslib_1.__exportStar(require("./authz"), exports);
75
+ tslib_1.__exportStar(require("./knowledge.mock.service"), exports);
@@ -0,0 +1,28 @@
1
+ import { type ConfirmKnowledge, type CreateKnowledge, type KnowledgeBacklinkQuery, type KnowledgeBatch, type KnowledgeHome, type KnowledgeList, type KnowledgePage, type KnowledgeQuery, type KnowledgeRevision, type KnowledgeVersion, type UpdateKnowledge } from '../interfaces';
2
+ import { KnowledgeService } from '../services/knowledge.service';
3
+ export declare class KnowledgeMockService extends KnowledgeService {
4
+ data: KnowledgePage[];
5
+ private readonly revisions;
6
+ constructor(data?: KnowledgePage[]);
7
+ private remember;
8
+ /** As in the backend, only changes to these fields create a revision. */
9
+ private content;
10
+ private page;
11
+ private list;
12
+ addOne(dto: CreateKnowledge): Promise<KnowledgePage>;
13
+ getOne(id: string): Promise<KnowledgePage>;
14
+ getMany(query?: KnowledgeQuery): Promise<KnowledgeList>;
15
+ getHome(query?: KnowledgeQuery): Promise<KnowledgeHome>;
16
+ getBacklinks(query: KnowledgeBacklinkQuery): Promise<KnowledgeList>;
17
+ getRelated(id: string, query?: Pick<KnowledgeQuery, 'cursor' | 'limit'>): Promise<KnowledgeList>;
18
+ getRevision(id: string, revision: number): Promise<KnowledgeRevision>;
19
+ readBatch(ids: string[]): Promise<KnowledgeBatch>;
20
+ private check;
21
+ updateOne(id: string, dto: UpdateKnowledge): Promise<KnowledgePage>;
22
+ confirm(id: string, dto: ConfirmKnowledge): Promise<KnowledgePage>;
23
+ withdraw(id: string, dto: KnowledgeVersion): Promise<KnowledgePage>;
24
+ restore(id: string, dto: KnowledgeVersion): Promise<KnowledgePage>;
25
+ purgeOrganization(organizationId: string): Promise<{
26
+ deleted: number;
27
+ }>;
28
+ }
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeMockService = void 0;
4
+ const interfaces_1 = require("../interfaces");
5
+ const knowledge_service_1 = require("../services/knowledge.service");
6
+ class KnowledgeMockService extends knowledge_service_1.KnowledgeService {
7
+ constructor(data = []) {
8
+ super(null);
9
+ this.data = data;
10
+ this.revisions = new Map();
11
+ this.data = structuredClone(data);
12
+ this.data.forEach((page) => this.remember(page));
13
+ }
14
+ remember(page) {
15
+ this.revisions.set(`${page.id}:${page.revision}`, structuredClone(page));
16
+ }
17
+ /** As in the backend, only changes to these fields create a revision. */
18
+ content(page) {
19
+ const { title, body, type, description, tags, resource, sources, applicability, links, origin } = page;
20
+ return JSON.stringify({ title, body, type, description, tags, resource, sources, applicability, links, context: origin.context });
21
+ }
22
+ page(id) {
23
+ const page = this.data.find((item) => item.id === id);
24
+ if (!page) {
25
+ throw new Error('Knowledge page not found');
26
+ }
27
+ return page;
28
+ }
29
+ list(pages, query = {}) {
30
+ const offset = Number(query.cursor || 0);
31
+ const active = pages.filter((page) => page.state === 'active');
32
+ const docs = active.slice(offset, offset + (query.limit || 20)).map(({ body, ...page }) => ({
33
+ ...structuredClone(page),
34
+ excerpt: body.slice(0, 300),
35
+ scope: 'not-evaluated',
36
+ relations: [],
37
+ stale: !!page.staleAfter && Date.parse(page.staleAfter) <= Date.now(),
38
+ }));
39
+ const more = offset + docs.length < active.length;
40
+ return { docs, status: more ? 'more' : 'complete', ...(more ? { nextCursor: String(offset + docs.length) } : {}) };
41
+ }
42
+ async addOne(dto) {
43
+ const now = new Date().toISOString();
44
+ const page = {
45
+ id: Array.from(globalThis.crypto.getRandomValues(new Uint8Array(12)), (byte) => byte.toString(16).padStart(2, '0')).join(''),
46
+ title: dto.title,
47
+ body: dto.body,
48
+ type: dto.type || 'Maintenance Note',
49
+ description: dto.description,
50
+ tags: dto.tags || [],
51
+ owner: { id: 'mock-org', type: interfaces_1.OwnerType.ORG },
52
+ createdBy: { id: 'mock-user' },
53
+ updatedBy: { id: 'mock-user' },
54
+ createdAt: now,
55
+ updatedAt: now,
56
+ origin: { actor: { id: 'mock-user' }, at: now, context: dto.originContext ?? undefined },
57
+ resource: dto.resource ?? undefined,
58
+ sources: dto.sources || [],
59
+ links: (dto.explicitLinks || []).map((target) => ({ target, explicit: true, parsed: false })),
60
+ applicability: dto.applicability || { mode: 'unknown' },
61
+ readPermissions: dto.readPermissions || [],
62
+ readWritePermissions: dto.readWritePermissions || ['mock-org'],
63
+ state: 'active',
64
+ revision: 1,
65
+ recordVersion: 1,
66
+ confirmations: [],
67
+ staleAfter: dto.staleAfter || undefined,
68
+ };
69
+ this.data.push(page);
70
+ this.remember(page);
71
+ return structuredClone(page);
72
+ }
73
+ async getOne(id) {
74
+ return structuredClone(this.page(id));
75
+ }
76
+ async getMany(query = {}) {
77
+ const term = query.query?.toLowerCase();
78
+ return this.list(this.data.filter((page) => !term || `${page.title} ${page.body}`.toLowerCase().includes(term)), query);
79
+ }
80
+ async getHome(query = {}) {
81
+ return { direct: await this.getMany(query), broader: { docs: [], status: 'complete' }, related: { docs: [], status: 'complete' } };
82
+ }
83
+ async getBacklinks(query) {
84
+ return this.list(this.data.filter((page) => [...page.links, ...page.sources].some((item) => item.target?.resourceType === query.targetType && item.target.id === query.targetId)), query);
85
+ }
86
+ async getRelated(id, query = {}) {
87
+ const page = this.page(id);
88
+ const outgoing = page.links.filter((link) => link.target.resourceType === interfaces_1.ResourceType.KNOWLEDGE).map((link) => link.target.id);
89
+ return this.list(this.data.filter((item) => item.id !== id &&
90
+ (outgoing.includes(item.id) ||
91
+ item.links.some((link) => link.target.resourceType === interfaces_1.ResourceType.KNOWLEDGE && link.target.id === id))), query);
92
+ }
93
+ async getRevision(id, revision) {
94
+ const current = this.page(id);
95
+ const page = this.revisions.get(`${id}:${revision}`);
96
+ if (!page) {
97
+ throw new Error('Revision not found');
98
+ }
99
+ return {
100
+ page: structuredClone(page),
101
+ current: { revision: current.revision, recordVersion: current.recordVersion, state: current.state },
102
+ };
103
+ }
104
+ async readBatch(ids) {
105
+ return {
106
+ docs: structuredClone(this.data.filter((page) => ids.includes(page.id) && page.state === 'active')),
107
+ unavailableIds: ids.filter((id) => !this.data.some((page) => page.id === id && page.state === 'active')),
108
+ };
109
+ }
110
+ check(id, version) {
111
+ const page = this.page(id);
112
+ if (page.recordVersion !== version) {
113
+ throw new Error('Version conflict');
114
+ }
115
+ return page;
116
+ }
117
+ async updateOne(id, dto) {
118
+ const page = this.check(id, dto.recordVersion);
119
+ const before = this.content(page);
120
+ const { explicitLinks, originContext, staleAfter, resource, recordVersion: _version, ...fields } = dto;
121
+ Object.assign(page, fields);
122
+ if (resource !== undefined) {
123
+ page.resource = resource ?? undefined;
124
+ }
125
+ if (explicitLinks) {
126
+ page.links = explicitLinks.map((target) => ({ target, explicit: true, parsed: false }));
127
+ }
128
+ if (originContext !== undefined) {
129
+ page.origin.context = originContext ?? undefined;
130
+ }
131
+ if (staleAfter !== undefined) {
132
+ page.staleAfter = staleAfter || undefined;
133
+ }
134
+ if (this.content(page) !== before) {
135
+ page.revision++;
136
+ this.remember(page);
137
+ }
138
+ page.recordVersion++;
139
+ return structuredClone(page);
140
+ }
141
+ async confirm(id, dto) {
142
+ const page = this.check(id, dto.recordVersion);
143
+ if (page.revision !== dto.revision) {
144
+ throw new Error('Revision conflict');
145
+ }
146
+ page.confirmations.push({ actor: { id: 'mock-user' }, at: new Date().toISOString(), revision: page.revision });
147
+ page.recordVersion++;
148
+ return structuredClone(page);
149
+ }
150
+ async withdraw(id, dto) {
151
+ const page = this.check(id, dto.recordVersion);
152
+ page.state = 'withdrawn';
153
+ page.deletedAt = new Date().toISOString();
154
+ page.recordVersion++;
155
+ return structuredClone(page);
156
+ }
157
+ async restore(id, dto) {
158
+ const page = this.check(id, dto.recordVersion);
159
+ page.state = 'active';
160
+ delete page.deletedAt;
161
+ page.recordVersion++;
162
+ return structuredClone(page);
163
+ }
164
+ async purgeOrganization(organizationId) {
165
+ const kept = this.data.filter((page) => page.owner.id !== organizationId);
166
+ const deleted = this.data.length - kept.length;
167
+ this.data = kept;
168
+ return { deleted };
169
+ }
170
+ }
171
+ exports.KnowledgeMockService = KnowledgeMockService;
@@ -33,3 +33,4 @@ export { TimeseriesValueFeedManagementService } from './timeseries-value-feed-ma
33
33
  export { UserService } from './user.service';
34
34
  export { VaultService } from './vault.service';
35
35
  export * from './authz';
36
+ export * from './knowledge.service';
@@ -71,3 +71,4 @@ Object.defineProperty(exports, "UserService", { enumerable: true, get: function
71
71
  var vault_service_1 = require("./vault.service");
72
72
  Object.defineProperty(exports, "VaultService", { enumerable: true, get: function () { return vault_service_1.VaultService; } });
73
73
  tslib_1.__exportStar(require("./authz"), exports);
74
+ tslib_1.__exportStar(require("./knowledge.service"), exports);
@@ -0,0 +1,22 @@
1
+ import { APIBase } from '../api-base';
2
+ import type { Config, ConfirmKnowledge, CreateKnowledge, KnowledgeBacklinkQuery, KnowledgeBatch, KnowledgeHome, KnowledgeList, KnowledgePage, KnowledgeQuery, KnowledgeRevision, KnowledgeVersion, UpdateKnowledge } from '../interfaces';
3
+ import { HttpClientService } from './http-client.service';
4
+ export declare class KnowledgeService extends APIBase {
5
+ constructor(httpClient: HttpClientService);
6
+ addOne(dto: CreateKnowledge, options?: Config): Promise<KnowledgePage>;
7
+ getOne(id: string, options?: Config): Promise<KnowledgePage>;
8
+ getMany(query?: KnowledgeQuery, options?: Config): Promise<KnowledgeList>;
9
+ getHome(query?: KnowledgeQuery, options?: Config): Promise<KnowledgeHome>;
10
+ getBacklinks(query: KnowledgeBacklinkQuery, options?: Config): Promise<KnowledgeList>;
11
+ getRelated(id: string, query?: Pick<KnowledgeQuery, 'cursor' | 'limit'>, options?: Config): Promise<KnowledgeList>;
12
+ getRevision(id: string, revision: number, options?: Config): Promise<KnowledgeRevision>;
13
+ readBatch(ids: string[], options?: Config): Promise<KnowledgeBatch>;
14
+ updateOne(id: string, dto: UpdateKnowledge, options?: Config): Promise<KnowledgePage>;
15
+ confirm(id: string, dto: ConfirmKnowledge, options?: Config): Promise<KnowledgePage>;
16
+ withdraw(id: string, dto: KnowledgeVersion, options?: Config): Promise<KnowledgePage>;
17
+ restore(id: string, dto: KnowledgeVersion, options?: Config): Promise<KnowledgePage>;
18
+ /** Permanently deletes all pages and revisions of an organization; for organization deletion only. */
19
+ purgeOrganization(organizationId: string, options?: Config): Promise<{
20
+ deleted: number;
21
+ }>;
22
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeService = void 0;
4
+ const api_base_1 = require("../api-base");
5
+ class KnowledgeService extends api_base_1.APIBase {
6
+ constructor(httpClient) {
7
+ super(httpClient, '/knowledge');
8
+ }
9
+ addOne(dto, options = {}) {
10
+ return this.httpClient.post(this.basePath, dto, options);
11
+ }
12
+ getOne(id, options = {}) {
13
+ return this.httpClient.get(`${this.basePath}/${encodeURIComponent(id)}`, options);
14
+ }
15
+ getMany(query = {}, options = {}) {
16
+ return this.httpClient.get(this.basePath, { ...options, params: query });
17
+ }
18
+ getHome(query = {}, options = {}) {
19
+ return this.httpClient.get(`${this.basePath}/home`, { ...options, params: query });
20
+ }
21
+ getBacklinks(query, options = {}) {
22
+ return this.httpClient.get(`${this.basePath}/backlinks`, { ...options, params: query });
23
+ }
24
+ getRelated(id, query = {}, options = {}) {
25
+ return this.httpClient.get(`${this.basePath}/${encodeURIComponent(id)}/related`, { ...options, params: query });
26
+ }
27
+ getRevision(id, revision, options = {}) {
28
+ return this.httpClient.get(`${this.basePath}/${encodeURIComponent(id)}/revisions/${revision}`, options);
29
+ }
30
+ readBatch(ids, options = {}) {
31
+ return this.httpClient.post(`${this.basePath}/read-batch`, { ids }, options);
32
+ }
33
+ updateOne(id, dto, options = {}) {
34
+ return this.httpClient.patch(`${this.basePath}/${encodeURIComponent(id)}`, dto, options);
35
+ }
36
+ confirm(id, dto, options = {}) {
37
+ return this.httpClient.post(`${this.basePath}/${encodeURIComponent(id)}/confirm`, dto, options);
38
+ }
39
+ withdraw(id, dto, options = {}) {
40
+ return this.httpClient.post(`${this.basePath}/${encodeURIComponent(id)}/withdraw`, dto, options);
41
+ }
42
+ restore(id, dto, options = {}) {
43
+ return this.httpClient.post(`${this.basePath}/${encodeURIComponent(id)}/restore`, dto, options);
44
+ }
45
+ /** Permanently deletes all pages and revisions of an organization; for organization deletion only. */
46
+ purgeOrganization(organizationId, options = {}) {
47
+ return this.httpClient.delete(`${this.basePath}/organizations/${encodeURIComponent(organizationId)}`, options);
48
+ }
49
+ }
50
+ exports.KnowledgeService = KnowledgeService;