proofscan 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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +38 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/config.d.ts +6 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +81 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/connectors.d.ts +6 -0
  12. package/dist/commands/connectors.d.ts.map +1 -0
  13. package/dist/commands/connectors.js +205 -0
  14. package/dist/commands/connectors.js.map +1 -0
  15. package/dist/commands/index.d.ts +5 -0
  16. package/dist/commands/index.d.ts.map +1 -0
  17. package/dist/commands/index.js +5 -0
  18. package/dist/commands/index.js.map +1 -0
  19. package/dist/commands/monitor.d.ts +6 -0
  20. package/dist/commands/monitor.d.ts.map +1 -0
  21. package/dist/commands/monitor.js +76 -0
  22. package/dist/commands/monitor.js.map +1 -0
  23. package/dist/commands/scan.d.ts +6 -0
  24. package/dist/commands/scan.d.ts.map +1 -0
  25. package/dist/commands/scan.js +76 -0
  26. package/dist/commands/scan.js.map +1 -0
  27. package/dist/config/import.d.ts +19 -0
  28. package/dist/config/import.d.ts.map +1 -0
  29. package/dist/config/import.js +113 -0
  30. package/dist/config/import.js.map +1 -0
  31. package/dist/config/index.d.ts +4 -0
  32. package/dist/config/index.d.ts.map +1 -0
  33. package/dist/config/index.js +4 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/config/manager.d.ts +29 -0
  36. package/dist/config/manager.d.ts.map +1 -0
  37. package/dist/config/manager.js +112 -0
  38. package/dist/config/manager.js.map +1 -0
  39. package/dist/config/schema.d.ts +21 -0
  40. package/dist/config/schema.d.ts.map +1 -0
  41. package/dist/config/schema.js +124 -0
  42. package/dist/config/schema.js.map +1 -0
  43. package/dist/events/index.d.ts +2 -0
  44. package/dist/events/index.d.ts.map +1 -0
  45. package/dist/events/index.js +2 -0
  46. package/dist/events/index.js.map +1 -0
  47. package/dist/events/store.d.ts +25 -0
  48. package/dist/events/store.d.ts.map +1 -0
  49. package/dist/events/store.js +91 -0
  50. package/dist/events/store.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +11 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/scanner/index.d.ts +22 -0
  56. package/dist/scanner/index.d.ts.map +1 -0
  57. package/dist/scanner/index.js +179 -0
  58. package/dist/scanner/index.js.map +1 -0
  59. package/dist/transports/index.d.ts +2 -0
  60. package/dist/transports/index.d.ts.map +1 -0
  61. package/dist/transports/index.js +2 -0
  62. package/dist/transports/index.js.map +1 -0
  63. package/dist/transports/stdio.d.ts +50 -0
  64. package/dist/transports/stdio.d.ts.map +1 -0
  65. package/dist/transports/stdio.js +140 -0
  66. package/dist/transports/stdio.js.map +1 -0
  67. package/dist/types/config.d.ts +38 -0
  68. package/dist/types/config.d.ts.map +1 -0
  69. package/dist/types/config.js +8 -0
  70. package/dist/types/config.js.map +1 -0
  71. package/dist/types/events.d.ts +23 -0
  72. package/dist/types/events.d.ts.map +1 -0
  73. package/dist/types/events.js +10 -0
  74. package/dist/types/events.js.map +1 -0
  75. package/dist/types/index.d.ts +3 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/index.js +3 -0
  78. package/dist/types/index.js.map +1 -0
  79. package/dist/utils/config-path.d.ts +15 -0
  80. package/dist/utils/config-path.d.ts.map +1 -0
  81. package/dist/utils/config-path.js +44 -0
  82. package/dist/utils/config-path.js.map +1 -0
  83. package/dist/utils/fs.d.ts +25 -0
  84. package/dist/utils/fs.d.ts.map +1 -0
  85. package/dist/utils/fs.js +80 -0
  86. package/dist/utils/fs.js.map +1 -0
  87. package/dist/utils/index.d.ts +4 -0
  88. package/dist/utils/index.d.ts.map +1 -0
  89. package/dist/utils/index.js +4 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/output.d.ts +22 -0
  92. package/dist/utils/output.d.ts.map +1 -0
  93. package/dist/utils/output.js +108 -0
  94. package/dist/utils/output.js.map +1 -0
  95. package/package.json +60 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Config schema validation
3
+ */
4
+ function validateStdioTransport(transport, path) {
5
+ const errors = [];
6
+ if (typeof transport.command !== 'string' || !transport.command.trim()) {
7
+ errors.push({ path: `${path}.command`, message: 'command must be a non-empty string' });
8
+ }
9
+ if (transport.args !== undefined && !Array.isArray(transport.args)) {
10
+ errors.push({ path: `${path}.args`, message: 'args must be an array' });
11
+ }
12
+ else if (transport.args) {
13
+ transport.args.forEach((arg, i) => {
14
+ if (typeof arg !== 'string') {
15
+ errors.push({ path: `${path}.args[${i}]`, message: 'each arg must be a string' });
16
+ }
17
+ });
18
+ }
19
+ if (transport.env !== undefined && (typeof transport.env !== 'object' || transport.env === null)) {
20
+ errors.push({ path: `${path}.env`, message: 'env must be an object' });
21
+ }
22
+ if (transport.cwd !== undefined && typeof transport.cwd !== 'string') {
23
+ errors.push({ path: `${path}.cwd`, message: 'cwd must be a string' });
24
+ }
25
+ return errors;
26
+ }
27
+ function validateTransport(transport, path) {
28
+ const errors = [];
29
+ if (!transport || typeof transport !== 'object') {
30
+ errors.push({ path, message: 'transport must be an object' });
31
+ return errors;
32
+ }
33
+ if (!('type' in transport)) {
34
+ errors.push({ path: `${path}.type`, message: 'transport.type is required' });
35
+ return errors;
36
+ }
37
+ switch (transport.type) {
38
+ case 'stdio':
39
+ errors.push(...validateStdioTransport(transport, path));
40
+ break;
41
+ case 'rpc-http':
42
+ case 'rpc-sse':
43
+ // Reserved for future implementation
44
+ if (!('url' in transport) || typeof transport.url !== 'string') {
45
+ errors.push({ path: `${path}.url`, message: 'url is required for HTTP/SSE transport' });
46
+ }
47
+ break;
48
+ default:
49
+ errors.push({ path: `${path}.type`, message: `unknown transport type: ${transport.type}` });
50
+ }
51
+ return errors;
52
+ }
53
+ function validateConnector(connector, path) {
54
+ const errors = [];
55
+ if (!connector || typeof connector !== 'object') {
56
+ errors.push({ path, message: 'connector must be an object' });
57
+ return errors;
58
+ }
59
+ if (typeof connector.id !== 'string' || !connector.id.trim()) {
60
+ errors.push({ path: `${path}.id`, message: 'id must be a non-empty string' });
61
+ }
62
+ else if (!/^[a-zA-Z0-9_-]+$/.test(connector.id)) {
63
+ errors.push({ path: `${path}.id`, message: 'id must contain only alphanumeric characters, hyphens, and underscores' });
64
+ }
65
+ if (typeof connector.enabled !== 'boolean') {
66
+ errors.push({ path: `${path}.enabled`, message: 'enabled must be a boolean' });
67
+ }
68
+ if (!connector.transport) {
69
+ errors.push({ path: `${path}.transport`, message: 'transport is required' });
70
+ }
71
+ else {
72
+ errors.push(...validateTransport(connector.transport, `${path}.transport`));
73
+ }
74
+ return errors;
75
+ }
76
+ export function validateConfig(config) {
77
+ const errors = [];
78
+ if (!config || typeof config !== 'object') {
79
+ return { valid: false, errors: [{ path: '', message: 'config must be an object' }] };
80
+ }
81
+ const cfg = config;
82
+ if (cfg.version !== 1) {
83
+ errors.push({ path: 'version', message: 'version must be 1' });
84
+ }
85
+ if (!Array.isArray(cfg.connectors)) {
86
+ errors.push({ path: 'connectors', message: 'connectors must be an array' });
87
+ }
88
+ else {
89
+ const connectors = cfg.connectors;
90
+ const ids = new Set();
91
+ connectors.forEach((connector, i) => {
92
+ errors.push(...validateConnector(connector, `connectors[${i}]`));
93
+ // Check for duplicate IDs
94
+ if (connector.id && ids.has(connector.id)) {
95
+ errors.push({ path: `connectors[${i}].id`, message: `duplicate connector id: ${connector.id}` });
96
+ }
97
+ if (connector.id) {
98
+ ids.add(connector.id);
99
+ }
100
+ });
101
+ }
102
+ return { valid: errors.length === 0, errors };
103
+ }
104
+ /**
105
+ * Parse and validate config JSON
106
+ */
107
+ export function parseConfig(jsonString) {
108
+ let parsed;
109
+ try {
110
+ parsed = JSON.parse(jsonString);
111
+ }
112
+ catch (e) {
113
+ return {
114
+ config: null,
115
+ errors: [{ path: '', message: `Invalid JSON: ${e instanceof Error ? e.message : 'parse error'}` }],
116
+ };
117
+ }
118
+ const result = validateConfig(parsed);
119
+ if (!result.valid) {
120
+ return { config: null, errors: result.errors };
121
+ }
122
+ return { config: parsed, errors: [] };
123
+ }
124
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,SAAS,sBAAsB,CAAC,SAAyB,EAAE,IAAY;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,UAAU,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAoB,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,MAAM;QACR,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACZ,qCAAqC;YACrC,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,MAAM;QACR;YACE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,OAAO,EAAE,2BAA4B,SAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAoB,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,wEAAwE,EAAE,CAAC,CAAC;IACzH,CAAC;IAED,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,YAAY,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,GAAG,CAAC,UAAyB,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9B,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAEjE,0BAA0B;YAC1B,IAAI,SAAS,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,2BAA2B,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnG,CAAC;YACD,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;gBACjB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC;SACnG,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './store.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './store.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Event storage - JSONL file based
3
+ * Stores scan events in events/<connector_id>/<YYYYMMDD>.jsonl
4
+ */
5
+ import type { ScanEvent, EventDirection, EventKind } from '../types/index.js';
6
+ export declare class EventStore {
7
+ private eventsDir;
8
+ constructor(configDir?: string);
9
+ private getDateString;
10
+ private getEventFilePath;
11
+ saveEvent(event: Omit<ScanEvent, 'event_id' | 'ts'>): Promise<ScanEvent>;
12
+ createEvent(connectorId: string, direction: EventDirection, kind: EventKind, options?: {
13
+ method?: string;
14
+ rpc_id?: string | number;
15
+ ok?: boolean;
16
+ error?: {
17
+ code: number;
18
+ message: string;
19
+ };
20
+ raw?: string;
21
+ }): Promise<ScanEvent>;
22
+ getRecentEvents(connectorId: string, count?: number): Promise<ScanEvent[]>;
23
+ listConnectorDates(connectorId: string): Promise<string[]>;
24
+ }
25
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAK9E,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAKlB,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAcxE,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,SAAS,EACf,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;KACT,GACL,OAAO,CAAC,SAAS,CAAC;IASf,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmC9E,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAajE"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Event storage - JSONL file based
3
+ * Stores scan events in events/<connector_id>/<YYYYMMDD>.jsonl
4
+ */
5
+ import { join } from 'path';
6
+ import { promises as fs } from 'fs';
7
+ import { randomUUID } from 'crypto';
8
+ import { truncateRaw } from '../types/events.js';
9
+ import { appendLine, readLastLines } from '../utils/fs.js';
10
+ import { getEventsDir } from '../utils/config-path.js';
11
+ export class EventStore {
12
+ eventsDir;
13
+ constructor(configDir) {
14
+ this.eventsDir = getEventsDir(configDir);
15
+ }
16
+ getDateString() {
17
+ const now = new Date();
18
+ const year = now.getFullYear();
19
+ const month = String(now.getMonth() + 1).padStart(2, '0');
20
+ const day = String(now.getDate()).padStart(2, '0');
21
+ return `${year}${month}${day}`;
22
+ }
23
+ getEventFilePath(connectorId, date) {
24
+ const dateStr = date || this.getDateString();
25
+ return join(this.eventsDir, connectorId, `${dateStr}.jsonl`);
26
+ }
27
+ async saveEvent(event) {
28
+ const fullEvent = {
29
+ event_id: randomUUID(),
30
+ ts: new Date().toISOString(),
31
+ ...event,
32
+ raw: event.raw ? truncateRaw(event.raw) : undefined,
33
+ };
34
+ const filePath = this.getEventFilePath(event.connector_id);
35
+ await appendLine(filePath, JSON.stringify(fullEvent));
36
+ return fullEvent;
37
+ }
38
+ async createEvent(connectorId, direction, kind, options = {}) {
39
+ return this.saveEvent({
40
+ connector_id: connectorId,
41
+ direction,
42
+ kind,
43
+ ...options,
44
+ });
45
+ }
46
+ async getRecentEvents(connectorId, count = 20) {
47
+ // List all event files for this connector
48
+ const connectorDir = join(this.eventsDir, connectorId);
49
+ try {
50
+ const files = await fs.readdir(connectorDir);
51
+ const jsonlFiles = files.filter(f => f.endsWith('.jsonl')).sort().reverse();
52
+ const events = [];
53
+ for (const file of jsonlFiles) {
54
+ if (events.length >= count)
55
+ break;
56
+ const filePath = join(connectorDir, file);
57
+ const remaining = count - events.length;
58
+ const lines = await readLastLines(filePath, remaining);
59
+ for (const line of lines.reverse()) {
60
+ try {
61
+ events.unshift(JSON.parse(line));
62
+ }
63
+ catch {
64
+ // Skip invalid lines
65
+ }
66
+ }
67
+ }
68
+ return events.slice(-count);
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
72
+ return [];
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ async listConnectorDates(connectorId) {
78
+ const connectorDir = join(this.eventsDir, connectorId);
79
+ try {
80
+ const files = await fs.readdir(connectorDir);
81
+ return files
82
+ .filter(f => f.endsWith('.jsonl'))
83
+ .map(f => f.replace('.jsonl', ''))
84
+ .sort();
85
+ }
86
+ catch {
87
+ return [];
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * proofscan - MCP Server scanner
3
+ * Programmatic API exports
4
+ */
5
+ export * from './types/index.js';
6
+ export * from './config/index.js';
7
+ export * from './transports/index.js';
8
+ export * from './events/index.js';
9
+ export * from './scanner/index.js';
10
+ export * from './utils/index.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * proofscan - MCP Server scanner
3
+ * Programmatic API exports
4
+ */
5
+ export * from './types/index.js';
6
+ export * from './config/index.js';
7
+ export * from './transports/index.js';
8
+ export * from './events/index.js';
9
+ export * from './scanner/index.js';
10
+ export * from './utils/index.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Scanner - orchestrates MCP server scanning
3
+ * Connects, performs handshake, calls tools/list, logs events
4
+ */
5
+ import type { Connector } from '../types/index.js';
6
+ export interface ScanResult {
7
+ success: boolean;
8
+ connectorId: string;
9
+ tools?: unknown[];
10
+ error?: string;
11
+ eventCount: number;
12
+ }
13
+ export interface ScanOptions {
14
+ timeout?: number;
15
+ }
16
+ export declare class Scanner {
17
+ private eventStore;
18
+ private configDir;
19
+ constructor(configDir: string);
20
+ scan(connector: Connector, options?: ScanOptions): Promise<ScanResult>;
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAKvB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;CAyLjF"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Scanner - orchestrates MCP server scanning
3
+ * Connects, performs handshake, calls tools/list, logs events
4
+ */
5
+ import { StdioConnection } from '../transports/stdio.js';
6
+ import { EventStore } from '../events/store.js';
7
+ export class Scanner {
8
+ eventStore;
9
+ configDir;
10
+ constructor(configDir) {
11
+ this.configDir = configDir;
12
+ this.eventStore = new EventStore(configDir);
13
+ }
14
+ async scan(connector, options = {}) {
15
+ const timeout = (options.timeout || 30) * 1000;
16
+ let eventCount = 0;
17
+ if (connector.transport.type !== 'stdio') {
18
+ return {
19
+ success: false,
20
+ connectorId: connector.id,
21
+ error: `Unsupported transport type: ${connector.transport.type}`,
22
+ eventCount: 0,
23
+ };
24
+ }
25
+ const transport = connector.transport;
26
+ const connection = new StdioConnection(transport);
27
+ // Track if we've received an initialize response
28
+ let initializeResponse = null;
29
+ try {
30
+ // Log connection attempt
31
+ await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
32
+ raw: JSON.stringify({
33
+ type: 'connect_attempt',
34
+ command: transport.command,
35
+ args: transport.args,
36
+ }),
37
+ });
38
+ eventCount++;
39
+ // Set up message logging
40
+ connection.on('message', async (msg, raw) => {
41
+ const isRequest = 'method' in msg && 'id' in msg && msg.id !== null;
42
+ const isNotification = 'method' in msg && !('id' in msg);
43
+ const isResponse = 'id' in msg && !('method' in msg);
44
+ // Determine direction based on who sent it
45
+ // Requests/responses from server come through stdout
46
+ // We already emit our own requests when we send them
47
+ const direction = isResponse ? 'server_to_client' :
48
+ (isRequest || isNotification) && !('id' in msg && 'result' in msg) ? 'client_to_server' : 'server_to_client';
49
+ let kind;
50
+ if (isRequest)
51
+ kind = 'request';
52
+ else if (isNotification)
53
+ kind = 'notification';
54
+ else if (isResponse)
55
+ kind = 'response';
56
+ else
57
+ kind = 'transport_event';
58
+ const eventOpts = {
59
+ raw,
60
+ };
61
+ if ('method' in msg) {
62
+ eventOpts.method = msg.method;
63
+ }
64
+ if ('id' in msg && msg.id !== null) {
65
+ eventOpts.rpc_id = msg.id;
66
+ }
67
+ if (isResponse) {
68
+ const resp = msg;
69
+ eventOpts.ok = !resp.error;
70
+ if (resp.error) {
71
+ eventOpts.error = {
72
+ code: resp.error.code,
73
+ message: resp.error.message,
74
+ };
75
+ }
76
+ }
77
+ await this.eventStore.createEvent(connector.id, direction, kind, eventOpts);
78
+ eventCount++;
79
+ });
80
+ connection.on('stderr', async (data) => {
81
+ await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
82
+ raw: JSON.stringify({ type: 'stderr', data: data.trim() }),
83
+ });
84
+ eventCount++;
85
+ });
86
+ connection.on('error', async (error) => {
87
+ await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
88
+ error: { code: -32000, message: error.message },
89
+ raw: JSON.stringify({ type: 'error', message: error.message }),
90
+ });
91
+ eventCount++;
92
+ });
93
+ // Connect
94
+ await connection.connect();
95
+ await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
96
+ raw: JSON.stringify({ type: 'connected' }),
97
+ });
98
+ eventCount++;
99
+ // MCP handshake: initialize
100
+ try {
101
+ initializeResponse = await connection.sendRequest('initialize', {
102
+ protocolVersion: '2024-11-05',
103
+ capabilities: {},
104
+ clientInfo: {
105
+ name: 'proofscan',
106
+ version: '0.1.0',
107
+ },
108
+ }, timeout);
109
+ // Send initialized notification
110
+ connection.sendNotification('notifications/initialized', {});
111
+ }
112
+ catch (error) {
113
+ const errMsg = error instanceof Error ? error.message : String(error);
114
+ await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
115
+ error: { code: -32000, message: `Initialize failed: ${errMsg}` },
116
+ raw: JSON.stringify({ type: 'initialize_failed', error: errMsg }),
117
+ });
118
+ eventCount++;
119
+ return {
120
+ success: false,
121
+ connectorId: connector.id,
122
+ error: `Initialize failed: ${errMsg}`,
123
+ eventCount,
124
+ };
125
+ }
126
+ // Call tools/list
127
+ let toolsListResponse;
128
+ try {
129
+ toolsListResponse = await connection.sendRequest('tools/list', {}, timeout);
130
+ }
131
+ catch (error) {
132
+ const errMsg = error instanceof Error ? error.message : String(error);
133
+ await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
134
+ error: { code: -32000, message: `tools/list failed: ${errMsg}` },
135
+ raw: JSON.stringify({ type: 'tools_list_failed', error: errMsg }),
136
+ });
137
+ eventCount++;
138
+ return {
139
+ success: false,
140
+ connectorId: connector.id,
141
+ error: `tools/list failed: ${errMsg}`,
142
+ eventCount,
143
+ };
144
+ }
145
+ // Extract tools from response
146
+ const tools = toolsListResponse.result && typeof toolsListResponse.result === 'object'
147
+ ? toolsListResponse.result.tools
148
+ : undefined;
149
+ // Close connection gracefully
150
+ connection.close();
151
+ await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
152
+ raw: JSON.stringify({ type: 'disconnected' }),
153
+ });
154
+ eventCount++;
155
+ return {
156
+ success: true,
157
+ connectorId: connector.id,
158
+ tools: tools || [],
159
+ eventCount,
160
+ };
161
+ }
162
+ catch (error) {
163
+ const errMsg = error instanceof Error ? error.message : String(error);
164
+ await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
165
+ error: { code: -32000, message: errMsg },
166
+ raw: JSON.stringify({ type: 'scan_error', error: errMsg }),
167
+ });
168
+ eventCount++;
169
+ connection.close();
170
+ return {
171
+ success: false,
172
+ connectorId: connector.id,
173
+ error: errMsg,
174
+ eventCount,
175
+ };
176
+ }
177
+ }
178
+ }
179
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './stdio.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './stdio.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Stdio transport for MCP servers
3
+ * Spawns child process and communicates via stdin/stdout JSON-RPC
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import type { StdioTransport } from '../types/index.js';
7
+ export interface JsonRpcRequest {
8
+ jsonrpc: '2.0';
9
+ id: string | number;
10
+ method: string;
11
+ params?: unknown;
12
+ }
13
+ export interface JsonRpcResponse {
14
+ jsonrpc: '2.0';
15
+ id: string | number | null;
16
+ result?: unknown;
17
+ error?: {
18
+ code: number;
19
+ message: string;
20
+ data?: unknown;
21
+ };
22
+ }
23
+ export interface JsonRpcNotification {
24
+ jsonrpc: '2.0';
25
+ method: string;
26
+ params?: unknown;
27
+ }
28
+ export type JsonRpcMessage = JsonRpcRequest | JsonRpcResponse | JsonRpcNotification;
29
+ export interface StdioConnectionEvents {
30
+ message: (msg: JsonRpcMessage, raw: string) => void;
31
+ error: (error: Error) => void;
32
+ close: (code: number | null, signal: string | null) => void;
33
+ stderr: (data: string) => void;
34
+ }
35
+ export declare class StdioConnection extends EventEmitter {
36
+ private process;
37
+ private buffer;
38
+ private transport;
39
+ private requestId;
40
+ private pendingRequests;
41
+ constructor(transport: StdioTransport);
42
+ connect(): Promise<void>;
43
+ private handleData;
44
+ private processLine;
45
+ sendRequest(method: string, params?: unknown, timeoutMs?: number): Promise<JsonRpcResponse>;
46
+ sendNotification(method: string, params?: unknown): void;
47
+ close(): void;
48
+ isConnected(): boolean;
49
+ }
50
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAIR;gBAEH,SAAS,EAAE,cAAc;IAK/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD9B,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,WAAW;IAmBb,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAoCxG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAgBxD,KAAK,IAAI,IAAI;IAMb,WAAW,IAAI,OAAO;CAGvB"}