@agentforge/tools 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -9
- package/dist/index.cjs +514 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +99 -1
- package/dist/index.d.ts +99 -1
- package/dist/index.js +506 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1032,6 +1032,506 @@ function createSlackTools(config = {}) {
|
|
|
1032
1032
|
};
|
|
1033
1033
|
}
|
|
1034
1034
|
var slackTools = [sendSlackMessage, notifySlack, getSlackChannels, getSlackMessages];
|
|
1035
|
+
|
|
1036
|
+
// src/web/confluence/auth.ts
|
|
1037
|
+
function createGetConfiguredAuth(apiKey, email, siteUrl) {
|
|
1038
|
+
return function getConfiguredAuth() {
|
|
1039
|
+
const ATLASSIAN_API_KEY = apiKey || process.env.ATLASSIAN_API_KEY || "";
|
|
1040
|
+
const ATLASSIAN_EMAIL = email || process.env.ATLASSIAN_EMAIL || "";
|
|
1041
|
+
const ATLASSIAN_SITE_URL = (siteUrl || process.env.ATLASSIAN_SITE_URL || "").replace(/\/$/, "");
|
|
1042
|
+
if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {
|
|
1043
|
+
throw new Error(
|
|
1044
|
+
"Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in config or environment variables."
|
|
1045
|
+
);
|
|
1046
|
+
}
|
|
1047
|
+
return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
1050
|
+
function createGetConfiguredAuthHeader(getConfiguredAuth) {
|
|
1051
|
+
return function getConfiguredAuthHeader() {
|
|
1052
|
+
const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfiguredAuth();
|
|
1053
|
+
const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString("base64");
|
|
1054
|
+
return `Basic ${auth}`;
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
function getConfig() {
|
|
1058
|
+
const ATLASSIAN_API_KEY = process.env.ATLASSIAN_API_KEY || "";
|
|
1059
|
+
const ATLASSIAN_EMAIL = process.env.ATLASSIAN_EMAIL || "";
|
|
1060
|
+
const ATLASSIAN_SITE_URL = (process.env.ATLASSIAN_SITE_URL || "").replace(/\/$/, "");
|
|
1061
|
+
if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {
|
|
1062
|
+
throw new Error("Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in .env");
|
|
1063
|
+
}
|
|
1064
|
+
return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };
|
|
1065
|
+
}
|
|
1066
|
+
function getAuthHeader() {
|
|
1067
|
+
const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfig();
|
|
1068
|
+
const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString("base64");
|
|
1069
|
+
return `Basic ${auth}`;
|
|
1070
|
+
}
|
|
1071
|
+
function createSearchConfluenceTool(getAuth, getAuthHeader2, logger4) {
|
|
1072
|
+
return toolBuilder().name("search-confluence").description("Search for pages in Confluence using keywords or CQL (Confluence Query Language). Returns matching pages with titles, IDs, and excerpts.").category(ToolCategory.WEB).tag("confluence").tag("search").tag("knowledge-base").usageNotes("Use this to find relevant documentation, policies, or information in Confluence. You can search by keywords or use CQL for advanced queries (e.g., 'space=AI AND type=page'). Use get-confluence-page to retrieve full content of specific pages.").suggests(["get-confluence-page"]).schema(z.object({
|
|
1073
|
+
query: z.string().describe("Search query or CQL expression (e.g., 'payment processing' or 'space=BL3 AND title~payment')"),
|
|
1074
|
+
limit: z.number().optional().describe("Maximum number of results to return (default: 10, max: 25)")
|
|
1075
|
+
})).implement(async ({ query, limit = 10 }) => {
|
|
1076
|
+
logger4.info("search-confluence called", { query, limit });
|
|
1077
|
+
try {
|
|
1078
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1079
|
+
const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/search`, {
|
|
1080
|
+
headers: {
|
|
1081
|
+
Authorization: getAuthHeader2(),
|
|
1082
|
+
Accept: "application/json"
|
|
1083
|
+
},
|
|
1084
|
+
params: {
|
|
1085
|
+
cql: query,
|
|
1086
|
+
limit: Math.min(limit, 25),
|
|
1087
|
+
expand: "space,version"
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
1090
|
+
const { ATLASSIAN_SITE_URL: siteUrl } = getAuth();
|
|
1091
|
+
const results = response.data.results.map((page) => ({
|
|
1092
|
+
id: page.id,
|
|
1093
|
+
title: page.title,
|
|
1094
|
+
type: page.type,
|
|
1095
|
+
space: page.space?.name || "Unknown",
|
|
1096
|
+
spaceKey: page.space?.key || "",
|
|
1097
|
+
url: `${siteUrl}/wiki${page._links.webui}`,
|
|
1098
|
+
lastModified: page.version?.when || ""
|
|
1099
|
+
}));
|
|
1100
|
+
if (results.length === 0) {
|
|
1101
|
+
logger4.warn("search-confluence returned NO RESULTS - this is a valid outcome, agent should not retry", {
|
|
1102
|
+
query,
|
|
1103
|
+
limit,
|
|
1104
|
+
totalSize: response.data.totalSize
|
|
1105
|
+
});
|
|
1106
|
+
} else {
|
|
1107
|
+
logger4.info("search-confluence result", {
|
|
1108
|
+
query,
|
|
1109
|
+
resultCount: results.length,
|
|
1110
|
+
totalSize: response.data.totalSize,
|
|
1111
|
+
titles: results.map((r) => r.title).slice(0, 3)
|
|
1112
|
+
// Log first 3 titles
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1115
|
+
return JSON.stringify({
|
|
1116
|
+
success: true,
|
|
1117
|
+
count: results.length,
|
|
1118
|
+
total: response.data.totalSize,
|
|
1119
|
+
results
|
|
1120
|
+
});
|
|
1121
|
+
} catch (error) {
|
|
1122
|
+
logger4.error("search-confluence error", {
|
|
1123
|
+
query,
|
|
1124
|
+
error: error.response?.data?.message || error.message,
|
|
1125
|
+
status: error.response?.status
|
|
1126
|
+
});
|
|
1127
|
+
return JSON.stringify({
|
|
1128
|
+
success: false,
|
|
1129
|
+
error: error.response?.data?.message || error.message
|
|
1130
|
+
});
|
|
1131
|
+
}
|
|
1132
|
+
}).build();
|
|
1133
|
+
}
|
|
1134
|
+
function createGetConfluencePageTool(getAuth, getAuthHeader2, logger4) {
|
|
1135
|
+
return toolBuilder().name("get-confluence-page").description("Get the full content of a specific Confluence page by its ID. Returns the page title, content (in storage format), space, and metadata.").category(ToolCategory.WEB).tag("confluence").tag("page").tag("content").usageNotes("Use this after search-confluence to retrieve the full content of a specific page. The page ID can be found in search results.").requires(["search-confluence"]).schema(z.object({
|
|
1136
|
+
page_id: z.string().describe("The Confluence page ID (from search results)")
|
|
1137
|
+
})).implement(async ({ page_id }) => {
|
|
1138
|
+
logger4.info("get-confluence-page called", { page_id });
|
|
1139
|
+
try {
|
|
1140
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1141
|
+
const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`, {
|
|
1142
|
+
headers: {
|
|
1143
|
+
Authorization: getAuthHeader2(),
|
|
1144
|
+
Accept: "application/json"
|
|
1145
|
+
},
|
|
1146
|
+
params: {
|
|
1147
|
+
expand: "body.storage,space,version,history"
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
const page = response.data;
|
|
1151
|
+
logger4.info("get-confluence-page result", {
|
|
1152
|
+
page_id,
|
|
1153
|
+
title: page.title,
|
|
1154
|
+
space: page.space?.name,
|
|
1155
|
+
contentLength: page.body?.storage?.value?.length || 0
|
|
1156
|
+
});
|
|
1157
|
+
return JSON.stringify({
|
|
1158
|
+
success: true,
|
|
1159
|
+
page: {
|
|
1160
|
+
id: page.id,
|
|
1161
|
+
title: page.title,
|
|
1162
|
+
type: page.type,
|
|
1163
|
+
space: page.space?.name || "Unknown",
|
|
1164
|
+
spaceKey: page.space?.key || "",
|
|
1165
|
+
content: page.body?.storage?.value || "",
|
|
1166
|
+
url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,
|
|
1167
|
+
created: page.history?.createdDate || "",
|
|
1168
|
+
lastModified: page.version?.when || "",
|
|
1169
|
+
version: page.version?.number || 1
|
|
1170
|
+
}
|
|
1171
|
+
});
|
|
1172
|
+
} catch (error) {
|
|
1173
|
+
logger4.error("get-confluence-page error", {
|
|
1174
|
+
page_id,
|
|
1175
|
+
error: error.response?.data?.message || error.message,
|
|
1176
|
+
status: error.response?.status
|
|
1177
|
+
});
|
|
1178
|
+
return JSON.stringify({
|
|
1179
|
+
success: false,
|
|
1180
|
+
error: error.response?.data?.message || error.message
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
}).build();
|
|
1184
|
+
}
|
|
1185
|
+
function createListConfluenceSpacesTool(getAuth, getAuthHeader2, logger4) {
|
|
1186
|
+
return toolBuilder().name("list-confluence-spaces").description("List all available Confluence spaces. Returns space names, keys, types, and descriptions to help identify where to search for information.").category(ToolCategory.WEB).tag("confluence").tag("spaces").tag("list").usageNotes("Use this first to discover available spaces before searching. Helps narrow down searches to specific areas (e.g., 'AI', 'BL3', 'Finance').").follows(["search-confluence"]).schema(z.object({
|
|
1187
|
+
limit: z.number().optional().describe("Maximum number of spaces to return (default: 25)")
|
|
1188
|
+
})).implement(async ({ limit = 25 }) => {
|
|
1189
|
+
logger4.info("list-confluence-spaces called", { limit });
|
|
1190
|
+
try {
|
|
1191
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1192
|
+
const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/space`, {
|
|
1193
|
+
headers: {
|
|
1194
|
+
Authorization: getAuthHeader2(),
|
|
1195
|
+
Accept: "application/json"
|
|
1196
|
+
},
|
|
1197
|
+
params: {
|
|
1198
|
+
limit
|
|
1199
|
+
}
|
|
1200
|
+
});
|
|
1201
|
+
const spaces = response.data.results.map((space) => ({
|
|
1202
|
+
key: space.key,
|
|
1203
|
+
name: space.name,
|
|
1204
|
+
type: space.type,
|
|
1205
|
+
description: space.description?.plain?.value || "",
|
|
1206
|
+
url: `${ATLASSIAN_SITE_URL}/wiki${space._links.webui}`
|
|
1207
|
+
}));
|
|
1208
|
+
logger4.info("list-confluence-spaces result", {
|
|
1209
|
+
spaceCount: spaces.length,
|
|
1210
|
+
spaceKeys: spaces.map((s) => s.key).slice(0, 5)
|
|
1211
|
+
// Log first 5 space keys
|
|
1212
|
+
});
|
|
1213
|
+
return JSON.stringify({
|
|
1214
|
+
success: true,
|
|
1215
|
+
count: spaces.length,
|
|
1216
|
+
spaces
|
|
1217
|
+
});
|
|
1218
|
+
} catch (error) {
|
|
1219
|
+
logger4.error("list-confluence-spaces error", {
|
|
1220
|
+
error: error.response?.data?.message || error.message,
|
|
1221
|
+
status: error.response?.status
|
|
1222
|
+
});
|
|
1223
|
+
return JSON.stringify({
|
|
1224
|
+
success: false,
|
|
1225
|
+
error: error.response?.data?.message || error.message
|
|
1226
|
+
});
|
|
1227
|
+
}
|
|
1228
|
+
}).build();
|
|
1229
|
+
}
|
|
1230
|
+
function createGetSpacePagesTool(getAuth, getAuthHeader2, logger4) {
|
|
1231
|
+
return toolBuilder().name("get-space-pages").description("Get all pages from a specific Confluence space by space key. Useful for browsing content in a particular area.").category(ToolCategory.WEB).tag("confluence").tag("space").tag("pages").usageNotes("Use this to explore all pages in a specific space. Get the space key from list-confluence-spaces first.").requires(["list-confluence-spaces"]).schema(z.object({
|
|
1232
|
+
space_key: z.string().describe("The space key (e.g., 'AI', 'BL3', 'FIN')"),
|
|
1233
|
+
limit: z.number().optional().describe("Maximum number of pages to return (default: 25)")
|
|
1234
|
+
})).implement(async ({ space_key, limit = 25 }) => {
|
|
1235
|
+
logger4.info("get-space-pages called", { space_key, limit });
|
|
1236
|
+
try {
|
|
1237
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1238
|
+
const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content`, {
|
|
1239
|
+
headers: {
|
|
1240
|
+
Authorization: getAuthHeader2(),
|
|
1241
|
+
Accept: "application/json"
|
|
1242
|
+
},
|
|
1243
|
+
params: {
|
|
1244
|
+
spaceKey: space_key,
|
|
1245
|
+
type: "page",
|
|
1246
|
+
limit,
|
|
1247
|
+
expand: "version"
|
|
1248
|
+
}
|
|
1249
|
+
});
|
|
1250
|
+
const pages = response.data.results.map((page) => ({
|
|
1251
|
+
id: page.id,
|
|
1252
|
+
title: page.title,
|
|
1253
|
+
url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,
|
|
1254
|
+
lastModified: page.version?.when || ""
|
|
1255
|
+
}));
|
|
1256
|
+
if (pages.length === 0) {
|
|
1257
|
+
logger4.warn("get-space-pages returned NO PAGES - this is a valid outcome, agent should not retry", {
|
|
1258
|
+
space_key,
|
|
1259
|
+
limit
|
|
1260
|
+
});
|
|
1261
|
+
} else {
|
|
1262
|
+
logger4.info("get-space-pages result", {
|
|
1263
|
+
space_key,
|
|
1264
|
+
pageCount: pages.length,
|
|
1265
|
+
titles: pages.map((p) => p.title).slice(0, 3)
|
|
1266
|
+
// Log first 3 titles
|
|
1267
|
+
});
|
|
1268
|
+
}
|
|
1269
|
+
return JSON.stringify({
|
|
1270
|
+
success: true,
|
|
1271
|
+
space: space_key,
|
|
1272
|
+
count: pages.length,
|
|
1273
|
+
pages
|
|
1274
|
+
});
|
|
1275
|
+
} catch (error) {
|
|
1276
|
+
logger4.error("get-space-pages error", {
|
|
1277
|
+
space_key,
|
|
1278
|
+
error: error.response?.data?.message || error.message,
|
|
1279
|
+
status: error.response?.status
|
|
1280
|
+
});
|
|
1281
|
+
return JSON.stringify({
|
|
1282
|
+
success: false,
|
|
1283
|
+
error: error.response?.data?.message || error.message
|
|
1284
|
+
});
|
|
1285
|
+
}
|
|
1286
|
+
}).build();
|
|
1287
|
+
}
|
|
1288
|
+
function createCreateConfluencePageTool(getAuth, getAuthHeader2, logger4) {
|
|
1289
|
+
return toolBuilder().name("create-confluence-page").description("Create a new page in a Confluence space. Requires space key, page title, and content (in HTML storage format).").category(ToolCategory.WEB).tag("confluence").tag("create").tag("write").usageNotes("Use this to create new documentation pages. Content should be in Confluence storage format (HTML). Get the space key from list-confluence-spaces first. Be mindful of creating duplicate pages.").requires(["list-confluence-spaces"]).schema(z.object({
|
|
1290
|
+
space_key: z.string().describe("The space key where the page will be created (e.g., 'AI', 'BL3')"),
|
|
1291
|
+
title: z.string().describe("The title of the new page"),
|
|
1292
|
+
content: z.string().describe("The page content in HTML format (Confluence storage format)"),
|
|
1293
|
+
parent_page_id: z.string().optional().describe("Optional parent page ID to create this as a child page")
|
|
1294
|
+
})).implement(async ({ space_key, title, content, parent_page_id }) => {
|
|
1295
|
+
logger4.info("create-confluence-page called", { space_key, title, hasParent: !!parent_page_id });
|
|
1296
|
+
try {
|
|
1297
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1298
|
+
const pageData = {
|
|
1299
|
+
type: "page",
|
|
1300
|
+
title,
|
|
1301
|
+
space: { key: space_key },
|
|
1302
|
+
body: {
|
|
1303
|
+
storage: {
|
|
1304
|
+
value: content,
|
|
1305
|
+
representation: "storage"
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
};
|
|
1309
|
+
if (parent_page_id) {
|
|
1310
|
+
pageData.ancestors = [{ id: parent_page_id }];
|
|
1311
|
+
}
|
|
1312
|
+
const response = await axios.post(
|
|
1313
|
+
`${ATLASSIAN_SITE_URL}/wiki/rest/api/content`,
|
|
1314
|
+
pageData,
|
|
1315
|
+
{
|
|
1316
|
+
headers: {
|
|
1317
|
+
Authorization: getAuthHeader2(),
|
|
1318
|
+
"Content-Type": "application/json"
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
);
|
|
1322
|
+
logger4.info("create-confluence-page result", {
|
|
1323
|
+
page_id: response.data.id,
|
|
1324
|
+
title: response.data.title,
|
|
1325
|
+
space: space_key
|
|
1326
|
+
});
|
|
1327
|
+
return JSON.stringify({
|
|
1328
|
+
success: true,
|
|
1329
|
+
page: {
|
|
1330
|
+
id: response.data.id,
|
|
1331
|
+
title: response.data.title,
|
|
1332
|
+
space: space_key,
|
|
1333
|
+
url: `${ATLASSIAN_SITE_URL}/wiki${response.data._links.webui}`,
|
|
1334
|
+
version: response.data.version?.number || 1
|
|
1335
|
+
}
|
|
1336
|
+
});
|
|
1337
|
+
} catch (error) {
|
|
1338
|
+
logger4.error("create-confluence-page error", {
|
|
1339
|
+
space_key,
|
|
1340
|
+
title,
|
|
1341
|
+
error: error.response?.data?.message || error.message,
|
|
1342
|
+
status: error.response?.status
|
|
1343
|
+
});
|
|
1344
|
+
return JSON.stringify({
|
|
1345
|
+
success: false,
|
|
1346
|
+
error: error.response?.data?.message || error.message
|
|
1347
|
+
});
|
|
1348
|
+
}
|
|
1349
|
+
}).build();
|
|
1350
|
+
}
|
|
1351
|
+
function createUpdateConfluencePageTool(getAuth, getAuthHeader2, logger4) {
|
|
1352
|
+
return toolBuilder().name("update-confluence-page").description("Update an existing Confluence page's content. Requires page ID, new title, and new content.").category(ToolCategory.WEB).tag("confluence").tag("update").tag("write").usageNotes("Use this to update existing documentation. You must provide the page ID (from search results). The tool will automatically handle version incrementing. Always get the current page content first to avoid overwriting important information.").requires(["get-confluence-page"]).schema(z.object({
|
|
1353
|
+
page_id: z.string().describe("The ID of the page to update"),
|
|
1354
|
+
title: z.string().describe("The new title for the page"),
|
|
1355
|
+
content: z.string().describe("The new content in HTML format (Confluence storage format)")
|
|
1356
|
+
})).implement(async ({ page_id, title, content }) => {
|
|
1357
|
+
logger4.info("update-confluence-page called", { page_id, title });
|
|
1358
|
+
try {
|
|
1359
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1360
|
+
const getResponse = await axios.get(
|
|
1361
|
+
`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,
|
|
1362
|
+
{
|
|
1363
|
+
headers: {
|
|
1364
|
+
Authorization: getAuthHeader2()
|
|
1365
|
+
},
|
|
1366
|
+
params: { expand: "version" }
|
|
1367
|
+
}
|
|
1368
|
+
);
|
|
1369
|
+
const currentVersion = getResponse.data.version.number;
|
|
1370
|
+
const updateResponse = await axios.put(
|
|
1371
|
+
`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,
|
|
1372
|
+
{
|
|
1373
|
+
type: "page",
|
|
1374
|
+
title,
|
|
1375
|
+
version: { number: currentVersion + 1 },
|
|
1376
|
+
body: {
|
|
1377
|
+
storage: {
|
|
1378
|
+
value: content,
|
|
1379
|
+
representation: "storage"
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
},
|
|
1383
|
+
{
|
|
1384
|
+
headers: {
|
|
1385
|
+
Authorization: getAuthHeader2(),
|
|
1386
|
+
"Content-Type": "application/json"
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
);
|
|
1390
|
+
logger4.info("update-confluence-page result", {
|
|
1391
|
+
page_id,
|
|
1392
|
+
title: updateResponse.data.title,
|
|
1393
|
+
previousVersion: currentVersion,
|
|
1394
|
+
newVersion: updateResponse.data.version.number
|
|
1395
|
+
});
|
|
1396
|
+
return JSON.stringify({
|
|
1397
|
+
success: true,
|
|
1398
|
+
page: {
|
|
1399
|
+
id: updateResponse.data.id,
|
|
1400
|
+
title: updateResponse.data.title,
|
|
1401
|
+
url: `${ATLASSIAN_SITE_URL}/wiki${updateResponse.data._links.webui}`,
|
|
1402
|
+
version: updateResponse.data.version.number,
|
|
1403
|
+
previousVersion: currentVersion
|
|
1404
|
+
}
|
|
1405
|
+
});
|
|
1406
|
+
} catch (error) {
|
|
1407
|
+
logger4.error("update-confluence-page error", {
|
|
1408
|
+
page_id,
|
|
1409
|
+
title,
|
|
1410
|
+
error: error.response?.data?.message || error.message,
|
|
1411
|
+
status: error.response?.status
|
|
1412
|
+
});
|
|
1413
|
+
return JSON.stringify({
|
|
1414
|
+
success: false,
|
|
1415
|
+
error: error.response?.data?.message || error.message
|
|
1416
|
+
});
|
|
1417
|
+
}
|
|
1418
|
+
}).build();
|
|
1419
|
+
}
|
|
1420
|
+
function createArchiveConfluencePageTool(getAuth, getAuthHeader2, logger4) {
|
|
1421
|
+
return toolBuilder().name("archive-confluence-page").description("Archive a Confluence page by moving it to trash. The page can be restored by space admins. Note: UI may require a note explaining why the page was archived.").category(ToolCategory.WEB).tag("confluence").tag("archive").tag("delete").usageNotes("Use this to archive outdated or obsolete documentation. The page is moved to trash, not permanently deleted. Space admins can restore it if needed. Be very careful - only archive pages that are truly obsolete.").conflicts(["create-confluence-page"]).schema(z.object({
|
|
1422
|
+
page_id: z.string().describe("The ID of the page to archive"),
|
|
1423
|
+
reason: z.string().optional().describe("Optional reason for archiving (for audit trail)")
|
|
1424
|
+
})).implement(async ({ page_id, reason }) => {
|
|
1425
|
+
logger4.info("archive-confluence-page called", { page_id, reason });
|
|
1426
|
+
try {
|
|
1427
|
+
const { ATLASSIAN_SITE_URL } = getAuth();
|
|
1428
|
+
const getResponse = await axios.get(
|
|
1429
|
+
`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,
|
|
1430
|
+
{
|
|
1431
|
+
headers: {
|
|
1432
|
+
Authorization: getAuthHeader2()
|
|
1433
|
+
},
|
|
1434
|
+
params: { expand: "version,body.storage,space" }
|
|
1435
|
+
}
|
|
1436
|
+
);
|
|
1437
|
+
const currentVersion = getResponse.data.version.number;
|
|
1438
|
+
const pageData = getResponse.data;
|
|
1439
|
+
await axios.put(
|
|
1440
|
+
`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,
|
|
1441
|
+
{
|
|
1442
|
+
version: { number: currentVersion + 1 },
|
|
1443
|
+
title: pageData.title,
|
|
1444
|
+
type: "page",
|
|
1445
|
+
status: "trashed",
|
|
1446
|
+
body: pageData.body,
|
|
1447
|
+
space: { key: pageData.space.key }
|
|
1448
|
+
},
|
|
1449
|
+
{
|
|
1450
|
+
headers: {
|
|
1451
|
+
Authorization: getAuthHeader2(),
|
|
1452
|
+
"Content-Type": "application/json"
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
);
|
|
1456
|
+
logger4.info("archive-confluence-page result", {
|
|
1457
|
+
page_id,
|
|
1458
|
+
title: pageData.title,
|
|
1459
|
+
previousVersion: currentVersion,
|
|
1460
|
+
newVersion: currentVersion + 1
|
|
1461
|
+
});
|
|
1462
|
+
return JSON.stringify({
|
|
1463
|
+
success: true,
|
|
1464
|
+
archived: {
|
|
1465
|
+
id: page_id,
|
|
1466
|
+
title: pageData.title,
|
|
1467
|
+
previousVersion: currentVersion,
|
|
1468
|
+
newVersion: currentVersion + 1,
|
|
1469
|
+
reason: reason || "Archived via API",
|
|
1470
|
+
note: "Page moved to trash. Space admins can restore it from the Confluence UI."
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
} catch (error) {
|
|
1474
|
+
logger4.error("archive-confluence-page error", {
|
|
1475
|
+
page_id,
|
|
1476
|
+
error: error.response?.data?.message || error.message,
|
|
1477
|
+
status: error.response?.status
|
|
1478
|
+
});
|
|
1479
|
+
return JSON.stringify({
|
|
1480
|
+
success: false,
|
|
1481
|
+
error: error.response?.data?.message || error.message
|
|
1482
|
+
});
|
|
1483
|
+
}
|
|
1484
|
+
}).build();
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
// src/web/confluence/index.ts
|
|
1488
|
+
var logLevel2 = process.env.LOG_LEVEL?.toLowerCase() || LogLevel.INFO;
|
|
1489
|
+
var logger2 = createLogger("[tools:confluence]", { level: logLevel2 });
|
|
1490
|
+
var searchConfluence = createSearchConfluenceTool(getConfig, getAuthHeader, logger2);
|
|
1491
|
+
var getConfluencePage = createGetConfluencePageTool(getConfig, getAuthHeader, logger2);
|
|
1492
|
+
var listConfluenceSpaces = createListConfluenceSpacesTool(getConfig, getAuthHeader, logger2);
|
|
1493
|
+
var getSpacePages = createGetSpacePagesTool(getConfig, getAuthHeader, logger2);
|
|
1494
|
+
var createConfluencePage = createCreateConfluencePageTool(getConfig, getAuthHeader, logger2);
|
|
1495
|
+
var updateConfluencePage = createUpdateConfluencePageTool(getConfig, getAuthHeader, logger2);
|
|
1496
|
+
var archiveConfluencePage = createArchiveConfluencePageTool(getConfig, getAuthHeader, logger2);
|
|
1497
|
+
var confluenceTools = [
|
|
1498
|
+
// Read tools
|
|
1499
|
+
searchConfluence,
|
|
1500
|
+
getConfluencePage,
|
|
1501
|
+
listConfluenceSpaces,
|
|
1502
|
+
getSpacePages,
|
|
1503
|
+
// Write tools
|
|
1504
|
+
createConfluencePage,
|
|
1505
|
+
updateConfluencePage,
|
|
1506
|
+
archiveConfluencePage
|
|
1507
|
+
];
|
|
1508
|
+
function createConfluenceTools(config = {}) {
|
|
1509
|
+
const {
|
|
1510
|
+
apiKey,
|
|
1511
|
+
email,
|
|
1512
|
+
siteUrl,
|
|
1513
|
+
logLevel: customLogLevel
|
|
1514
|
+
} = config;
|
|
1515
|
+
const getConfiguredAuth = createGetConfiguredAuth(apiKey, email, siteUrl);
|
|
1516
|
+
const getConfiguredAuthHeader = createGetConfiguredAuthHeader(getConfiguredAuth);
|
|
1517
|
+
const toolLogger = customLogLevel ? createLogger("tools:confluence", { level: customLogLevel }) : logger2;
|
|
1518
|
+
const searchConfluence2 = createSearchConfluenceTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1519
|
+
const getConfluencePage2 = createGetConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1520
|
+
const listConfluenceSpaces2 = createListConfluenceSpacesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1521
|
+
const getSpacePages2 = createGetSpacePagesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1522
|
+
const createConfluencePage2 = createCreateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1523
|
+
const updateConfluencePage2 = createUpdateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1524
|
+
const archiveConfluencePage2 = createArchiveConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);
|
|
1525
|
+
return {
|
|
1526
|
+
searchConfluence: searchConfluence2,
|
|
1527
|
+
getConfluencePage: getConfluencePage2,
|
|
1528
|
+
listConfluenceSpaces: listConfluenceSpaces2,
|
|
1529
|
+
getSpacePages: getSpacePages2,
|
|
1530
|
+
createConfluencePage: createConfluencePage2,
|
|
1531
|
+
updateConfluencePage: updateConfluencePage2,
|
|
1532
|
+
archiveConfluencePage: archiveConfluencePage2
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1035
1535
|
var jsonParser = toolBuilder().name("json-parser").description("Parse JSON string into an object. Validates JSON syntax and returns parsed data or error details.").category(ToolCategory.UTILITY).tags(["json", "parse", "data"]).schema(z.object({
|
|
1036
1536
|
json: z.string().describe("JSON string to parse"),
|
|
1037
1537
|
strict: z.boolean().default(true).describe("Use strict JSON parsing (no trailing commas, etc.)")
|
|
@@ -2256,8 +2756,8 @@ var AskHumanInputSchema = z.object({
|
|
|
2256
2756
|
*/
|
|
2257
2757
|
suggestions: z.array(z.string()).optional().describe("Suggested responses for the human")
|
|
2258
2758
|
});
|
|
2259
|
-
var
|
|
2260
|
-
var
|
|
2759
|
+
var logLevel3 = process.env.LOG_LEVEL?.toLowerCase() || LogLevel.INFO;
|
|
2760
|
+
var logger3 = createLogger("askHuman", { level: logLevel3 });
|
|
2261
2761
|
function createAskHumanTool() {
|
|
2262
2762
|
return toolBuilder().name("ask-human").description(
|
|
2263
2763
|
"Ask a human for input or approval. Use this when you need human guidance, approval for a critical action, or clarification on ambiguous requirements. The agent execution will pause until the human responds."
|
|
@@ -2290,13 +2790,13 @@ function createAskHumanTool() {
|
|
|
2290
2790
|
suggestions: validatedInput.suggestions,
|
|
2291
2791
|
status: "pending"
|
|
2292
2792
|
};
|
|
2293
|
-
|
|
2793
|
+
logger3.debug("About to call interrupt()", { humanRequest });
|
|
2294
2794
|
let response;
|
|
2295
2795
|
try {
|
|
2296
2796
|
response = interrupt(humanRequest);
|
|
2297
|
-
|
|
2797
|
+
logger3.debug("interrupt() returned successfully", { response, responseType: typeof response });
|
|
2298
2798
|
} catch (error) {
|
|
2299
|
-
|
|
2799
|
+
logger3.debug("interrupt() threw error (expected for GraphInterrupt)", {
|
|
2300
2800
|
errorType: error?.constructor?.name,
|
|
2301
2801
|
error: error instanceof Error ? error.message : String(error)
|
|
2302
2802
|
});
|
|
@@ -2321,6 +2821,6 @@ function createAskHumanTool() {
|
|
|
2321
2821
|
}
|
|
2322
2822
|
var askHumanTool = createAskHumanTool();
|
|
2323
2823
|
|
|
2324
|
-
export { AskHumanInputSchema, DuckDuckGoProvider, SerperProvider, arrayFilter, arrayGroupBy, arrayMap, arraySort, askHumanTool, calculator, createAskHumanTool, createDuckDuckGoProvider, createSerperProvider, createSlackTools, creditCardValidator, csvGenerator, csvParser, csvToJson, currentDateTime, dateArithmetic, dateComparison, dateDifference, dateFormatter, directoryCreate, directoryDelete, directoryList, emailValidator, extractImages, extractLinks, fileAppend, fileDelete, fileExists, fileReader, fileSearch, fileWriter, getSlackChannels, getSlackMessages, htmlParser, httpClient, httpGet, httpPost, ipValidator, jsonMerge, jsonParser, jsonQuery, jsonStringify, jsonToCsv, jsonToXml, jsonValidator, mathFunctions, notifySlack, objectOmit, objectPick, pathBasename, pathDirname, pathExtension, pathJoin, pathNormalize, pathParse, pathRelative, pathResolve, phoneValidator, randomNumber, searchResultSchema, sendSlackMessage, slackTools, statistics, stringCaseConverter, stringJoin, stringLength, stringReplace, stringSplit, stringSubstring, stringTrim, urlBuilder, urlQueryParser, urlValidator, urlValidatorSimple, uuidValidator, webScraper, webSearch, webSearchOutputSchema, webSearchSchema, xmlGenerator, xmlParser, xmlToJson };
|
|
2824
|
+
export { AskHumanInputSchema, DuckDuckGoProvider, SerperProvider, archiveConfluencePage, arrayFilter, arrayGroupBy, arrayMap, arraySort, askHumanTool, calculator, confluenceTools, createAskHumanTool, createConfluencePage, createConfluenceTools, createDuckDuckGoProvider, createSerperProvider, createSlackTools, creditCardValidator, csvGenerator, csvParser, csvToJson, currentDateTime, dateArithmetic, dateComparison, dateDifference, dateFormatter, directoryCreate, directoryDelete, directoryList, emailValidator, extractImages, extractLinks, fileAppend, fileDelete, fileExists, fileReader, fileSearch, fileWriter, getConfluencePage, getSlackChannels, getSlackMessages, getSpacePages, htmlParser, httpClient, httpGet, httpPost, ipValidator, jsonMerge, jsonParser, jsonQuery, jsonStringify, jsonToCsv, jsonToXml, jsonValidator, listConfluenceSpaces, mathFunctions, notifySlack, objectOmit, objectPick, pathBasename, pathDirname, pathExtension, pathJoin, pathNormalize, pathParse, pathRelative, pathResolve, phoneValidator, randomNumber, searchConfluence, searchResultSchema, sendSlackMessage, slackTools, statistics, stringCaseConverter, stringJoin, stringLength, stringReplace, stringSplit, stringSubstring, stringTrim, updateConfluencePage, urlBuilder, urlQueryParser, urlValidator, urlValidatorSimple, uuidValidator, webScraper, webSearch, webSearchOutputSchema, webSearchSchema, xmlGenerator, xmlParser, xmlToJson };
|
|
2325
2825
|
//# sourceMappingURL=index.js.map
|
|
2326
2826
|
//# sourceMappingURL=index.js.map
|