@tikoci/centrs 0.1.4 → 0.1.7

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 (85) hide show
  1. package/CHANGELOG.md +417 -1
  2. package/GLOSSARY.txt +40 -1
  3. package/README.md +16 -8
  4. package/commands/AGENTS.md +7 -4
  5. package/commands/api/AGENTS.md +13 -1
  6. package/commands/api/README.md +50 -10
  7. package/commands/api/examples.md +100 -2
  8. package/commands/devices/README.md +10 -1
  9. package/commands/devices/examples.md +33 -2
  10. package/commands/execute/README.md +68 -25
  11. package/commands/execute/examples.md +168 -7
  12. package/commands/explain/README.md +1206 -155
  13. package/commands/explain/examples.md +99 -3
  14. package/commands/mcp/README.md +9 -5
  15. package/commands/mcp/examples.md +2 -2
  16. package/commands/retrieve/examples.md +20 -0
  17. package/commands/terminal/examples.md +7 -1
  18. package/docs/CLI.md +3 -3
  19. package/docs/CONSTITUTION.md +83 -21
  20. package/docs/MATRIX.md +89 -52
  21. package/docs/errors/cdb/create-failed.md +20 -0
  22. package/docs/errors/cdb/file-exists.md +23 -0
  23. package/docs/errors/input/invalid-target.md +25 -3
  24. package/docs/errors/routeros/invalid-value.md +3 -2
  25. package/docs/errors/transport/cancel-unacknowledged.md +24 -0
  26. package/docs/errors/validation/syntax.md +29 -4
  27. package/package.json +13 -2
  28. package/src/api-fanout.ts +17 -4
  29. package/src/api.ts +346 -75
  30. package/src/cli/api.ts +1 -1
  31. package/src/cli/btest.ts +1 -1
  32. package/src/cli/devices.ts +16 -3
  33. package/src/cli/explain.ts +1 -1
  34. package/src/cli/terminal.ts +1 -1
  35. package/src/core/envelope.ts +53 -0
  36. package/src/core/error-catalog.ts +16 -1
  37. package/src/core/execute-command.ts +455 -0
  38. package/src/core/inspect.ts +58 -26
  39. package/src/core/routeros-errors.ts +66 -0
  40. package/src/core/version.ts +4 -0
  41. package/src/core/yaml.ts +86 -0
  42. package/src/data/winbox-cdb-write.ts +22 -8
  43. package/src/devices.ts +142 -28
  44. package/src/execute-fanout.ts +19 -5
  45. package/src/execute.ts +247 -295
  46. package/src/explain/arg-tokens.ts +62 -25
  47. package/src/explain/args.ts +398 -52
  48. package/src/explain/blocks.ts +54 -11
  49. package/src/explain/brace-tokens.ts +4 -3
  50. package/src/explain/catalog.ts +42 -44
  51. package/src/explain/coordinates.ts +159 -0
  52. package/src/explain/defects.ts +2 -1
  53. package/src/explain/escape-tokens.ts +77 -0
  54. package/src/explain/highlight-projection.ts +308 -0
  55. package/src/explain/menus.ts +9 -5
  56. package/src/explain/operator-tokens.ts +13 -7
  57. package/src/explain/operators.ts +27 -20
  58. package/src/explain/path-tokens.ts +1 -1
  59. package/src/explain/pathresolve.ts +358 -113
  60. package/src/explain/quoted-string.ts +110 -20
  61. package/src/explain/scope-brace.ts +175 -22
  62. package/src/explain/segment.ts +429 -21
  63. package/src/explain/separator.ts +187 -0
  64. package/src/explain/split-owner.ts +194 -0
  65. package/src/explain/string-tokens.ts +14 -4
  66. package/src/explain/symbol-values.ts +209 -173
  67. package/src/explain/symbols.ts +21 -1
  68. package/src/explain/transport.ts +17 -0
  69. package/src/explain/value-tokens.ts +15 -12
  70. package/src/explain/verbsplit.ts +165 -23
  71. package/src/explain/write.ts +47 -6
  72. package/src/explain.ts +522 -72
  73. package/src/index.ts +21 -2
  74. package/src/mcp/server.ts +2 -1
  75. package/src/mcp/tools.ts +1 -1
  76. package/src/offline-gate.ts +148 -0
  77. package/src/protocols/adapter.ts +12 -1
  78. package/src/protocols/mac-telnet-console.ts +6 -4
  79. package/src/protocols/native-api.ts +29 -3
  80. package/src/resolver/target.ts +32 -12
  81. package/src/retrieve-fanout.ts +1 -1
  82. package/src/retrieve.ts +18 -63
  83. package/src/settings.ts +2 -1
  84. package/src/transfer-fanout.ts +1 -1
  85. package/src/transfer.ts +1 -1
@@ -15,7 +15,7 @@
15
15
  * - A `--default` / `__default__` member is guarded from being dialed as the
16
16
  * literal hostname `"__default__"` — it fails that one target deterministically
17
17
  * with `target/unresolved`.
18
- * - A **write-shaped** command (add/set/remove) is confirmed ONCE up front
18
+ * - A **write-shaped** command is confirmed ONCE up front
19
19
  * (`--yes`), never per target; without `--yes` the error names the blast radius
20
20
  * (how many routers). Write-ness is target-independent (`canonicalizeExecuteCommand`).
21
21
  */
@@ -26,6 +26,7 @@ import type {
26
26
  CommonSettingsMeta,
27
27
  FanoutData,
28
28
  FanoutSummary,
29
+ ValidationTrace,
29
30
  } from "./core/envelope.ts";
30
31
  import {
31
32
  buildFanoutEnvelope,
@@ -36,6 +37,7 @@ import {
36
37
  runFanout,
37
38
  summarizeFanout,
38
39
  } from "./core/fanout.ts";
40
+ import { toYaml } from "./core/yaml.ts";
39
41
  import { CentrsError, serializeCentrsError } from "./errors.ts";
40
42
  import {
41
43
  buildExecuteErrorEnvelopeFromResolved,
@@ -60,7 +62,6 @@ import {
60
62
  type SelectionResolveInput,
61
63
  type TargetSelection,
62
64
  } from "./resolver/index.ts";
63
- import { toYaml } from "./retrieve.ts";
64
65
 
65
66
  /** Compact description of the selector that produced the fan-out. */
66
67
  export interface ExecuteSelectionSummary {
@@ -233,6 +234,11 @@ export async function executeFanout(
233
234
  await assertFanoutWriteConfirmed(request, global.summary, expansion);
234
235
 
235
236
  const execute = internals.execute ?? runResolvedExecute;
237
+ // Per-target validation trace. `execute` and `onExecuteError` are separate
238
+ // callbacks that share only the resolved request, so the request object is
239
+ // the key: without it a per-target error envelope would reconstruct
240
+ // `meta.validation` instead of reporting the gate that actually ran (GH#354).
241
+ const traces = new WeakMap<ResolvedExecuteRequest, ValidationTrace>();
236
242
  const sleep = internals.sleep ?? defaultFanoutSleep;
237
243
 
238
244
  const targets = await runFanout<
@@ -282,11 +288,19 @@ export async function executeFanout(
282
288
  warnings: member.kind === "cdb" ? [...member.resolution.warnings] : [],
283
289
  summary: "Failed to resolve a fanout target.",
284
290
  }),
285
- execute: async (resolved, member) =>
286
- relabelAdhocMember(await execute(resolved), member),
291
+ execute: async (resolved, member) => {
292
+ const trace: ValidationTrace = {};
293
+ traces.set(resolved, trace);
294
+ return relabelAdhocMember(await execute(resolved, trace), member);
295
+ },
287
296
  onExecuteError: (resolved, member, error) =>
288
297
  relabelAdhocMember(
289
- buildExecuteErrorEnvelopeFromResolved(resolved, error),
298
+ buildExecuteErrorEnvelopeFromResolved(
299
+ resolved,
300
+ error,
301
+ undefined,
302
+ traces.get(resolved),
303
+ ),
290
304
  member,
291
305
  ),
292
306
  sleep,