@tikoci/centrs 0.1.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/CHANGELOG.md +207 -0
- package/GLOSSARY.txt +420 -0
- package/README.md +196 -0
- package/SECURITY.md +30 -0
- package/commands/AGENTS.md +50 -0
- package/commands/btest/README.md +257 -0
- package/commands/btest/examples.md +190 -0
- package/commands/check/README.md +59 -0
- package/commands/devices/README.md +405 -0
- package/commands/devices/examples.md +488 -0
- package/commands/discover/README.md +170 -0
- package/commands/discover/examples.md +98 -0
- package/commands/execute/README.md +208 -0
- package/commands/execute/examples.md +353 -0
- package/commands/mcp/README.md +260 -0
- package/commands/mcp/examples.md +158 -0
- package/commands/retrieve/README.md +209 -0
- package/commands/retrieve/examples.md +306 -0
- package/commands/settings/README.md +69 -0
- package/commands/stream/README.md +70 -0
- package/commands/terminal/README.md +177 -0
- package/commands/terminal/examples.md +144 -0
- package/commands/transfer/README.md +315 -0
- package/commands/transfer/examples.md +368 -0
- package/docs/CONSTITUTION.md +417 -0
- package/docs/MATRIX.md +224 -0
- package/docs/errors/README.md +74 -0
- package/docs/errors/auth/failed.md +9 -0
- package/docs/errors/cdb/already-exists.md +9 -0
- package/docs/errors/cdb/created.md +9 -0
- package/docs/errors/cdb/decrypt-failed.md +9 -0
- package/docs/errors/cdb/empty-group.md +9 -0
- package/docs/errors/cdb/invalid-option.md +9 -0
- package/docs/errors/cdb/invalid-record.md +9 -0
- package/docs/errors/cdb/not-found-target.md +9 -0
- package/docs/errors/cdb/not-found.md +9 -0
- package/docs/errors/cdb/override-applied.md +9 -0
- package/docs/errors/cdb/parse-failed.md +9 -0
- package/docs/errors/cdb/password-not-needed.md +9 -0
- package/docs/errors/cdb/password-required.md +9 -0
- package/docs/errors/cdb/reserved-key.md +9 -0
- package/docs/errors/cdb/reserved-option.md +9 -0
- package/docs/errors/cdb/target-not-registered.md +9 -0
- package/docs/errors/cdb/unknown-field.md +9 -0
- package/docs/errors/cdb/unknown-option.md +9 -0
- package/docs/errors/cdb/write-not-permitted.md +9 -0
- package/docs/errors/discover/broadcast-unavailable.md +9 -0
- package/docs/errors/discover/failed.md +9 -0
- package/docs/errors/identity/ambiguous.md +9 -0
- package/docs/errors/identity/no-match.md +9 -0
- package/docs/errors/input/invalid-command.md +9 -0
- package/docs/errors/input/invalid-match.md +9 -0
- package/docs/errors/input/invalid-path.md +9 -0
- package/docs/errors/input/invalid-routeros-path.md +9 -0
- package/docs/errors/input/invalid-target.md +9 -0
- package/docs/errors/input/local-file-not-found.md +9 -0
- package/docs/errors/input/mac-address.md +9 -0
- package/docs/errors/input/max-results-exceeded.md +9 -0
- package/docs/errors/internal/devices-failed.md +9 -0
- package/docs/errors/internal/mcp-start.md +9 -0
- package/docs/errors/internal/mcp-tool.md +9 -0
- package/docs/errors/internal/native-api-length.md +9 -0
- package/docs/errors/internal/unhandled.md +9 -0
- package/docs/errors/internal/unreachable.md +9 -0
- package/docs/errors/mndp/encode-failed.md +9 -0
- package/docs/errors/mndp/listen-failed.md +9 -0
- package/docs/errors/mndp/malformed.md +9 -0
- package/docs/errors/routeros/api-fatal.md +9 -0
- package/docs/errors/routeros/api-protocol.md +9 -0
- package/docs/errors/routeros/api-trap.md +9 -0
- package/docs/errors/routeros/btest-protocol.md +12 -0
- package/docs/errors/routeros/btest-too-many-sessions.md +9 -0
- package/docs/errors/routeros/command-failed.md +14 -0
- package/docs/errors/routeros/ec-srp5-protocol.md +11 -0
- package/docs/errors/routeros/error.md +9 -0
- package/docs/errors/routeros/invalid-value.md +14 -0
- package/docs/errors/routeros/mac-telnet-error.md +9 -0
- package/docs/errors/routeros/mac-telnet-not-ready.md +9 -0
- package/docs/errors/routeros/mac-telnet-protocol.md +9 -0
- package/docs/errors/routeros/mac-telnet-unsupported-auth.md +9 -0
- package/docs/errors/routeros/protocol-not-implemented.md +9 -0
- package/docs/errors/routeros/request-failed.md +9 -0
- package/docs/errors/routeros/session-closed.md +13 -0
- package/docs/errors/routeros/unknown-attribute.md +13 -0
- package/docs/errors/routeros/unknown-path.md +15 -0
- package/docs/errors/routeros/unsupported-capability.md +9 -0
- package/docs/errors/settings/invalid-boolean.md +9 -0
- package/docs/errors/settings/invalid-format.md +9 -0
- package/docs/errors/settings/invalid-integer.md +9 -0
- package/docs/errors/settings/invalid-timeout.md +9 -0
- package/docs/errors/settings/invalid-via.md +9 -0
- package/docs/errors/settings/unsafe-protocol-blocked.md +9 -0
- package/docs/errors/target/mac-not-in-arp.md +14 -0
- package/docs/errors/target/mac-required.md +23 -0
- package/docs/errors/target/mac-unresolved.md +17 -0
- package/docs/errors/target/unresolved.md +9 -0
- package/docs/errors/transport/auth-failed.md +9 -0
- package/docs/errors/transport/auto-method.md +9 -0
- package/docs/errors/transport/capability-unsupported.md +22 -0
- package/docs/errors/transport/checksum-unavailable.md +9 -0
- package/docs/errors/transport/connection-closed.md +9 -0
- package/docs/errors/transport/connection-refused.md +9 -0
- package/docs/errors/transport/dns.md +9 -0
- package/docs/errors/transport/host-key-mismatch.md +9 -0
- package/docs/errors/transport/incomplete-transfer.md +9 -0
- package/docs/errors/transport/insecure-trust.md +9 -0
- package/docs/errors/transport/local-tool-missing.md +11 -0
- package/docs/errors/transport/network.md +9 -0
- package/docs/errors/transport/timeout.md +9 -0
- package/docs/errors/transport/tls-certificate.md +9 -0
- package/docs/errors/transport/unreachable.md +9 -0
- package/docs/errors/transport/unsupported-operation.md +9 -0
- package/docs/errors/usage/confirmation-required.md +9 -0
- package/docs/errors/usage/conflicting-flags.md +9 -0
- package/docs/errors/usage/invalid-concurrency.md +9 -0
- package/docs/errors/usage/missing-group.md +9 -0
- package/docs/errors/usage/not-implemented.md +9 -0
- package/docs/errors/usage/target-exists.md +9 -0
- package/docs/errors/usage/timeout-out-of-range.md +9 -0
- package/docs/errors/validation/not-implemented.md +9 -0
- package/docs/errors/validation/option.md +9 -0
- package/docs/errors/validation/syntax.md +9 -0
- package/docs/errors/validation/unknown-attribute.md +9 -0
- package/docs/errors/validation/unknown-path.md +9 -0
- package/package.json +96 -0
- package/src/AGENTS.md +7 -0
- package/src/btest.ts +906 -0
- package/src/cli/btest.ts +455 -0
- package/src/cli/common.ts +53 -0
- package/src/cli/devices.ts +527 -0
- package/src/cli/discover.ts +186 -0
- package/src/cli/execute.ts +333 -0
- package/src/cli/mcp.ts +109 -0
- package/src/cli/retrieve.ts +383 -0
- package/src/cli/terminal.ts +303 -0
- package/src/cli/transfer.ts +471 -0
- package/src/cli.ts +115 -0
- package/src/core/envelope.ts +221 -0
- package/src/core/error-catalog.ts +469 -0
- package/src/core/routeros-errors.ts +268 -0
- package/src/data/AGENTS.md +11 -0
- package/src/data/dude-db.ts +0 -0
- package/src/data/mndp-cache.ts +132 -0
- package/src/data/mndp.ts +405 -0
- package/src/data/winbox-cdb-write.ts +200 -0
- package/src/data/winbox-cdb.ts +913 -0
- package/src/devices-schema.ts +107 -0
- package/src/devices.ts +1717 -0
- package/src/discover.ts +802 -0
- package/src/errors.ts +189 -0
- package/src/execute.ts +1350 -0
- package/src/index.ts +353 -0
- package/src/mcp/config.ts +66 -0
- package/src/mcp/resources.ts +98 -0
- package/src/mcp/safety.ts +119 -0
- package/src/mcp/server.ts +225 -0
- package/src/mcp/tools.ts +657 -0
- package/src/mcp.ts +33 -0
- package/src/protocols/AGENTS.md +14 -0
- package/src/protocols/adapter.ts +866 -0
- package/src/protocols/btest-session.ts +1493 -0
- package/src/protocols/btest.ts +447 -0
- package/src/protocols/ec-srp5.ts +466 -0
- package/src/protocols/index.ts +118 -0
- package/src/protocols/mac-telnet-console.ts +655 -0
- package/src/protocols/mac-telnet.ts +1299 -0
- package/src/protocols/mtwei.ts +47 -0
- package/src/protocols/native-api.ts +796 -0
- package/src/protocols/sftp.ts +427 -0
- package/src/protocols/ssh.ts +297 -0
- package/src/resolver/cdb.ts +580 -0
- package/src/resolver/comment-kv.ts +360 -0
- package/src/resolver/index.ts +74 -0
- package/src/resolver/mac.ts +227 -0
- package/src/resolver/settings.ts +228 -0
- package/src/resolver/target.ts +442 -0
- package/src/retrieve-fanout.ts +533 -0
- package/src/retrieve.ts +1215 -0
- package/src/terminal.ts +444 -0
- package/src/transfer.ts +1554 -0
- package/src/tui.ts +22 -0
- package/src/webproxy.ts +16 -0
package/src/errors.ts
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base URL for the human-readable error pages. Every `CentrsError.detailsUrl`
|
|
3
|
+
* is this prefix plus the slash-namespaced code. Exported so the error catalog
|
|
4
|
+
* and MCP resources share one definition (see `src/core/error-catalog.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export const ERROR_DETAILS_BASE_URL = "https://tikoci.github.io/centrs/errors/";
|
|
7
|
+
|
|
8
|
+
export type CentrsErrorCode =
|
|
9
|
+
| `auth/${string}`
|
|
10
|
+
| `cdb/${string}`
|
|
11
|
+
| `discover/${string}`
|
|
12
|
+
| `identity/${string}`
|
|
13
|
+
| `input/${string}`
|
|
14
|
+
| `internal/${string}`
|
|
15
|
+
| `mndp/${string}`
|
|
16
|
+
| `routeros/${string}`
|
|
17
|
+
| `settings/${string}`
|
|
18
|
+
| `target/${string}`
|
|
19
|
+
| `tool/${string}`
|
|
20
|
+
| `transport/${string}`
|
|
21
|
+
| `usage/${string}`
|
|
22
|
+
| `validation/${string}`;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A RouterOS-reported source location for a parse/syntax fault. RouterOS prints
|
|
26
|
+
* `(line N column M)` on a console `:parse` rejection; `column` is RouterOS's
|
|
27
|
+
* **authoritative 1-based BYTE offset**, not a JS character index — the RouterOS
|
|
28
|
+
* console is not Unicode-aware, so a multibyte command can make the byte column
|
|
29
|
+
* differ from a code-point index. Carried verbatim; never re-derived.
|
|
30
|
+
*/
|
|
31
|
+
export interface RouterOsErrorPosition {
|
|
32
|
+
line: number;
|
|
33
|
+
column: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface CentrsErrorInit {
|
|
37
|
+
code: CentrsErrorCode;
|
|
38
|
+
summary: string;
|
|
39
|
+
remediation?: string;
|
|
40
|
+
context?: Record<string, unknown>;
|
|
41
|
+
/** RouterOS-reported byte offset of a parse fault, when one is available. */
|
|
42
|
+
position?: RouterOsErrorPosition;
|
|
43
|
+
cause?: unknown;
|
|
44
|
+
causeData?: unknown;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface SerializedCentrsError {
|
|
48
|
+
name: "CentrsError";
|
|
49
|
+
code: CentrsErrorCode;
|
|
50
|
+
summary: string;
|
|
51
|
+
message: string;
|
|
52
|
+
remediation?: string;
|
|
53
|
+
detailsUrl: string;
|
|
54
|
+
details_url: string;
|
|
55
|
+
context?: Record<string, unknown>;
|
|
56
|
+
position?: RouterOsErrorPosition;
|
|
57
|
+
cause?: unknown;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class CentrsError extends Error {
|
|
61
|
+
readonly code: CentrsErrorCode;
|
|
62
|
+
readonly summary: string;
|
|
63
|
+
readonly remediation?: string;
|
|
64
|
+
readonly detailsUrl: string;
|
|
65
|
+
readonly context?: Record<string, unknown>;
|
|
66
|
+
readonly position?: RouterOsErrorPosition;
|
|
67
|
+
readonly causeData?: unknown;
|
|
68
|
+
|
|
69
|
+
constructor(init: CentrsErrorInit) {
|
|
70
|
+
super(init.summary, init.cause ? { cause: init.cause } : undefined);
|
|
71
|
+
this.name = "CentrsError";
|
|
72
|
+
this.code = init.code;
|
|
73
|
+
this.summary = init.summary;
|
|
74
|
+
this.remediation = init.remediation;
|
|
75
|
+
this.detailsUrl = `${ERROR_DETAILS_BASE_URL}${init.code}`;
|
|
76
|
+
this.context = init.context;
|
|
77
|
+
this.position = init.position;
|
|
78
|
+
this.causeData = init.causeData;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
toJSON(): SerializedCentrsError {
|
|
82
|
+
return serializeCentrsError(this);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function serializeCentrsError(
|
|
87
|
+
error: CentrsError | SerializedCentrsError,
|
|
88
|
+
): SerializedCentrsError {
|
|
89
|
+
if (error instanceof CentrsError) {
|
|
90
|
+
return {
|
|
91
|
+
name: "CentrsError",
|
|
92
|
+
code: error.code,
|
|
93
|
+
summary: error.summary,
|
|
94
|
+
message: error.message,
|
|
95
|
+
remediation: error.remediation,
|
|
96
|
+
detailsUrl: error.detailsUrl,
|
|
97
|
+
details_url: error.detailsUrl,
|
|
98
|
+
context: error.context,
|
|
99
|
+
...(error.position ? { position: error.position } : {}),
|
|
100
|
+
cause: error.causeData ?? serializeUnknownError(error.cause),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return error;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function asCentrsError(
|
|
108
|
+
error: unknown,
|
|
109
|
+
fallback: Omit<CentrsErrorInit, "cause">,
|
|
110
|
+
): CentrsError {
|
|
111
|
+
if (error instanceof CentrsError) {
|
|
112
|
+
return error;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return new CentrsError({
|
|
116
|
+
...fallback,
|
|
117
|
+
cause: error,
|
|
118
|
+
causeData: serializeUnknownError(error),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function formatCentrsErrorText(
|
|
123
|
+
error: CentrsError | SerializedCentrsError,
|
|
124
|
+
options: { verbose?: boolean } = {},
|
|
125
|
+
): string {
|
|
126
|
+
const serialized = serializeCentrsError(error);
|
|
127
|
+
const lines = [`[${serialized.code}] ${serialized.summary}`];
|
|
128
|
+
|
|
129
|
+
if (serialized.position) {
|
|
130
|
+
// RouterOS's authoritative byte column (1-based); see RouterOsErrorPosition.
|
|
131
|
+
lines.push(
|
|
132
|
+
`At: line ${serialized.position.line}, column ${serialized.position.column} (RouterOS byte offset)`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (serialized.remediation) {
|
|
137
|
+
lines.push(`Fix: ${serialized.remediation}`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (serialized.detailsUrl) {
|
|
141
|
+
lines.push(`Details: ${serialized.detailsUrl}`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (options.verbose && serialized.context) {
|
|
145
|
+
lines.push("");
|
|
146
|
+
lines.push(JSON.stringify(serialized.context, null, 2));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return lines.join("\n");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function serializeUnknownError(error: unknown): unknown {
|
|
153
|
+
if (error instanceof CentrsError) {
|
|
154
|
+
return serializeCentrsError(error);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (error instanceof Error) {
|
|
158
|
+
return {
|
|
159
|
+
name: error.name,
|
|
160
|
+
message: error.message,
|
|
161
|
+
stack: error.stack,
|
|
162
|
+
code: extractErrorCode(error),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return error;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function extractErrorCode(error: unknown): string | undefined {
|
|
170
|
+
if (!error || typeof error !== "object") {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if ("code" in error && typeof error.code === "string") {
|
|
175
|
+
return error.code;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (
|
|
179
|
+
"cause" in error &&
|
|
180
|
+
error.cause &&
|
|
181
|
+
typeof error.cause === "object" &&
|
|
182
|
+
"code" in error.cause &&
|
|
183
|
+
typeof error.cause.code === "string"
|
|
184
|
+
) {
|
|
185
|
+
return error.cause.code;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|