proofscan 0.10.53 → 0.10.55

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 (53) hide show
  1. package/dist/shell/filter-mappers.d.ts +23 -0
  2. package/dist/shell/filter-mappers.d.ts.map +1 -0
  3. package/dist/shell/filter-mappers.js +36 -0
  4. package/dist/shell/filter-mappers.js.map +1 -0
  5. package/dist/shell/find-command.d.ts +54 -0
  6. package/dist/shell/find-command.d.ts.map +1 -0
  7. package/dist/shell/find-command.js +330 -0
  8. package/dist/shell/find-command.js.map +1 -0
  9. package/dist/shell/pager/index.d.ts +9 -0
  10. package/dist/shell/pager/index.d.ts.map +1 -0
  11. package/dist/shell/pager/index.js +8 -0
  12. package/dist/shell/pager/index.js.map +1 -0
  13. package/dist/shell/pager/less-pager.d.ts +31 -0
  14. package/dist/shell/pager/less-pager.d.ts.map +1 -0
  15. package/dist/shell/pager/less-pager.js +196 -0
  16. package/dist/shell/pager/less-pager.js.map +1 -0
  17. package/dist/shell/pager/more-pager.d.ts +31 -0
  18. package/dist/shell/pager/more-pager.d.ts.map +1 -0
  19. package/dist/shell/pager/more-pager.js +108 -0
  20. package/dist/shell/pager/more-pager.js.map +1 -0
  21. package/dist/shell/pager/renderer.d.ts +17 -0
  22. package/dist/shell/pager/renderer.d.ts.map +1 -0
  23. package/dist/shell/pager/renderer.js +125 -0
  24. package/dist/shell/pager/renderer.js.map +1 -0
  25. package/dist/shell/pager/types.d.ts +19 -0
  26. package/dist/shell/pager/types.d.ts.map +1 -0
  27. package/dist/shell/pager/types.js +7 -0
  28. package/dist/shell/pager/types.js.map +1 -0
  29. package/dist/shell/pager/utils.d.ts +28 -0
  30. package/dist/shell/pager/utils.d.ts.map +1 -0
  31. package/dist/shell/pager/utils.js +53 -0
  32. package/dist/shell/pager/utils.js.map +1 -0
  33. package/dist/shell/pipeline-types.d.ts +51 -0
  34. package/dist/shell/pipeline-types.d.ts.map +1 -0
  35. package/dist/shell/pipeline-types.js +8 -0
  36. package/dist/shell/pipeline-types.js.map +1 -0
  37. package/dist/shell/repl.d.ts +36 -0
  38. package/dist/shell/repl.d.ts.map +1 -1
  39. package/dist/shell/repl.js +408 -5
  40. package/dist/shell/repl.js.map +1 -1
  41. package/dist/shell/router-commands.d.ts +7 -0
  42. package/dist/shell/router-commands.d.ts.map +1 -1
  43. package/dist/shell/router-commands.js +121 -0
  44. package/dist/shell/router-commands.js.map +1 -1
  45. package/dist/shell/types.d.ts +14 -0
  46. package/dist/shell/types.d.ts.map +1 -1
  47. package/dist/shell/types.js +16 -1
  48. package/dist/shell/types.js.map +1 -1
  49. package/dist/shell/where-command.d.ts +31 -0
  50. package/dist/shell/where-command.d.ts.map +1 -0
  51. package/dist/shell/where-command.js +96 -0
  52. package/dist/shell/where-command.js.map +1 -0
  53. package/package.json +1 -1
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Where Command for psh Shell
3
+ *
4
+ * Filters pipeline rows using Filter DSL v0.1.
5
+ * Reuses parser and evaluator from src/filter/.
6
+ */
7
+ import { parseFilter } from '../filter/parser.js';
8
+ import { evaluateFilter } from '../filter/evaluator.js';
9
+ import { rpcRowToFilterContext, sessionRowToFilterContext } from './filter-mappers.js';
10
+ /** Fields that only apply to RPC rows */
11
+ const RPC_ONLY_FIELDS = ['rpc.id', 'rpc.method', 'rpc.status', 'rpc.latency', 'tools.name', 'tools.method'];
12
+ /** Fields that only apply to Session rows */
13
+ const SESSION_ONLY_FIELDS = ['session.latency'];
14
+ /**
15
+ * Check if filter uses fields incompatible with the row type
16
+ * Returns warning message if incompatible, null if OK
17
+ */
18
+ function checkFieldCompatibility(ast, rowType) {
19
+ const usedFields = ast.conditions.map(c => c.field);
20
+ if (rowType === 'session') {
21
+ const rpcFields = usedFields.filter(f => RPC_ONLY_FIELDS.includes(f));
22
+ if (rpcFields.length > 0) {
23
+ return `Field '${rpcFields[0]}' is only available at session level (cd into a session first)`;
24
+ }
25
+ }
26
+ if (rowType === 'rpc') {
27
+ const sessionFields = usedFields.filter(f => SESSION_ONLY_FIELDS.includes(f));
28
+ if (sessionFields.length > 0) {
29
+ return `Field '${sessionFields[0]}' is only available at connector level`;
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ /**
35
+ * Normalize filter expression (strip "filter:" prefix for copy/paste compatibility)
36
+ */
37
+ function normalizeExpr(expr) {
38
+ let trimmed = expr.trim();
39
+ if (trimmed.toLowerCase().startsWith('filter:')) {
40
+ trimmed = trimmed.slice(7).trim();
41
+ }
42
+ return trimmed;
43
+ }
44
+ /**
45
+ * Apply where filter to pipeline input
46
+ *
47
+ * @param input - Pipeline value (rows or text)
48
+ * @param expr - Filter expression (e.g., 'rpc.method == "tools/call"')
49
+ * @returns Filtered result or error
50
+ */
51
+ export function applyWhere(input, expr) {
52
+ const normalized = normalizeExpr(expr);
53
+ // Empty expression → pass all through
54
+ if (!normalized) {
55
+ const total = input.kind === 'rows' ? input.rows.length : 0;
56
+ return { ok: true, result: input, stats: { matched: total, total } };
57
+ }
58
+ // Parse the filter expression
59
+ const parseResult = parseFilter(normalized);
60
+ if (!parseResult.ok) {
61
+ return { ok: false, error: parseResult.error, position: parseResult.position };
62
+ }
63
+ // Text input not supported
64
+ if (input.kind === 'text') {
65
+ return { ok: false, error: 'where expects rows; got text. Try `ls` first.' };
66
+ }
67
+ const { rows, rowType } = input;
68
+ // Check for field/rowType compatibility
69
+ const compatError = checkFieldCompatibility(parseResult.ast, rowType);
70
+ if (compatError) {
71
+ return { ok: false, error: compatError };
72
+ }
73
+ // Get appropriate mapper for row type
74
+ const mapper = rowType === 'rpc'
75
+ ? rpcRowToFilterContext
76
+ : rowType === 'session'
77
+ ? sessionRowToFilterContext
78
+ : null;
79
+ if (!mapper) {
80
+ return { ok: false, error: `Unsupported row type: ${rowType}` };
81
+ }
82
+ // Filter rows with proper type handling
83
+ const filtered = rows.filter((row) => {
84
+ // Use conditional mapper call instead of intersection type cast
85
+ const ctx = rowType === 'rpc'
86
+ ? rpcRowToFilterContext(row)
87
+ : sessionRowToFilterContext(row);
88
+ return evaluateFilter(parseResult.ast, ctx);
89
+ });
90
+ return {
91
+ ok: true,
92
+ result: { kind: 'rows', rows: filtered, rowType },
93
+ stats: { matched: filtered.length, total: rows.length },
94
+ };
95
+ }
96
+ //# sourceMappingURL=where-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where-command.js","sourceRoot":"","sources":["../../src/shell/where-command.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "proofscan",
3
- "version": "0.10.53",
3
+ "version": "0.10.55",
4
4
  "description": "MCP Server scanner - eliminate black boxes by capturing JSON-RPC from connection to tools/list",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",