@sonisoft/now-sdk-ext-core 3.0.2 → 3.3.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.
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Models for Service Catalog management operations against ServiceNow tables:
3
+ * sc_cat_item, sc_category, and item_option_new.
4
+ */
5
+ /**
6
+ * A catalog item record from the sc_cat_item table.
7
+ */
8
+ export interface CatalogItemRecord {
9
+ sys_id: string;
10
+ name: string;
11
+ short_description?: string;
12
+ description?: string;
13
+ category?: string;
14
+ price?: string;
15
+ active?: string;
16
+ order?: string;
17
+ sys_scope?: string;
18
+ sc_catalogs?: string;
19
+ type?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * A catalog category record from the sc_category table.
24
+ */
25
+ export interface CatalogCategoryRecord {
26
+ sys_id: string;
27
+ title: string;
28
+ description?: string;
29
+ parent?: string;
30
+ sc_catalog?: string;
31
+ active?: string;
32
+ order?: string;
33
+ icon?: string;
34
+ header_icon?: string;
35
+ [key: string]: unknown;
36
+ }
37
+ /**
38
+ * A catalog variable record from the item_option_new table.
39
+ * Includes an enriched friendly_type field mapped from the numeric type code.
40
+ */
41
+ export interface CatalogVariableRecord {
42
+ sys_id: string;
43
+ name: string;
44
+ question_text?: string;
45
+ type?: string;
46
+ mandatory?: string;
47
+ default_value?: string;
48
+ help_text?: string;
49
+ order?: string;
50
+ reference?: string;
51
+ reference_qual?: string;
52
+ choice_table?: string;
53
+ choice_field?: string;
54
+ cat_item?: string;
55
+ variable_set?: string;
56
+ /** Human-readable variable type name mapped from the numeric type code */
57
+ friendly_type?: string;
58
+ [key: string]: unknown;
59
+ }
60
+ /**
61
+ * A record from the io_set_item table linking variable sets to catalog items.
62
+ */
63
+ export interface VariableSetItemRecord {
64
+ sys_id: string;
65
+ sc_cat_item: string;
66
+ variable_set: string;
67
+ [key: string]: unknown;
68
+ }
69
+ /**
70
+ * Options for listing catalog items.
71
+ */
72
+ export interface ListCatalogItemsOptions {
73
+ /** Encoded query string for filtering */
74
+ query?: string;
75
+ /** Text search term (searches name and short_description) */
76
+ textSearch?: string;
77
+ /** Filter by category sys_id */
78
+ categorySysId?: string;
79
+ /** Filter by catalog sys_id */
80
+ catalogSysId?: string;
81
+ /** Filter by active status */
82
+ active?: boolean;
83
+ /** Maximum number of records to return (default 20) */
84
+ limit?: number;
85
+ /** Offset for pagination (default 0) */
86
+ offset?: number;
87
+ }
88
+ /**
89
+ * Options for listing catalog categories.
90
+ */
91
+ export interface ListCatalogCategoriesOptions {
92
+ /** Filter by parent category sys_id */
93
+ parentSysId?: string;
94
+ /** Filter by catalog sys_id */
95
+ catalogSysId?: string;
96
+ /** Filter by active status */
97
+ active?: boolean;
98
+ /** Filter by title (exact match) */
99
+ title?: string;
100
+ /** Encoded query string for additional filtering */
101
+ query?: string;
102
+ /** Maximum number of records (default 20) */
103
+ limit?: number;
104
+ /** Offset for pagination (default 0) */
105
+ offset?: number;
106
+ }
107
+ /**
108
+ * Options for listing catalog item variables.
109
+ */
110
+ export interface ListCatalogVariablesOptions {
111
+ /** The catalog item sys_id (required) */
112
+ catalogItemSysId: string;
113
+ /** Include variables from variable sets (default true) */
114
+ includeVariableSets?: boolean;
115
+ }
116
+ /**
117
+ * Options for submitting a catalog request via order_now.
118
+ */
119
+ export interface SubmitCatalogRequestOptions {
120
+ /** The catalog item sys_id (required) */
121
+ catalogItemSysId: string;
122
+ /** Quantity to order (default 1) */
123
+ quantity?: number;
124
+ /** Variable name-value pairs */
125
+ variables?: Record<string, string>;
126
+ }
127
+ /**
128
+ * Enriched catalog item detail including its variables.
129
+ */
130
+ export interface CatalogItemDetail {
131
+ item: CatalogItemRecord;
132
+ variables: CatalogVariableRecord[];
133
+ }
134
+ /**
135
+ * Enriched catalog category detail including item count.
136
+ */
137
+ export interface CatalogCategoryDetail {
138
+ category: CatalogCategoryRecord;
139
+ itemCount: number;
140
+ }
141
+ /**
142
+ * Result from submitting a catalog request, including both REQ and RITM.
143
+ */
144
+ export interface CatalogRequestResult {
145
+ requestNumber: string;
146
+ requestSysId: string;
147
+ requestItemNumber?: string;
148
+ requestItemSysId?: string;
149
+ }
150
+ export interface CatalogItemResponse {
151
+ result: CatalogItemRecord[];
152
+ }
153
+ export interface CatalogCategoryResponse {
154
+ result: CatalogCategoryRecord[];
155
+ }
156
+ export interface CatalogVariableResponse {
157
+ result: CatalogVariableRecord[];
158
+ }
159
+ export interface VariableSetItemResponse {
160
+ result: VariableSetItemRecord[];
161
+ }
162
+ export interface CatalogOrderResponse {
163
+ result: {
164
+ sys_id: string;
165
+ number: string;
166
+ request_number: string;
167
+ request_id: string;
168
+ table: string;
169
+ };
170
+ }
171
+ export interface RequestItemResponse {
172
+ result: Array<{
173
+ sys_id: string;
174
+ number: string;
175
+ [key: string]: unknown;
176
+ }>;
177
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Models for Service Catalog management operations against ServiceNow tables:
3
+ * sc_cat_item, sc_category, and item_option_new.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=CatalogModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogModels.js","sourceRoot":"","sources":["../../../src/sn/catalog/CatalogModels.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,93 @@
1
+ import { ServiceNowInstance } from "../ServiceNowInstance.js";
2
+ import { KnowledgeBaseRecord, KnowledgeBaseDetail, KnowledgeCategoryRecord, KnowledgeArticleRecord, KnowledgeArticleSummary, ListKnowledgeBasesOptions, ListCategoriesOptions, CreateCategoryOptions, ListArticlesOptions, CreateArticleOptions, UpdateArticleOptions } from './KnowledgeModels.js';
3
+ /**
4
+ * Provides operations for managing ServiceNow Knowledge Base articles,
5
+ * knowledge bases, and categories via the Table API and Stats API.
6
+ */
7
+ export declare class KnowledgeManager {
8
+ private static readonly KB_BASE_TABLE;
9
+ private static readonly KB_CATEGORY_TABLE;
10
+ private static readonly KB_KNOWLEDGE_TABLE;
11
+ /** Fields to return in list operations (excludes large body fields) */
12
+ private static readonly ARTICLE_LIST_FIELDS;
13
+ private _logger;
14
+ private _req;
15
+ private _tableAPI;
16
+ private _aggregateQuery;
17
+ private _instance;
18
+ constructor(instance: ServiceNowInstance);
19
+ /**
20
+ * List knowledge bases with optional filtering and pagination.
21
+ *
22
+ * @param options Filtering and pagination options
23
+ * @returns Array of knowledge base records
24
+ * @throws Error if the API call fails
25
+ */
26
+ listKnowledgeBases(options?: ListKnowledgeBasesOptions): Promise<KnowledgeBaseRecord[]>;
27
+ /**
28
+ * Get details of a specific knowledge base including article and category counts.
29
+ *
30
+ * @param sysId The sys_id of the knowledge base
31
+ * @returns Knowledge base detail with article and category counts
32
+ * @throws Error if the sys_id is empty, the KB is not found, or the API call fails
33
+ */
34
+ getKnowledgeBase(sysId: string): Promise<KnowledgeBaseDetail>;
35
+ /**
36
+ * List categories within a knowledge base with optional filtering.
37
+ *
38
+ * @param options Filtering and pagination options
39
+ * @returns Array of category records
40
+ * @throws Error if the API call fails
41
+ */
42
+ listCategories(options?: ListCategoriesOptions): Promise<KnowledgeCategoryRecord[]>;
43
+ /**
44
+ * Create a new knowledge base category.
45
+ *
46
+ * @param options Category creation options
47
+ * @returns The created category record
48
+ * @throws Error if required fields are missing or the API call fails
49
+ */
50
+ createCategory(options: CreateCategoryOptions): Promise<KnowledgeCategoryRecord>;
51
+ /**
52
+ * List knowledge articles with filtering by KB, category, workflow state, and text search.
53
+ * Returns article summaries (without large body fields) for efficiency.
54
+ *
55
+ * @param options Filtering and pagination options
56
+ * @returns Array of article summaries
57
+ * @throws Error if the API call fails
58
+ */
59
+ listArticles(options?: ListArticlesOptions): Promise<KnowledgeArticleSummary[]>;
60
+ /**
61
+ * Get full article content including body text.
62
+ *
63
+ * @param sysId The sys_id of the article
64
+ * @returns The full article record
65
+ * @throws Error if the sys_id is empty, the article is not found, or the API call fails
66
+ */
67
+ getArticle(sysId: string): Promise<KnowledgeArticleRecord>;
68
+ /**
69
+ * Create a new knowledge article.
70
+ *
71
+ * @param options Article creation options
72
+ * @returns The created article record
73
+ * @throws Error if required fields are missing or the API call fails
74
+ */
75
+ createArticle(options: CreateArticleOptions): Promise<KnowledgeArticleRecord>;
76
+ /**
77
+ * Update an existing knowledge article.
78
+ *
79
+ * @param sysId The sys_id of the article to update
80
+ * @param options Fields to update
81
+ * @returns The updated article record
82
+ * @throws Error if the sys_id is empty, no fields are provided, or the API call fails
83
+ */
84
+ updateArticle(sysId: string, options: UpdateArticleOptions): Promise<KnowledgeArticleRecord>;
85
+ /**
86
+ * Publish a draft article by setting its workflow_state to "published".
87
+ *
88
+ * @param sysId The sys_id of the article to publish
89
+ * @returns The updated article record
90
+ * @throws Error if the sys_id is empty or the API call fails
91
+ */
92
+ publishArticle(sysId: string): Promise<KnowledgeArticleRecord>;
93
+ }
@@ -0,0 +1,316 @@
1
+ import { Logger } from "../../util/Logger.js";
2
+ import { ServiceNowRequest } from "../../comm/http/ServiceNowRequest.js";
3
+ import { TableAPIRequest } from "../../comm/http/TableAPIRequest.js";
4
+ import { AggregateQuery } from "../aggregate/AggregateQuery.js";
5
+ /**
6
+ * Provides operations for managing ServiceNow Knowledge Base articles,
7
+ * knowledge bases, and categories via the Table API and Stats API.
8
+ */
9
+ export class KnowledgeManager {
10
+ static KB_BASE_TABLE = 'kb_knowledge_base';
11
+ static KB_CATEGORY_TABLE = 'kb_category';
12
+ static KB_KNOWLEDGE_TABLE = 'kb_knowledge';
13
+ /** Fields to return in list operations (excludes large body fields) */
14
+ static ARTICLE_LIST_FIELDS = 'sys_id,number,short_description,kb_knowledge_base,kb_category,workflow_state,' +
15
+ 'author,article_type,published,active,sys_view_count,sys_created_on,sys_updated_on';
16
+ _logger = new Logger("KnowledgeManager");
17
+ _req;
18
+ _tableAPI;
19
+ _aggregateQuery;
20
+ _instance;
21
+ constructor(instance) {
22
+ this._instance = instance;
23
+ this._req = new ServiceNowRequest(instance);
24
+ this._tableAPI = new TableAPIRequest(instance);
25
+ this._aggregateQuery = new AggregateQuery(instance);
26
+ }
27
+ /**
28
+ * List knowledge bases with optional filtering and pagination.
29
+ *
30
+ * @param options Filtering and pagination options
31
+ * @returns Array of knowledge base records
32
+ * @throws Error if the API call fails
33
+ */
34
+ async listKnowledgeBases(options = {}) {
35
+ const { query, active, limit = 20, offset = 0 } = options;
36
+ this._logger.info('Listing knowledge bases');
37
+ const queryParts = [];
38
+ if (active !== undefined)
39
+ queryParts.push(`active=${active}`);
40
+ if (query)
41
+ queryParts.push(query);
42
+ const params = {
43
+ sysparm_limit: limit,
44
+ sysparm_offset: offset
45
+ };
46
+ if (queryParts.length > 0) {
47
+ params.sysparm_query = queryParts.join('^');
48
+ }
49
+ const response = await this._tableAPI.get(KnowledgeManager.KB_BASE_TABLE, params);
50
+ if (response && response.status === 200 && response.bodyObject?.result) {
51
+ this._logger.info(`Retrieved ${response.bodyObject.result.length} knowledge bases`);
52
+ return response.bodyObject.result;
53
+ }
54
+ throw new Error(`Failed to list knowledge bases. Status: ${response?.status ?? 'unknown'}`);
55
+ }
56
+ /**
57
+ * Get details of a specific knowledge base including article and category counts.
58
+ *
59
+ * @param sysId The sys_id of the knowledge base
60
+ * @returns Knowledge base detail with article and category counts
61
+ * @throws Error if the sys_id is empty, the KB is not found, or the API call fails
62
+ */
63
+ async getKnowledgeBase(sysId) {
64
+ if (!sysId || sysId.trim().length === 0) {
65
+ throw new Error('Knowledge base sys_id is required');
66
+ }
67
+ this._logger.info(`Getting knowledge base: ${sysId}`);
68
+ const query = {
69
+ sysparm_query: `sys_id=${sysId}`,
70
+ sysparm_limit: 1
71
+ };
72
+ const response = await this._tableAPI.get(KnowledgeManager.KB_BASE_TABLE, query);
73
+ if (!response || response.status !== 200 || !response.bodyObject?.result ||
74
+ response.bodyObject.result.length === 0) {
75
+ throw new Error(`Knowledge base '${sysId}' not found. Status: ${response?.status ?? 'unknown'}`);
76
+ }
77
+ const knowledgeBase = response.bodyObject.result[0];
78
+ // Get article and category counts in parallel
79
+ const [articleCount, categoryCount] = await Promise.all([
80
+ this._aggregateQuery.count({
81
+ table: KnowledgeManager.KB_KNOWLEDGE_TABLE,
82
+ query: `kb_knowledge_base=${sysId}`
83
+ }),
84
+ this._aggregateQuery.count({
85
+ table: KnowledgeManager.KB_CATEGORY_TABLE,
86
+ query: `value=${sysId}`
87
+ })
88
+ ]);
89
+ this._logger.info(`Knowledge base '${knowledgeBase.title}': ${articleCount} articles, ${categoryCount} categories`);
90
+ return { knowledgeBase, articleCount, categoryCount };
91
+ }
92
+ /**
93
+ * List categories within a knowledge base with optional filtering.
94
+ *
95
+ * @param options Filtering and pagination options
96
+ * @returns Array of category records
97
+ * @throws Error if the API call fails
98
+ */
99
+ async listCategories(options = {}) {
100
+ const { knowledgeBaseSysId, parentCategory, query, active, limit = 20, offset = 0 } = options;
101
+ this._logger.info('Listing categories');
102
+ const queryParts = [];
103
+ if (knowledgeBaseSysId)
104
+ queryParts.push(`value=${knowledgeBaseSysId}`);
105
+ if (parentCategory)
106
+ queryParts.push(`parent_id=${parentCategory}`);
107
+ if (active !== undefined)
108
+ queryParts.push(`active=${active}`);
109
+ if (query)
110
+ queryParts.push(query);
111
+ const params = {
112
+ sysparm_limit: limit,
113
+ sysparm_offset: offset
114
+ };
115
+ if (queryParts.length > 0) {
116
+ params.sysparm_query = queryParts.join('^');
117
+ }
118
+ const response = await this._tableAPI.get(KnowledgeManager.KB_CATEGORY_TABLE, params);
119
+ if (response && response.status === 200 && response.bodyObject?.result) {
120
+ this._logger.info(`Retrieved ${response.bodyObject.result.length} categories`);
121
+ return response.bodyObject.result;
122
+ }
123
+ throw new Error(`Failed to list categories. Status: ${response?.status ?? 'unknown'}`);
124
+ }
125
+ /**
126
+ * Create a new knowledge base category.
127
+ *
128
+ * @param options Category creation options
129
+ * @returns The created category record
130
+ * @throws Error if required fields are missing or the API call fails
131
+ */
132
+ async createCategory(options) {
133
+ if (!options.label || options.label.trim().length === 0) {
134
+ throw new Error('Category label is required');
135
+ }
136
+ if (!options.knowledgeBaseSysId || options.knowledgeBaseSysId.trim().length === 0) {
137
+ throw new Error('Knowledge base sys_id is required');
138
+ }
139
+ this._logger.info(`Creating category: ${options.label}`);
140
+ const body = {
141
+ label: options.label,
142
+ value: options.knowledgeBaseSysId
143
+ };
144
+ if (options.parentCategory) {
145
+ body.parent_id = options.parentCategory;
146
+ }
147
+ if (options.active !== undefined) {
148
+ body.active = String(options.active);
149
+ }
150
+ const response = await this._tableAPI.post(KnowledgeManager.KB_CATEGORY_TABLE, {}, body);
151
+ if (response && (response.status === 200 || response.status === 201) && response.bodyObject?.result) {
152
+ this._logger.info(`Created category: ${options.label} (${response.bodyObject.result.sys_id})`);
153
+ return response.bodyObject.result;
154
+ }
155
+ throw new Error(`Failed to create category '${options.label}'. Status: ${response?.status ?? 'unknown'}`);
156
+ }
157
+ /**
158
+ * List knowledge articles with filtering by KB, category, workflow state, and text search.
159
+ * Returns article summaries (without large body fields) for efficiency.
160
+ *
161
+ * @param options Filtering and pagination options
162
+ * @returns Array of article summaries
163
+ * @throws Error if the API call fails
164
+ */
165
+ async listArticles(options = {}) {
166
+ const { knowledgeBaseSysId, categorySysId, workflowState, textSearch, query, limit = 20, offset = 0 } = options;
167
+ this._logger.info('Listing articles');
168
+ const queryParts = [];
169
+ if (knowledgeBaseSysId)
170
+ queryParts.push(`kb_knowledge_base=${knowledgeBaseSysId}`);
171
+ if (categorySysId)
172
+ queryParts.push(`kb_category=${categorySysId}`);
173
+ if (workflowState)
174
+ queryParts.push(`workflow_state=${workflowState}`);
175
+ if (textSearch)
176
+ queryParts.push(`short_descriptionLIKE${textSearch}`);
177
+ if (query)
178
+ queryParts.push(query);
179
+ const params = {
180
+ sysparm_limit: limit,
181
+ sysparm_offset: offset,
182
+ sysparm_fields: KnowledgeManager.ARTICLE_LIST_FIELDS
183
+ };
184
+ if (queryParts.length > 0) {
185
+ params.sysparm_query = queryParts.join('^');
186
+ }
187
+ const response = await this._tableAPI.get(KnowledgeManager.KB_KNOWLEDGE_TABLE, params);
188
+ if (response && response.status === 200 && response.bodyObject?.result) {
189
+ this._logger.info(`Retrieved ${response.bodyObject.result.length} articles`);
190
+ return response.bodyObject.result;
191
+ }
192
+ throw new Error(`Failed to list articles. Status: ${response?.status ?? 'unknown'}`);
193
+ }
194
+ /**
195
+ * Get full article content including body text.
196
+ *
197
+ * @param sysId The sys_id of the article
198
+ * @returns The full article record
199
+ * @throws Error if the sys_id is empty, the article is not found, or the API call fails
200
+ */
201
+ async getArticle(sysId) {
202
+ if (!sysId || sysId.trim().length === 0) {
203
+ throw new Error('Article sys_id is required');
204
+ }
205
+ this._logger.info(`Getting article: ${sysId}`);
206
+ const query = {
207
+ sysparm_query: `sys_id=${sysId}`,
208
+ sysparm_limit: 1
209
+ };
210
+ const response = await this._tableAPI.get(KnowledgeManager.KB_KNOWLEDGE_TABLE, query);
211
+ if (response && response.status === 200 && response.bodyObject?.result) {
212
+ if (response.bodyObject.result.length > 0) {
213
+ this._logger.info(`Found article: ${response.bodyObject.result[0].short_description}`);
214
+ return response.bodyObject.result[0];
215
+ }
216
+ throw new Error(`Article '${sysId}' not found`);
217
+ }
218
+ throw new Error(`Failed to get article '${sysId}'. Status: ${response?.status ?? 'unknown'}`);
219
+ }
220
+ /**
221
+ * Create a new knowledge article.
222
+ *
223
+ * @param options Article creation options
224
+ * @returns The created article record
225
+ * @throws Error if required fields are missing or the API call fails
226
+ */
227
+ async createArticle(options) {
228
+ if (!options.shortDescription || options.shortDescription.trim().length === 0) {
229
+ throw new Error('Article short description is required');
230
+ }
231
+ if (!options.knowledgeBaseSysId || options.knowledgeBaseSysId.trim().length === 0) {
232
+ throw new Error('Knowledge base sys_id is required');
233
+ }
234
+ this._logger.info(`Creating article: ${options.shortDescription}`);
235
+ const body = {
236
+ short_description: options.shortDescription,
237
+ kb_knowledge_base: options.knowledgeBaseSysId,
238
+ workflow_state: options.workflowState || 'draft'
239
+ };
240
+ if (options.text)
241
+ body.text = options.text;
242
+ if (options.wiki)
243
+ body.wiki = options.wiki;
244
+ if (options.categorySysId)
245
+ body.kb_category = options.categorySysId;
246
+ if (options.articleType)
247
+ body.article_type = options.articleType;
248
+ if (options.additionalFields) {
249
+ Object.assign(body, options.additionalFields);
250
+ }
251
+ const response = await this._tableAPI.post(KnowledgeManager.KB_KNOWLEDGE_TABLE, {}, body);
252
+ if (response && (response.status === 200 || response.status === 201) && response.bodyObject?.result) {
253
+ this._logger.info(`Created article: ${options.shortDescription} (${response.bodyObject.result.sys_id})`);
254
+ return response.bodyObject.result;
255
+ }
256
+ throw new Error(`Failed to create article. Status: ${response?.status ?? 'unknown'}`);
257
+ }
258
+ /**
259
+ * Update an existing knowledge article.
260
+ *
261
+ * @param sysId The sys_id of the article to update
262
+ * @param options Fields to update
263
+ * @returns The updated article record
264
+ * @throws Error if the sys_id is empty, no fields are provided, or the API call fails
265
+ */
266
+ async updateArticle(sysId, options) {
267
+ if (!sysId || sysId.trim().length === 0) {
268
+ throw new Error('Article sys_id is required');
269
+ }
270
+ this._logger.info(`Updating article: ${sysId}`);
271
+ const body = {};
272
+ if (options.shortDescription !== undefined)
273
+ body.short_description = options.shortDescription;
274
+ if (options.text !== undefined)
275
+ body.text = options.text;
276
+ if (options.wiki !== undefined)
277
+ body.wiki = options.wiki;
278
+ if (options.knowledgeBaseSysId !== undefined)
279
+ body.kb_knowledge_base = options.knowledgeBaseSysId;
280
+ if (options.categorySysId !== undefined)
281
+ body.kb_category = options.categorySysId;
282
+ if (options.workflowState !== undefined)
283
+ body.workflow_state = options.workflowState;
284
+ if (options.articleType !== undefined)
285
+ body.article_type = options.articleType;
286
+ if (options.active !== undefined)
287
+ body.active = String(options.active);
288
+ if (options.additionalFields) {
289
+ Object.assign(body, options.additionalFields);
290
+ }
291
+ if (Object.keys(body).length === 0) {
292
+ throw new Error('At least one field must be provided for update');
293
+ }
294
+ const response = await this._tableAPI.put(KnowledgeManager.KB_KNOWLEDGE_TABLE, sysId, body);
295
+ if (response && response.status === 200 && response.bodyObject?.result) {
296
+ this._logger.info(`Updated article: ${sysId}`);
297
+ return response.bodyObject.result;
298
+ }
299
+ throw new Error(`Failed to update article '${sysId}'. Status: ${response?.status ?? 'unknown'}`);
300
+ }
301
+ /**
302
+ * Publish a draft article by setting its workflow_state to "published".
303
+ *
304
+ * @param sysId The sys_id of the article to publish
305
+ * @returns The updated article record
306
+ * @throws Error if the sys_id is empty or the API call fails
307
+ */
308
+ async publishArticle(sysId) {
309
+ if (!sysId || sysId.trim().length === 0) {
310
+ throw new Error('Article sys_id is required');
311
+ }
312
+ this._logger.info(`Publishing article: ${sysId}`);
313
+ return this.updateArticle(sysId, { workflowState: 'published' });
314
+ }
315
+ }
316
+ //# sourceMappingURL=KnowledgeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeManager.js","sourceRoot":"","sources":["../../../src/sn/knowledge/KnowledgeManager.ts"],"names":[],"mappings":"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"}