@sonde/packs 0.1.2 → 0.1.3

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 (105) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +39 -35
  3. package/CHANGELOG.md +9 -0
  4. package/dist/docker/manifest (# Edit conflict 2026-02-19 LIl7ilN #).js +54 -0
  5. package/dist/index.d.ts +9 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +9 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/integrations/a10.d.ts +3 -0
  10. package/dist/integrations/a10.d.ts.map +1 -0
  11. package/dist/integrations/a10.js +218 -0
  12. package/dist/integrations/a10.js.map +1 -0
  13. package/dist/integrations/checkpoint.d.ts +3 -0
  14. package/dist/integrations/checkpoint.d.ts.map +1 -0
  15. package/dist/integrations/checkpoint.js +249 -0
  16. package/dist/integrations/checkpoint.js.map +1 -0
  17. package/dist/integrations/datadog.d.ts +3 -0
  18. package/dist/integrations/datadog.d.ts.map +1 -0
  19. package/dist/integrations/datadog.js +195 -0
  20. package/dist/integrations/datadog.js.map +1 -0
  21. package/dist/integrations/jira.d.ts +3 -0
  22. package/dist/integrations/jira.d.ts.map +1 -0
  23. package/dist/integrations/jira.js +199 -0
  24. package/dist/integrations/jira.js.map +1 -0
  25. package/dist/integrations/loki.d.ts +3 -0
  26. package/dist/integrations/loki.d.ts.map +1 -0
  27. package/dist/integrations/loki.js +178 -0
  28. package/dist/integrations/loki.js.map +1 -0
  29. package/dist/integrations/meraki.d.ts +3 -0
  30. package/dist/integrations/meraki.d.ts.map +1 -0
  31. package/dist/integrations/meraki.js +238 -0
  32. package/dist/integrations/meraki.js.map +1 -0
  33. package/dist/integrations/pagerduty.d.ts +3 -0
  34. package/dist/integrations/pagerduty.d.ts.map +1 -0
  35. package/dist/integrations/pagerduty.js +229 -0
  36. package/dist/integrations/pagerduty.js.map +1 -0
  37. package/dist/integrations/thousandeyes.d.ts +3 -0
  38. package/dist/integrations/thousandeyes.d.ts.map +1 -0
  39. package/dist/integrations/thousandeyes.js +263 -0
  40. package/dist/integrations/thousandeyes.js.map +1 -0
  41. package/dist/integrations/vcenter.d.ts +3 -0
  42. package/dist/integrations/vcenter.d.ts.map +1 -0
  43. package/dist/integrations/vcenter.js +190 -0
  44. package/dist/integrations/vcenter.js.map +1 -0
  45. package/dist/proxmox/probes/ceph-status.test.d.ts (# Edit conflict 2026-02-19 N25hAvJ #).map +1 -0
  46. package/dist/system/index.d.ts.map +1 -1
  47. package/dist/system/index.js +8 -0
  48. package/dist/system/index.js.map +1 -1
  49. package/dist/system/manifest.d.ts.map +1 -1
  50. package/dist/system/manifest.js +82 -3
  51. package/dist/system/manifest.js.map +1 -1
  52. package/dist/system/probes/logs-dmesg.d.ts +13 -0
  53. package/dist/system/probes/logs-dmesg.d.ts.map +1 -0
  54. package/dist/system/probes/logs-dmesg.js +22 -0
  55. package/dist/system/probes/logs-dmesg.js.map +1 -0
  56. package/dist/system/probes/logs-dmesg.test.d.ts +2 -0
  57. package/dist/system/probes/logs-dmesg.test.d.ts.map +1 -0
  58. package/dist/system/probes/logs-dmesg.test.js +55 -0
  59. package/dist/system/probes/logs-dmesg.test.js.map +1 -0
  60. package/dist/system/probes/logs-journal.d.ts +21 -0
  61. package/dist/system/probes/logs-journal.d.ts.map +1 -0
  62. package/dist/system/probes/logs-journal.js +70 -0
  63. package/dist/system/probes/logs-journal.js.map +1 -0
  64. package/dist/system/probes/logs-journal.test.d.ts +2 -0
  65. package/dist/system/probes/logs-journal.test.d.ts.map +1 -0
  66. package/dist/system/probes/logs-journal.test.js +113 -0
  67. package/dist/system/probes/logs-journal.test.js.map +1 -0
  68. package/dist/system/probes/logs-tail.d.ts +14 -0
  69. package/dist/system/probes/logs-tail.d.ts.map +1 -0
  70. package/dist/system/probes/logs-tail.js +40 -0
  71. package/dist/system/probes/logs-tail.js.map +1 -0
  72. package/dist/system/probes/logs-tail.test.d.ts +2 -0
  73. package/dist/system/probes/logs-tail.test.d.ts.map +1 -0
  74. package/dist/system/probes/logs-tail.test.js +82 -0
  75. package/dist/system/probes/logs-tail.test.js.map +1 -0
  76. package/dist/system/probes/traceroute.d.ts +17 -0
  77. package/dist/system/probes/traceroute.d.ts.map +1 -0
  78. package/dist/system/probes/traceroute.js +72 -0
  79. package/dist/system/probes/traceroute.js.map +1 -0
  80. package/dist/system/probes/traceroute.test.d.ts +2 -0
  81. package/dist/system/probes/traceroute.test.d.ts.map +1 -0
  82. package/dist/system/probes/traceroute.test.js +98 -0
  83. package/dist/system/probes/traceroute.test.js.map +1 -0
  84. package/package.json +1 -1
  85. package/src/index.ts +9 -0
  86. package/src/integrations/a10.ts +370 -0
  87. package/src/integrations/checkpoint.ts +381 -0
  88. package/src/integrations/datadog.ts +281 -0
  89. package/src/integrations/jira.ts +272 -0
  90. package/src/integrations/loki.ts +228 -0
  91. package/src/integrations/meraki.ts +344 -0
  92. package/src/integrations/pagerduty.ts +319 -0
  93. package/src/integrations/thousandeyes.ts +353 -0
  94. package/src/integrations/vcenter.ts +261 -0
  95. package/src/system/index.ts +8 -0
  96. package/src/system/manifest.ts +93 -3
  97. package/src/system/probes/logs-dmesg.test.ts +83 -0
  98. package/src/system/probes/logs-dmesg.ts +38 -0
  99. package/src/system/probes/logs-journal.test.ts +142 -0
  100. package/src/system/probes/logs-journal.ts +103 -0
  101. package/src/system/probes/logs-tail.test.ts +140 -0
  102. package/src/system/probes/logs-tail.ts +70 -0
  103. package/src/system/probes/traceroute.test.ts +149 -0
  104. package/src/system/probes/traceroute.ts +99 -0
  105. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,199 @@
1
+ // --- Auth helpers ---
2
+ /** Build Basic auth header from email + API token */
3
+ function buildAuthHeaders(credentials) {
4
+ const email = credentials.credentials.email ?? '';
5
+ const apiToken = credentials.credentials.apiToken ?? '';
6
+ if (email && apiToken) {
7
+ const encoded = Buffer.from(`${email}:${apiToken}`).toString('base64');
8
+ return { Authorization: `Basic ${encoded}` };
9
+ }
10
+ return {};
11
+ }
12
+ // --- REST helper ---
13
+ async function jiraGet(path, config, credentials, fetchFn, params) {
14
+ const base = `${config.endpoint.replace(/\/$/, '')}${path}`;
15
+ const url = new URL(base);
16
+ if (params) {
17
+ for (const [key, value] of Object.entries(params)) {
18
+ url.searchParams.set(key, value);
19
+ }
20
+ }
21
+ const headers = {
22
+ Accept: 'application/json',
23
+ ...buildAuthHeaders(credentials),
24
+ ...config.headers,
25
+ };
26
+ const res = await fetchFn(url.toString(), { headers });
27
+ if (!res.ok) {
28
+ throw new Error(`Jira API returned ${res.status}: ${res.statusText}`);
29
+ }
30
+ return (await res.json());
31
+ }
32
+ // --- Probe handlers ---
33
+ const issuesSearch = async (params, config, credentials, fetchFn) => {
34
+ const jql = params?.jql;
35
+ if (!jql)
36
+ throw new Error('jql parameter is required');
37
+ const maxResults = params?.max_results || 50;
38
+ const queryParams = {
39
+ jql,
40
+ maxResults: String(maxResults),
41
+ };
42
+ const data = await jiraGet('/rest/api/3/search/jql', config, credentials, fetchFn, queryParams);
43
+ const issues = data.issues ?? [];
44
+ return {
45
+ issues: issues.map((i) => ({
46
+ key: i.key,
47
+ summary: i.fields?.summary ?? null,
48
+ status: i.fields?.status?.name ?? null,
49
+ priority: i.fields?.priority?.name ?? null,
50
+ assignee: i.fields?.assignee?.displayName ?? null,
51
+ issueType: i.fields?.issuetype?.name ?? null,
52
+ created: i.fields?.created ?? null,
53
+ updated: i.fields?.updated ?? null,
54
+ })),
55
+ total: data.total ?? issues.length,
56
+ count: issues.length,
57
+ };
58
+ };
59
+ const issueDetail = async (params, config, credentials, fetchFn) => {
60
+ const key = params?.key;
61
+ if (!key)
62
+ throw new Error('key parameter is required (e.g. PROJ-123)');
63
+ return jiraGet(`/rest/api/3/issue/${key}`, config, credentials, fetchFn);
64
+ };
65
+ const issueChangelog = async (params, config, credentials, fetchFn) => {
66
+ const key = params?.key;
67
+ if (!key)
68
+ throw new Error('key parameter is required (e.g. PROJ-123)');
69
+ const data = await jiraGet(`/rest/api/3/issue/${key}/changelog`, config, credentials, fetchFn);
70
+ const entries = data.values ?? [];
71
+ return {
72
+ changelog: entries.map((e) => ({
73
+ id: e.id ?? null,
74
+ author: e.author?.displayName ?? null,
75
+ created: e.created ?? null,
76
+ items: (e.items ?? []).map((item) => ({
77
+ field: item.field ?? null,
78
+ from: item.fromString ?? null,
79
+ to: item.toString ?? null,
80
+ })),
81
+ })),
82
+ total: data.total ?? entries.length,
83
+ };
84
+ };
85
+ const projectsList = async (_params, config, credentials, fetchFn) => {
86
+ const data = await jiraGet('/rest/api/3/project/search', config, credentials, fetchFn);
87
+ const projects = data.values ?? [];
88
+ return {
89
+ projects: projects.map((p) => ({
90
+ key: p.key,
91
+ name: p.name,
92
+ projectType: p.projectTypeKey ?? null,
93
+ style: p.style ?? null,
94
+ })),
95
+ count: projects.length,
96
+ };
97
+ };
98
+ const jiraHealth = async (_params, config, credentials, fetchFn) => {
99
+ const data = await jiraGet('/rest/api/3/serverInfo', config, credentials, fetchFn);
100
+ return {
101
+ baseUrl: data.baseUrl ?? null,
102
+ version: data.version ?? null,
103
+ deploymentType: data.deploymentType ?? null,
104
+ serverTitle: data.serverTitle ?? null,
105
+ };
106
+ };
107
+ // --- Pack definition ---
108
+ export const jiraPack = {
109
+ manifest: {
110
+ name: 'jira',
111
+ type: 'integration',
112
+ version: '0.1.0',
113
+ description: 'Atlassian Jira — issue search, details, changelog, and projects',
114
+ requires: { groups: [], files: [], commands: [] },
115
+ probes: [
116
+ {
117
+ name: 'issues.search',
118
+ description: 'Search issues via JQL query',
119
+ capability: 'observe',
120
+ params: {
121
+ jql: {
122
+ type: 'string',
123
+ description: 'JQL query (e.g. "project = PROJ AND status = Open")',
124
+ required: true,
125
+ },
126
+ max_results: {
127
+ type: 'number',
128
+ description: 'Maximum results to return (default: 50)',
129
+ required: false,
130
+ },
131
+ },
132
+ timeout: 15000,
133
+ },
134
+ {
135
+ name: 'issue.detail',
136
+ description: 'Get full issue details by key',
137
+ capability: 'observe',
138
+ params: {
139
+ key: {
140
+ type: 'string',
141
+ description: 'Issue key (e.g. PROJ-123)',
142
+ required: true,
143
+ },
144
+ },
145
+ timeout: 15000,
146
+ },
147
+ {
148
+ name: 'issue.changelog',
149
+ description: 'Get change history for an issue',
150
+ capability: 'observe',
151
+ params: {
152
+ key: {
153
+ type: 'string',
154
+ description: 'Issue key (e.g. PROJ-123)',
155
+ required: true,
156
+ },
157
+ },
158
+ timeout: 15000,
159
+ },
160
+ {
161
+ name: 'projects.list',
162
+ description: 'List all accessible projects',
163
+ capability: 'observe',
164
+ params: {},
165
+ timeout: 15000,
166
+ },
167
+ {
168
+ name: 'health',
169
+ description: 'Jira server info and connectivity check',
170
+ capability: 'observe',
171
+ params: {},
172
+ timeout: 10000,
173
+ },
174
+ ],
175
+ runbook: {
176
+ category: 'itsm',
177
+ probes: ['health', 'projects.list'],
178
+ parallel: true,
179
+ },
180
+ },
181
+ handlers: {
182
+ 'issues.search': issuesSearch,
183
+ 'issue.detail': issueDetail,
184
+ 'issue.changelog': issueChangelog,
185
+ 'projects.list': projectsList,
186
+ health: jiraHealth,
187
+ },
188
+ testConnection: async (config, credentials, fetchFn) => {
189
+ const url = `${config.endpoint.replace(/\/$/, '')}/rest/api/3/serverInfo`;
190
+ const headers = {
191
+ Accept: 'application/json',
192
+ ...buildAuthHeaders(credentials),
193
+ ...config.headers,
194
+ };
195
+ const res = await fetchFn(url, { headers });
196
+ return res.ok;
197
+ },
198
+ };
199
+ //# sourceMappingURL=jira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/integrations/jira.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { IntegrationPack } from '@sonde/shared';
2
+ export declare const lokiPack: IntegrationPack;
3
+ //# sourceMappingURL=loki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loki.d.ts","sourceRoot":"","sources":["../../src/integrations/loki.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,eAAe,CAAC;AAqIvB,eAAO,MAAM,QAAQ,EAAE,eAwFtB,CAAC"}
@@ -0,0 +1,178 @@
1
+ // --- Auth helpers ---
2
+ /** Build auth headers: Basic (username:password) or Bearer token */
3
+ function buildAuthHeaders(credentials) {
4
+ if (credentials.authMethod === 'bearer_token') {
5
+ const token = credentials.credentials.token ?? '';
6
+ return { Authorization: `Bearer ${token}` };
7
+ }
8
+ const { username, password } = credentials.credentials;
9
+ if (username && password) {
10
+ const encoded = Buffer.from(`${username}:${password}`).toString('base64');
11
+ return { Authorization: `Basic ${encoded}` };
12
+ }
13
+ return {};
14
+ }
15
+ // --- REST helper ---
16
+ async function lokiGet(path, config, credentials, fetchFn, params) {
17
+ const base = `${config.endpoint.replace(/\/$/, '')}${path}`;
18
+ const url = new URL(base);
19
+ if (params) {
20
+ for (const [key, value] of Object.entries(params)) {
21
+ url.searchParams.set(key, value);
22
+ }
23
+ }
24
+ const headers = {
25
+ Accept: 'application/json',
26
+ ...buildAuthHeaders(credentials),
27
+ ...config.headers,
28
+ };
29
+ const res = await fetchFn(url.toString(), { headers });
30
+ if (!res.ok) {
31
+ throw new Error(`Loki API returned ${res.status}: ${res.statusText}`);
32
+ }
33
+ return (await res.json());
34
+ }
35
+ // --- Probe handlers ---
36
+ const lokiQuery = async (params, config, credentials, fetchFn) => {
37
+ const query = params?.query;
38
+ if (!query)
39
+ throw new Error('query parameter is required (LogQL expression)');
40
+ const limit = params?.limit || 100;
41
+ const now = Math.floor(Date.now() / 1e9);
42
+ const start = params?.start;
43
+ const end = params?.end;
44
+ const queryParams = {
45
+ query,
46
+ limit: String(limit),
47
+ start: start ?? String(now - 3600),
48
+ end: end ?? String(now),
49
+ };
50
+ const data = await lokiGet('/loki/api/v1/query_range', config, credentials, fetchFn, queryParams);
51
+ const results = data.data?.result ?? [];
52
+ return {
53
+ status: data.status ?? 'unknown',
54
+ resultType: data.data?.resultType ?? null,
55
+ results: results.map((r) => ({
56
+ stream: r.stream ?? {},
57
+ values: (r.values ?? []).map(([ts, line]) => ({
58
+ timestamp: ts,
59
+ line,
60
+ })),
61
+ })),
62
+ count: results.length,
63
+ };
64
+ };
65
+ const lokiLabels = async (_params, config, credentials, fetchFn) => {
66
+ const data = await lokiGet('/loki/api/v1/labels', config, credentials, fetchFn);
67
+ return {
68
+ labels: data.data ?? [],
69
+ count: (data.data ?? []).length,
70
+ };
71
+ };
72
+ const lokiSeries = async (params, config, credentials, fetchFn) => {
73
+ const match = params?.match;
74
+ if (!match)
75
+ throw new Error('match parameter is required (label selector)');
76
+ const data = await lokiGet('/loki/api/v1/series', config, credentials, fetchFn, { match });
77
+ return {
78
+ series: data.data ?? [],
79
+ count: (data.data ?? []).length,
80
+ };
81
+ };
82
+ const lokiHealth = async (_params, config, credentials, fetchFn) => {
83
+ const url = `${config.endpoint.replace(/\/$/, '')}/ready`;
84
+ const headers = {
85
+ ...buildAuthHeaders(credentials),
86
+ ...config.headers,
87
+ };
88
+ const res = await fetchFn(url, { headers });
89
+ return { ready: res.ok, status: res.status };
90
+ };
91
+ // --- Pack definition ---
92
+ export const lokiPack = {
93
+ manifest: {
94
+ name: 'loki',
95
+ type: 'integration',
96
+ version: '0.1.0',
97
+ description: 'Grafana Loki — LogQL queries, labels, series, and health',
98
+ requires: { groups: [], files: [], commands: [] },
99
+ probes: [
100
+ {
101
+ name: 'query',
102
+ description: 'Run a LogQL query over a time range',
103
+ capability: 'observe',
104
+ params: {
105
+ query: {
106
+ type: 'string',
107
+ description: 'LogQL query expression (e.g. {job="varlogs"})',
108
+ required: true,
109
+ },
110
+ start: {
111
+ type: 'string',
112
+ description: 'Start time as Unix epoch seconds (default: 1 hour ago)',
113
+ required: false,
114
+ },
115
+ end: {
116
+ type: 'string',
117
+ description: 'End time as Unix epoch seconds (default: now)',
118
+ required: false,
119
+ },
120
+ limit: {
121
+ type: 'number',
122
+ description: 'Maximum log entries to return (default: 100)',
123
+ required: false,
124
+ },
125
+ },
126
+ timeout: 30000,
127
+ },
128
+ {
129
+ name: 'labels',
130
+ description: 'List all label names',
131
+ capability: 'observe',
132
+ params: {},
133
+ timeout: 10000,
134
+ },
135
+ {
136
+ name: 'series',
137
+ description: 'Find series matching a label selector',
138
+ capability: 'observe',
139
+ params: {
140
+ match: {
141
+ type: 'string',
142
+ description: 'Label selector (e.g. {job="varlogs"})',
143
+ required: true,
144
+ },
145
+ },
146
+ timeout: 15000,
147
+ },
148
+ {
149
+ name: 'health',
150
+ description: 'Loki readiness check',
151
+ capability: 'observe',
152
+ params: {},
153
+ timeout: 5000,
154
+ },
155
+ ],
156
+ runbook: {
157
+ category: 'observability',
158
+ probes: ['health', 'labels'],
159
+ parallel: true,
160
+ },
161
+ },
162
+ handlers: {
163
+ query: lokiQuery,
164
+ labels: lokiLabels,
165
+ series: lokiSeries,
166
+ health: lokiHealth,
167
+ },
168
+ testConnection: async (config, credentials, fetchFn) => {
169
+ const url = `${config.endpoint.replace(/\/$/, '')}/ready`;
170
+ const headers = {
171
+ ...buildAuthHeaders(credentials),
172
+ ...config.headers,
173
+ };
174
+ const res = await fetchFn(url, { headers });
175
+ return res.ok;
176
+ },
177
+ };
178
+ //# sourceMappingURL=loki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loki.js","sourceRoot":"","sources":["../../src/integrations/loki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { IntegrationPack } from '@sonde/shared';
2
+ export declare const merakiPack: IntegrationPack;
3
+ //# sourceMappingURL=meraki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meraki.d.ts","sourceRoot":"","sources":["../../src/integrations/meraki.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,eAAe,CAAC;AAgOvB,eAAO,MAAM,UAAU,EAAE,eAiHxB,CAAC"}
@@ -0,0 +1,238 @@
1
+ // --- Auth helpers ---
2
+ function buildAuthHeaders(credentials) {
3
+ const apiKey = credentials.credentials.apiKey ?? '';
4
+ return { Authorization: `Bearer ${apiKey}` };
5
+ }
6
+ // --- REST helper ---
7
+ async function merakiGet(path, config, credentials, fetchFn, params) {
8
+ const base = `${config.endpoint.replace(/\/$/, '')}/api/v1${path}`;
9
+ const url = new URL(base);
10
+ if (params) {
11
+ for (const [key, value] of Object.entries(params)) {
12
+ url.searchParams.set(key, value);
13
+ }
14
+ }
15
+ const headers = {
16
+ Accept: 'application/json',
17
+ ...buildAuthHeaders(credentials),
18
+ ...config.headers,
19
+ };
20
+ const res = await fetchFn(url.toString(), { headers });
21
+ if (!res.ok) {
22
+ throw new Error(`Meraki API returned ${res.status}: ${res.statusText}`);
23
+ }
24
+ return (await res.json());
25
+ }
26
+ // --- Probe handlers ---
27
+ const organizationsList = async (_params, config, credentials, fetchFn) => {
28
+ const orgs = await merakiGet('/organizations', config, credentials, fetchFn);
29
+ return {
30
+ organizations: orgs.map((o) => ({
31
+ id: o.id ?? null,
32
+ name: o.name ?? null,
33
+ url: o.url ?? null,
34
+ })),
35
+ count: orgs.length,
36
+ };
37
+ };
38
+ const devicesStatuses = async (params, config, credentials, fetchFn) => {
39
+ const orgId = params?.orgId || credentials.credentials.orgId;
40
+ if (!orgId)
41
+ throw new Error('orgId parameter is required');
42
+ const devices = await merakiGet(`/organizations/${encodeURIComponent(orgId)}/devices/statuses`, config, credentials, fetchFn);
43
+ return {
44
+ devices: devices.map((d) => ({
45
+ name: d.name ?? null,
46
+ serial: d.serial ?? null,
47
+ model: d.model ?? null,
48
+ status: d.status ?? null,
49
+ lanIp: d.lanIp ?? null,
50
+ mac: d.mac ?? null,
51
+ networkId: d.networkId ?? null,
52
+ })),
53
+ count: devices.length,
54
+ };
55
+ };
56
+ const switchPortStatuses = async (params, config, credentials, fetchFn) => {
57
+ const serial = params?.serial;
58
+ if (!serial)
59
+ throw new Error('serial parameter is required');
60
+ const ports = await merakiGet(`/devices/${encodeURIComponent(serial)}/switch/ports/statuses`, config, credentials, fetchFn);
61
+ return {
62
+ ports: ports.map((p) => ({
63
+ portId: p.portId ?? null,
64
+ enabled: p.enabled ?? false,
65
+ status: p.status ?? null,
66
+ speed: p.speed ?? null,
67
+ duplex: p.duplex ?? null,
68
+ cdp: p.cdp ?? null,
69
+ lldp: p.lldp ?? null,
70
+ errors: p.errors ?? [],
71
+ usage: p.usageInKb ?? null,
72
+ })),
73
+ count: ports.length,
74
+ };
75
+ };
76
+ const deviceLldpCdp = async (params, config, credentials, fetchFn) => {
77
+ const serial = params?.serial;
78
+ if (!serial)
79
+ throw new Error('serial parameter is required');
80
+ const data = await merakiGet(`/devices/${encodeURIComponent(serial)}/lldpCdp`, config, credentials, fetchFn);
81
+ const ports = data.ports ?? {};
82
+ const neighbors = Object.entries(ports).map(([portId, info]) => ({
83
+ portId,
84
+ cdp: info.cdp ?? null,
85
+ lldp: info.lldp ?? null,
86
+ }));
87
+ return { neighbors, count: neighbors.length };
88
+ };
89
+ const deviceClients = async (params, config, credentials, fetchFn) => {
90
+ const serial = params?.serial;
91
+ if (!serial)
92
+ throw new Error('serial parameter is required');
93
+ const queryParams = {};
94
+ const timespan = params?.timespan;
95
+ if (timespan)
96
+ queryParams.timespan = String(timespan);
97
+ const clients = await merakiGet(`/devices/${encodeURIComponent(serial)}/clients`, config, credentials, fetchFn, queryParams);
98
+ return {
99
+ clients: clients.map((c) => ({
100
+ mac: c.mac ?? null,
101
+ ip: c.ip ?? null,
102
+ description: c.description ?? null,
103
+ vlan: c.vlan ?? null,
104
+ switchport: c.switchport ?? null,
105
+ usage: c.usage ?? null,
106
+ })),
107
+ count: clients.length,
108
+ };
109
+ };
110
+ const networksList = async (params, config, credentials, fetchFn) => {
111
+ const orgId = params?.orgId || credentials.credentials.orgId;
112
+ if (!orgId)
113
+ throw new Error('orgId parameter is required');
114
+ const networks = await merakiGet(`/organizations/${encodeURIComponent(orgId)}/networks`, config, credentials, fetchFn);
115
+ return {
116
+ networks: networks.map((n) => ({
117
+ id: n.id ?? null,
118
+ name: n.name ?? null,
119
+ productTypes: n.productTypes ?? [],
120
+ timeZone: n.timeZone ?? null,
121
+ tags: n.tags ?? [],
122
+ })),
123
+ count: networks.length,
124
+ };
125
+ };
126
+ // --- Pack definition ---
127
+ export const merakiPack = {
128
+ manifest: {
129
+ name: 'meraki',
130
+ type: 'integration',
131
+ version: '0.1.0',
132
+ description: 'Cisco Meraki — device fleet status, switch ports, and network topology',
133
+ requires: { groups: [], files: [], commands: [] },
134
+ probes: [
135
+ {
136
+ name: 'organizations.list',
137
+ description: 'List organizations accessible by the API key',
138
+ capability: 'observe',
139
+ params: {},
140
+ timeout: 15000,
141
+ },
142
+ {
143
+ name: 'devices.statuses',
144
+ description: 'List device statuses across an organization',
145
+ capability: 'observe',
146
+ params: {
147
+ orgId: {
148
+ type: 'string',
149
+ description: 'Meraki organization ID (falls back to credential orgId)',
150
+ required: false,
151
+ },
152
+ },
153
+ timeout: 15000,
154
+ },
155
+ {
156
+ name: 'switch.port-statuses',
157
+ description: 'Get port statuses for a switch including speed, duplex, and neighbors',
158
+ capability: 'observe',
159
+ params: {
160
+ serial: {
161
+ type: 'string',
162
+ description: 'Device serial number',
163
+ required: true,
164
+ },
165
+ },
166
+ timeout: 15000,
167
+ },
168
+ {
169
+ name: 'device.lldp-cdp',
170
+ description: 'Get LLDP and CDP neighbor information for a device',
171
+ capability: 'observe',
172
+ params: {
173
+ serial: {
174
+ type: 'string',
175
+ description: 'Device serial number',
176
+ required: true,
177
+ },
178
+ },
179
+ timeout: 15000,
180
+ },
181
+ {
182
+ name: 'device.clients',
183
+ description: 'List clients connected to a device',
184
+ capability: 'observe',
185
+ params: {
186
+ serial: {
187
+ type: 'string',
188
+ description: 'Device serial number',
189
+ required: true,
190
+ },
191
+ timespan: {
192
+ type: 'number',
193
+ description: 'Lookback period in seconds (default: 86400)',
194
+ required: false,
195
+ },
196
+ },
197
+ timeout: 15000,
198
+ },
199
+ {
200
+ name: 'networks.list',
201
+ description: 'List networks in an organization',
202
+ capability: 'observe',
203
+ params: {
204
+ orgId: {
205
+ type: 'string',
206
+ description: 'Meraki organization ID (falls back to credential orgId)',
207
+ required: false,
208
+ },
209
+ },
210
+ timeout: 15000,
211
+ },
212
+ ],
213
+ runbook: {
214
+ category: 'network',
215
+ probes: ['organizations.list', 'devices.statuses'],
216
+ parallel: true,
217
+ },
218
+ },
219
+ handlers: {
220
+ 'organizations.list': organizationsList,
221
+ 'devices.statuses': devicesStatuses,
222
+ 'switch.port-statuses': switchPortStatuses,
223
+ 'device.lldp-cdp': deviceLldpCdp,
224
+ 'device.clients': deviceClients,
225
+ 'networks.list': networksList,
226
+ },
227
+ testConnection: async (config, credentials, fetchFn) => {
228
+ const url = `${config.endpoint.replace(/\/$/, '')}/api/v1/organizations`;
229
+ const headers = {
230
+ Accept: 'application/json',
231
+ ...buildAuthHeaders(credentials),
232
+ ...config.headers,
233
+ };
234
+ const res = await fetchFn(url, { headers });
235
+ return res.ok;
236
+ },
237
+ };
238
+ //# sourceMappingURL=meraki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meraki.js","sourceRoot":"","sources":["../../src/integrations/meraki.ts"],"names":[],"mappings":"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"}