@portel/photon 1.18.0 → 1.19.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 (172) hide show
  1. package/dist/auto-ui/beam.d.ts.map +1 -1
  2. package/dist/auto-ui/beam.js +14 -4
  3. package/dist/auto-ui/beam.js.map +1 -1
  4. package/dist/beam-form.bundle.js +5 -3
  5. package/dist/beam-form.bundle.js.map +2 -2
  6. package/dist/beam.bundle.js +686 -30
  7. package/dist/beam.bundle.js.map +3 -3
  8. package/dist/claude-code-plugin.js +1 -1
  9. package/dist/cli/commands/beam.d.ts.map +1 -1
  10. package/dist/cli/commands/beam.js +8 -2
  11. package/dist/cli/commands/beam.js.map +1 -1
  12. package/dist/cli/commands/changelog.d.ts +9 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +133 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/maker.d.ts.map +1 -1
  17. package/dist/cli/commands/maker.js +23 -2
  18. package/dist/cli/commands/maker.js.map +1 -1
  19. package/dist/cli/commands/mcp.d.ts.map +1 -1
  20. package/dist/cli/commands/mcp.js +53 -0
  21. package/dist/cli/commands/mcp.js.map +1 -1
  22. package/dist/cli/commands/package.d.ts.map +1 -1
  23. package/dist/cli/commands/package.js +18 -2
  24. package/dist/cli/commands/package.js.map +1 -1
  25. package/dist/cli/commands/run.d.ts.map +1 -1
  26. package/dist/cli/commands/run.js +1 -0
  27. package/dist/cli/commands/run.js.map +1 -1
  28. package/dist/cli/commands/update.d.ts +3 -2
  29. package/dist/cli/commands/update.d.ts.map +1 -1
  30. package/dist/cli/commands/update.js +50 -43
  31. package/dist/cli/commands/update.js.map +1 -1
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +16 -2
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli-alias.js +1 -1
  36. package/dist/cli-alias.js.map +1 -1
  37. package/dist/context-store.d.ts +23 -33
  38. package/dist/context-store.d.ts.map +1 -1
  39. package/dist/context-store.js +147 -97
  40. package/dist/context-store.js.map +1 -1
  41. package/dist/context.d.ts +15 -10
  42. package/dist/context.d.ts.map +1 -1
  43. package/dist/context.js +37 -13
  44. package/dist/context.js.map +1 -1
  45. package/dist/daemon/server.js +4 -2
  46. package/dist/daemon/server.js.map +1 -1
  47. package/dist/data-migration.d.ts +27 -0
  48. package/dist/data-migration.d.ts.map +1 -0
  49. package/dist/data-migration.js +307 -0
  50. package/dist/data-migration.js.map +1 -0
  51. package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
  52. package/dist/editor-support/docblock-tag-catalog.js +6 -0
  53. package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
  54. package/dist/loader.d.ts +10 -0
  55. package/dist/loader.d.ts.map +1 -1
  56. package/dist/loader.js +97 -12
  57. package/dist/loader.js.map +1 -1
  58. package/dist/marketplace-manager.d.ts.map +1 -1
  59. package/dist/marketplace-manager.js +25 -5
  60. package/dist/marketplace-manager.js.map +1 -1
  61. package/dist/photon-cli-runner.d.ts.map +1 -1
  62. package/dist/photon-cli-runner.js +47 -21
  63. package/dist/photon-cli-runner.js.map +1 -1
  64. package/dist/photon-doc-extractor.d.ts +1 -0
  65. package/dist/photon-doc-extractor.d.ts.map +1 -1
  66. package/dist/photon-doc-extractor.js +6 -0
  67. package/dist/photon-doc-extractor.js.map +1 -1
  68. package/dist/readme-syncer.d.ts.map +1 -1
  69. package/dist/readme-syncer.js +6 -1
  70. package/dist/readme-syncer.js.map +1 -1
  71. package/dist/server.d.ts +40 -0
  72. package/dist/server.d.ts.map +1 -1
  73. package/dist/server.js +143 -28
  74. package/dist/server.js.map +1 -1
  75. package/dist/shared/audit.js +4 -4
  76. package/dist/shared/audit.js.map +1 -1
  77. package/dist/tasks/store.d.ts.map +1 -1
  78. package/dist/tasks/store.js +6 -2
  79. package/dist/tasks/store.js.map +1 -1
  80. package/dist/version-notify.d.ts +27 -0
  81. package/dist/version-notify.d.ts.map +1 -0
  82. package/dist/version-notify.js +142 -0
  83. package/dist/version-notify.js.map +1 -0
  84. package/package.json +2 -2
  85. package/dist/auto-ui/bridge/openai-shim.d.ts +0 -20
  86. package/dist/auto-ui/bridge/openai-shim.d.ts.map +0 -1
  87. package/dist/auto-ui/bridge/openai-shim.js +0 -231
  88. package/dist/auto-ui/bridge/openai-shim.js.map +0 -1
  89. package/dist/auto-ui/bridge/photon-app.d.ts +0 -162
  90. package/dist/auto-ui/bridge/photon-app.d.ts.map +0 -1
  91. package/dist/auto-ui/bridge/photon-app.js +0 -460
  92. package/dist/auto-ui/bridge/photon-app.js.map +0 -1
  93. package/dist/auto-ui/daemon-tools.d.ts +0 -45
  94. package/dist/auto-ui/daemon-tools.d.ts.map +0 -1
  95. package/dist/auto-ui/daemon-tools.js +0 -581
  96. package/dist/auto-ui/daemon-tools.js.map +0 -1
  97. package/dist/auto-ui/design-system/index.d.ts +0 -21
  98. package/dist/auto-ui/design-system/index.d.ts.map +0 -1
  99. package/dist/auto-ui/design-system/index.js +0 -27
  100. package/dist/auto-ui/design-system/index.js.map +0 -1
  101. package/dist/auto-ui/design-system/transaction-ui.d.ts +0 -70
  102. package/dist/auto-ui/design-system/transaction-ui.d.ts.map +0 -1
  103. package/dist/auto-ui/design-system/transaction-ui.js +0 -982
  104. package/dist/auto-ui/design-system/transaction-ui.js.map +0 -1
  105. package/dist/auto-ui/playground-server.d.ts +0 -7
  106. package/dist/auto-ui/playground-server.d.ts.map +0 -1
  107. package/dist/auto-ui/playground-server.js +0 -840
  108. package/dist/auto-ui/playground-server.js.map +0 -1
  109. package/dist/auto-ui/rendering/components.d.ts +0 -29
  110. package/dist/auto-ui/rendering/components.d.ts.map +0 -1
  111. package/dist/auto-ui/rendering/components.js +0 -1341
  112. package/dist/auto-ui/rendering/components.js.map +0 -1
  113. package/dist/auto-ui/rendering/field-analyzer.d.ts +0 -104
  114. package/dist/auto-ui/rendering/field-analyzer.d.ts.map +0 -1
  115. package/dist/auto-ui/rendering/field-analyzer.js +0 -447
  116. package/dist/auto-ui/rendering/field-analyzer.js.map +0 -1
  117. package/dist/auto-ui/rendering/field-renderers.d.ts +0 -64
  118. package/dist/auto-ui/rendering/field-renderers.d.ts.map +0 -1
  119. package/dist/auto-ui/rendering/field-renderers.js +0 -317
  120. package/dist/auto-ui/rendering/field-renderers.js.map +0 -1
  121. package/dist/auto-ui/rendering/index.d.ts +0 -28
  122. package/dist/auto-ui/rendering/index.d.ts.map +0 -1
  123. package/dist/auto-ui/rendering/index.js +0 -60
  124. package/dist/auto-ui/rendering/index.js.map +0 -1
  125. package/dist/auto-ui/rendering/layout-selector.d.ts +0 -60
  126. package/dist/auto-ui/rendering/layout-selector.d.ts.map +0 -1
  127. package/dist/auto-ui/rendering/layout-selector.js +0 -476
  128. package/dist/auto-ui/rendering/layout-selector.js.map +0 -1
  129. package/dist/markdown-utils.d.ts +0 -8
  130. package/dist/markdown-utils.d.ts.map +0 -1
  131. package/dist/markdown-utils.js +0 -64
  132. package/dist/markdown-utils.js.map +0 -1
  133. package/dist/mcp-client.d.ts +0 -9
  134. package/dist/mcp-client.d.ts.map +0 -1
  135. package/dist/mcp-client.js +0 -11
  136. package/dist/mcp-client.js.map +0 -1
  137. package/dist/mcp-elicitation.d.ts +0 -32
  138. package/dist/mcp-elicitation.d.ts.map +0 -1
  139. package/dist/mcp-elicitation.js +0 -26
  140. package/dist/mcp-elicitation.js.map +0 -1
  141. package/dist/photons/builder-compass.photon.d.ts +0 -167
  142. package/dist/photons/builder-compass.photon.d.ts.map +0 -1
  143. package/dist/photons/builder-compass.photon.js +0 -816
  144. package/dist/photons/builder-compass.photon.js.map +0 -1
  145. package/dist/photons/builder-compass.photon.ts +0 -1129
  146. package/dist/photons/docs/ui/docs.html +0 -441
  147. package/dist/photons/docs.photon.d.ts +0 -237
  148. package/dist/photons/docs.photon.d.ts.map +0 -1
  149. package/dist/photons/docs.photon.js +0 -483
  150. package/dist/photons/docs.photon.js.map +0 -1
  151. package/dist/photons/docs.photon.ts +0 -536
  152. package/dist/photons/slides.photon.d.ts +0 -212
  153. package/dist/photons/slides.photon.d.ts.map +0 -1
  154. package/dist/photons/slides.photon.js +0 -355
  155. package/dist/photons/slides.photon.js.map +0 -1
  156. package/dist/photons/slides.photon.ts +0 -370
  157. package/dist/photons/spreadsheet/ui/spreadsheet.html +0 -779
  158. package/dist/photons/spreadsheet.photon.d.ts +0 -554
  159. package/dist/photons/spreadsheet.photon.d.ts.map +0 -1
  160. package/dist/photons/spreadsheet.photon.js +0 -1050
  161. package/dist/photons/spreadsheet.photon.js.map +0 -1
  162. package/dist/photons/spreadsheet.photon.ts +0 -1239
  163. package/dist/photons/ui/builder-compass.html +0 -1199
  164. package/dist/photons/ui/builder-compass.photon.html +0 -380
  165. package/dist/security-scanner.d.ts +0 -52
  166. package/dist/security-scanner.d.ts.map +0 -1
  167. package/dist/security-scanner.js +0 -181
  168. package/dist/security-scanner.js.map +0 -1
  169. package/dist/shared/performance.d.ts +0 -65
  170. package/dist/shared/performance.d.ts.map +0 -1
  171. package/dist/shared/performance.js +0 -136
  172. package/dist/shared/performance.js.map +0 -1
@@ -1,380 +0,0 @@
1
- <style>
2
- :root {
3
- --canvas: #f4eddf;
4
- --ink: #201d18;
5
- --muted: #6c665d;
6
- --olive: #38452f;
7
- --sage: #6f8d62;
8
- --amber: #ba7c33;
9
- --rust: #9d5a42;
10
- --card: rgba(255, 251, 244, 0.92);
11
- --line: rgba(68, 53, 36, 0.12);
12
- --shadow: 0 18px 48px rgba(54, 38, 17, 0.1);
13
- --radius-xl: 28px;
14
- --radius-lg: 20px;
15
- --radius-md: 16px;
16
- }
17
-
18
- body {
19
- background:
20
- radial-gradient(circle at top left, rgba(111, 141, 98, 0.14), transparent 24%),
21
- radial-gradient(circle at top right, rgba(186, 124, 51, 0.12), transparent 20%),
22
- linear-gradient(180deg, #f8f1e7 0%, var(--canvas) 44%, #ecdfcb 100%);
23
- color: var(--ink);
24
- font-family: 'Inter', system-ui, sans-serif;
25
- padding: 24px;
26
- }
27
-
28
- .shell {
29
- display: grid;
30
- gap: 18px;
31
- }
32
-
33
- .hero,
34
- .grid {
35
- display: grid;
36
- gap: 18px;
37
- }
38
-
39
- .hero {
40
- grid-template-columns: minmax(0, 1.35fr) minmax(320px, 0.82fr);
41
- }
42
-
43
- .grid {
44
- grid-template-columns: minmax(320px, 0.9fr) minmax(400px, 1.1fr) minmax(320px, 0.92fr);
45
- align-items: start;
46
- }
47
-
48
- .column {
49
- display: grid;
50
- gap: 18px;
51
- }
52
-
53
- .panel {
54
- background: linear-gradient(180deg, rgba(255, 252, 247, 0.94), rgba(249, 241, 229, 0.96));
55
- border: 1px solid var(--line);
56
- border-radius: var(--radius-xl);
57
- box-shadow: var(--shadow);
58
- padding: 22px;
59
- }
60
-
61
- .hero-main {
62
- padding: 28px;
63
- }
64
-
65
- .eyebrow,
66
- .pill {
67
- display: inline-flex;
68
- align-items: center;
69
- gap: 8px;
70
- border-radius: 999px;
71
- font:
72
- 500 12px/1 ui-monospace,
73
- SFMono-Regular,
74
- Menlo,
75
- monospace;
76
- letter-spacing: 0.06em;
77
- text-transform: uppercase;
78
- }
79
-
80
- .eyebrow {
81
- color: var(--olive);
82
- padding: 7px 12px;
83
- border: 1px solid rgba(56, 69, 47, 0.14);
84
- background: rgba(56, 69, 47, 0.08);
85
- }
86
-
87
- .hero-main h1 {
88
- margin-top: 14px;
89
- font-size: clamp(2.1rem, 5vw, 4rem);
90
- line-height: 0.96;
91
- font-weight: 800;
92
- max-width: 11ch;
93
- }
94
-
95
- .lede,
96
- .copy {
97
- color: var(--muted);
98
- line-height: 1.6;
99
- }
100
-
101
- .lede {
102
- margin-top: 16px;
103
- max-width: 64ch;
104
- font-size: 1rem;
105
- }
106
-
107
- .metrics {
108
- margin-top: 24px;
109
- display: grid;
110
- grid-template-columns: repeat(3, minmax(0, 1fr));
111
- gap: 12px;
112
- }
113
-
114
- .metric {
115
- background: rgba(255, 255, 255, 0.58);
116
- border: 1px solid rgba(68, 53, 36, 0.1);
117
- border-radius: 18px;
118
- padding: 16px;
119
- }
120
-
121
- .metric label {
122
- display: block;
123
- color: var(--muted);
124
- font-size: 12px;
125
- text-transform: uppercase;
126
- letter-spacing: 0.08em;
127
- margin-bottom: 8px;
128
- }
129
-
130
- .metric [data-method] {
131
- min-height: 0;
132
- }
133
-
134
- .stack {
135
- display: grid;
136
- gap: 12px;
137
- }
138
-
139
- .toolbar {
140
- display: flex;
141
- flex-wrap: wrap;
142
- gap: 10px;
143
- }
144
-
145
- .toolbar button,
146
- button[data-method] {
147
- border-radius: 16px;
148
- padding: 12px 16px;
149
- font-weight: 600;
150
- }
151
-
152
- .primary {
153
- background: linear-gradient(135deg, #38452f, #526647);
154
- color: #f7f3ec;
155
- }
156
-
157
- .secondary {
158
- background: rgba(255, 255, 255, 0.62);
159
- color: var(--ink);
160
- border: 1px solid rgba(68, 53, 36, 0.12);
161
- }
162
-
163
- .callout {
164
- padding: 16px;
165
- border-radius: 18px;
166
- background: rgba(111, 141, 98, 0.08);
167
- border: 1px solid rgba(111, 141, 98, 0.14);
168
- color: var(--muted);
169
- }
170
-
171
- .warn {
172
- background: rgba(157, 90, 66, 0.08);
173
- border-color: rgba(157, 90, 66, 0.14);
174
- }
175
-
176
- .section-head {
177
- display: flex;
178
- justify-content: space-between;
179
- gap: 12px;
180
- align-items: flex-start;
181
- margin-bottom: 14px;
182
- }
183
-
184
- .section-head h2 {
185
- margin: 0;
186
- font-size: 1.1rem;
187
- }
188
-
189
- .section-head p {
190
- margin-top: 8px;
191
- color: var(--muted);
192
- line-height: 1.55;
193
- }
194
-
195
- .pill {
196
- color: var(--amber);
197
- padding: 6px 10px;
198
- background: rgba(186, 124, 51, 0.1);
199
- border: 1px solid rgba(186, 124, 51, 0.14);
200
- }
201
-
202
- .embed > [data-method] {
203
- min-height: 120px;
204
- }
205
-
206
- .embed.compact > [data-method] {
207
- min-height: 64px;
208
- }
209
-
210
- .report {
211
- border-radius: 18px;
212
- background: rgba(255, 255, 255, 0.56);
213
- border: 1px solid rgba(68, 53, 36, 0.1);
214
- padding: 16px;
215
- }
216
-
217
- .report [data-method] {
218
- min-height: 180px;
219
- }
220
-
221
- @media (max-width: 1180px) {
222
- .hero,
223
- .grid {
224
- grid-template-columns: 1fr;
225
- }
226
- }
227
- </style>
228
-
229
- <div class="shell">
230
- <section class="hero">
231
- <div class="panel hero-main">
232
- <div class="eyebrow">Builder Compass / Photon</div>
233
- <h1>Turn your builder profile into a money map.</h1>
234
- <p class="lede">
235
- Builder Compass stores your profile, classifies your AI-native builder archetype, and
236
- researches how people like you are making money on the open web. TinyFish is used when you
237
- explicitly rebuild, not every time you open the dashboard.
238
- </p>
239
-
240
- <div class="metrics">
241
- <div class="metric">
242
- <label>Fit overview</label>
243
- <div data-method="fitOverview"></div>
244
- </div>
245
- <div class="metric">
246
- <label>Money paths</label>
247
- <div data-method="moneyPaths"></div>
248
- </div>
249
- <div class="metric">
250
- <label>Builder report</label>
251
- <div data-method="report"></div>
252
- </div>
253
- </div>
254
- </div>
255
-
256
- <aside class="panel stack">
257
- <div>
258
- <h2 style="margin: 0">How it works</h2>
259
- <p class="copy" style="margin-top: 10px">
260
- Save once, inspect anytime. When your profile changes, update the saved input and rebuild
261
- the research deliberately.
262
- </p>
263
- </div>
264
- <div class="callout">
265
- Bring your own TinyFish API key if you want live market research and open-web evidence.
266
- Without it, Builder Compass still gives a heuristic builder model.
267
- </div>
268
- <div class="toolbar">
269
- <button class="primary" data-method="runCompass" data-target="#report-panel">
270
- Run full compass
271
- </button>
272
- <button class="secondary" data-method="analyzeIdentity" data-target="#identity-panel">
273
- Refresh identity
274
- </button>
275
- <button class="secondary" data-method="researchMarket" data-target="#market-panel">
276
- Refresh market
277
- </button>
278
- </div>
279
- </aside>
280
- </section>
281
-
282
- <section class="grid">
283
- <div class="column">
284
- <div class="panel">
285
- <div class="section-head">
286
- <div>
287
- <h2>Profile intake</h2>
288
- <p>
289
- Minimal input. Persistent state. This form updates the stored profile and clears stale
290
- research when your self-model changes.
291
- </p>
292
- </div>
293
- <div class="pill">Persistent</div>
294
- </div>
295
- <div class="embed">
296
- <div data-method="saveProfile"></div>
297
- </div>
298
- </div>
299
-
300
- <div class="panel">
301
- <div class="section-head">
302
- <div>
303
- <h2>Narrative report</h2>
304
- <p>The reusable guide you can open later without paying the TinyFish cost again.</p>
305
- </div>
306
- </div>
307
- <div class="report" id="report-panel">
308
- <div data-method="report"></div>
309
- </div>
310
- </div>
311
- </div>
312
-
313
- <div class="column">
314
- <div class="panel" id="identity-panel">
315
- <div class="section-head">
316
- <div>
317
- <h2>Identity analysis</h2>
318
- <p>
319
- Builder archetype, strengths, work fit, and risks. Cached until you intentionally
320
- rebuild.
321
- </p>
322
- </div>
323
- <div class="pill">Profile model</div>
324
- </div>
325
- <div class="embed compact">
326
- <div data-method="strengthMatrix"></div>
327
- </div>
328
- </div>
329
-
330
- <div class="panel">
331
- <div class="section-head">
332
- <div>
333
- <h2>Fit dials</h2>
334
- <p>
335
- Quick read on AI-native leverage, founder energy, execution reliability, and risk
336
- load.
337
- </p>
338
- </div>
339
- </div>
340
- <div class="embed compact">
341
- <div data-method="fitOverview"></div>
342
- </div>
343
- </div>
344
- </div>
345
-
346
- <div class="column">
347
- <div class="panel" id="market-panel">
348
- <div class="section-head">
349
- <div>
350
- <h2>Money paths</h2>
351
- <p>Research-backed routes ranked by fit, speed to money, demand, and sustainability.</p>
352
- </div>
353
- <div class="pill">Market map</div>
354
- </div>
355
- <div class="embed compact">
356
- <div data-method="moneyPaths"></div>
357
- </div>
358
- </div>
359
-
360
- <div class="panel">
361
- <div class="section-head">
362
- <div>
363
- <h2>Usage model</h2>
364
- <p>Exactly the behavior we want for repeat use.</p>
365
- </div>
366
- </div>
367
- <div class="callout">
368
- Open the same profile any time to get the stored analysis back immediately.
369
- </div>
370
- <div class="callout" style="margin-top: 12px">
371
- Update the profile only when you’ve actually changed, then rebuild identity and market
372
- research.
373
- </div>
374
- <div class="callout warn" style="margin-top: 12px">
375
- TinyFish is a rebuild engine here, not a page-refresh tax.
376
- </div>
377
- </div>
378
- </div>
379
- </section>
380
- </div>
@@ -1,52 +0,0 @@
1
- /**
2
- * Security Scanner - Check dependencies for known vulnerabilities
3
- */
4
- export interface VulnerabilityInfo {
5
- severity: 'info' | 'low' | 'moderate' | 'high' | 'critical';
6
- title: string;
7
- url?: string;
8
- via?: string[];
9
- range?: string;
10
- }
11
- export interface DependencyAuditResult {
12
- dependency: string;
13
- version: string;
14
- vulnerabilities: VulnerabilityInfo[];
15
- hasVulnerabilities: boolean;
16
- }
17
- export interface MCPAuditResult {
18
- mcpName: string;
19
- dependencies: DependencyAuditResult[];
20
- totalVulnerabilities: number;
21
- criticalCount: number;
22
- highCount: number;
23
- moderateCount: number;
24
- lowCount: number;
25
- }
26
- export declare class SecurityScanner {
27
- /**
28
- * Audit dependencies for a specific MCP
29
- */
30
- auditMCP(mcpName: string, dependencies: string[]): Promise<MCPAuditResult>;
31
- /**
32
- * Audit a single dependency
33
- */
34
- private auditDependency;
35
- /**
36
- * Extract relevant vulnerabilities from npm audit output
37
- */
38
- private extractVulnerabilities;
39
- /**
40
- * Quick check if dependency has known vulnerabilities
41
- */
42
- hasVulnerabilities(dependency: string): Promise<boolean>;
43
- /**
44
- * Get severity color for terminal output
45
- */
46
- getSeveritySymbol(severity: string): string;
47
- /**
48
- * Format audit result for display
49
- */
50
- formatAuditResult(result: MCPAuditResult): string;
51
- }
52
- //# sourceMappingURL=security-scanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../src/security-scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IA4ChF;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB9D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAe3C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAsBlD"}
@@ -1,181 +0,0 @@
1
- /**
2
- * Security Scanner - Check dependencies for known vulnerabilities
3
- */
4
- import { exec, execFile } from 'child_process';
5
- import { promisify } from 'util';
6
- import * as path from 'path';
7
- import * as os from 'os';
8
- import * as fs from 'fs/promises';
9
- import { validateNpmPackageName } from './shared/security.js';
10
- const execAsync = promisify(exec);
11
- const execFileAsync = promisify(execFile);
12
- export class SecurityScanner {
13
- /**
14
- * Audit dependencies for a specific MCP
15
- */
16
- async auditMCP(mcpName, dependencies) {
17
- const results = [];
18
- let totalVulnerabilities = 0;
19
- let criticalCount = 0;
20
- let highCount = 0;
21
- let moderateCount = 0;
22
- let lowCount = 0;
23
- for (const dep of dependencies) {
24
- const result = await this.auditDependency(mcpName, dep);
25
- results.push(result);
26
- if (result.hasVulnerabilities) {
27
- totalVulnerabilities += result.vulnerabilities.length;
28
- result.vulnerabilities.forEach((vuln) => {
29
- switch (vuln.severity) {
30
- case 'critical':
31
- criticalCount++;
32
- break;
33
- case 'high':
34
- highCount++;
35
- break;
36
- case 'moderate':
37
- moderateCount++;
38
- break;
39
- case 'low':
40
- lowCount++;
41
- break;
42
- }
43
- });
44
- }
45
- }
46
- return {
47
- mcpName,
48
- dependencies: results,
49
- totalVulnerabilities,
50
- criticalCount,
51
- highCount,
52
- moderateCount,
53
- lowCount,
54
- };
55
- }
56
- /**
57
- * Audit a single dependency
58
- */
59
- async auditDependency(mcpName, dependency) {
60
- // Parse dependency string (name@version)
61
- const parts = dependency.split('@');
62
- const version = parts.pop() || 'latest';
63
- const name = parts.join('@'); // Handle scoped packages like @org/package
64
- const depPath = path.join(os.homedir(), '.cache', 'photon-mcp', 'dependencies', mcpName);
65
- try {
66
- // Check if dependency directory exists
67
- await fs.access(depPath);
68
- // Run npm audit in the dependency directory
69
- const { stdout } = await execAsync('npm audit --json', {
70
- cwd: depPath,
71
- timeout: 30000,
72
- });
73
- const auditData = JSON.parse(stdout);
74
- const vulnerabilities = this.extractVulnerabilities(auditData, name);
75
- return {
76
- dependency: name,
77
- version,
78
- vulnerabilities,
79
- hasVulnerabilities: vulnerabilities.length > 0,
80
- };
81
- }
82
- catch (error) {
83
- // If npm audit fails or directory doesn't exist, assume no vulnerabilities
84
- // (dependency might not be installed yet)
85
- return {
86
- dependency: name,
87
- version,
88
- vulnerabilities: [],
89
- hasVulnerabilities: false,
90
- };
91
- }
92
- }
93
- /**
94
- * Extract relevant vulnerabilities from npm audit output
95
- */
96
- extractVulnerabilities(auditData, packageName) {
97
- const vulnerabilities = [];
98
- if (!auditData.vulnerabilities) {
99
- return vulnerabilities;
100
- }
101
- // npm audit v7+ format
102
- for (const [vulnPackage, vulnData] of Object.entries(auditData.vulnerabilities)) {
103
- // Check if this vulnerability affects our target package
104
- if (vulnPackage === packageName || vulnData.via?.includes(packageName)) {
105
- vulnerabilities.push({
106
- severity: vulnData.severity || 'moderate',
107
- title: vulnData.name || vulnPackage,
108
- url: vulnData.url,
109
- via: vulnData.via?.filter((v) => typeof v === 'string'),
110
- range: vulnData.range,
111
- });
112
- }
113
- }
114
- return vulnerabilities;
115
- }
116
- /**
117
- * Quick check if dependency has known vulnerabilities
118
- */
119
- async hasVulnerabilities(dependency) {
120
- try {
121
- // Use npm view to check if package exists
122
- const parts = dependency.split('@');
123
- const version = parts.pop() || 'latest';
124
- const name = parts.join('@');
125
- // Security: validate package name before passing to shell
126
- if (!validateNpmPackageName(`${name}@${version}`)) {
127
- return false;
128
- }
129
- const { stdout } = await execFileAsync('npm', ['view', `${name}@${version}`, 'version'], {
130
- timeout: 10000,
131
- });
132
- // If we get here, package exists. Now check for advisories
133
- // Note: npm doesn't provide a direct API for this without installing,
134
- // but we can check the npm registry API
135
- return false; // Default to false for now
136
- }
137
- catch (error) {
138
- return false; // package doesn't exist or registry unreachable
139
- }
140
- }
141
- /**
142
- * Get severity color for terminal output
143
- */
144
- getSeveritySymbol(severity) {
145
- switch (severity) {
146
- case 'critical':
147
- return '🔴';
148
- case 'high':
149
- return '🟠';
150
- case 'moderate':
151
- return '🟡';
152
- case 'low':
153
- return 'đŸ”ĩ';
154
- default:
155
- return 'â„šī¸';
156
- }
157
- }
158
- /**
159
- * Format audit result for display
160
- */
161
- formatAuditResult(result) {
162
- if (result.totalVulnerabilities === 0) {
163
- return `✅ ${result.mcpName}: No vulnerabilities found`;
164
- }
165
- let output = `âš ī¸ ${result.mcpName}: ${result.totalVulnerabilities} vulnerabilities found\n`;
166
- if (result.criticalCount > 0) {
167
- output += ` 🔴 Critical: ${result.criticalCount}\n`;
168
- }
169
- if (result.highCount > 0) {
170
- output += ` 🟠 High: ${result.highCount}\n`;
171
- }
172
- if (result.moderateCount > 0) {
173
- output += ` 🟡 Moderate: ${result.moderateCount}\n`;
174
- }
175
- if (result.lowCount > 0) {
176
- output += ` đŸ”ĩ Low: ${result.lowCount}\n`;
177
- }
178
- return output;
179
- }
180
- }
181
- //# sourceMappingURL=security-scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-scanner.js","sourceRoot":"","sources":["../src/security-scanner.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Performance monitoring utilities
3
- * Provides timing, metrics collection, and performance insights
4
- */
5
- import { Logger } from './logger.js';
6
- export interface TimingMetric {
7
- name: string;
8
- startTime: number;
9
- duration?: number;
10
- metadata?: Record<string, unknown>;
11
- }
12
- export declare class PerformanceMonitor {
13
- private timings;
14
- private logger?;
15
- constructor(logger?: Logger);
16
- /**
17
- * Start timing an operation
18
- */
19
- start(name: string, metadata?: Record<string, unknown>): void;
20
- /**
21
- * End timing an operation and return duration
22
- */
23
- end(name: string): number | undefined;
24
- /**
25
- * Measure a synchronous function
26
- */
27
- measure<T>(name: string, fn: () => T, metadata?: Record<string, unknown>): T;
28
- /**
29
- * Measure an async function
30
- */
31
- measureAsync<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T>;
32
- /**
33
- * Get all timings
34
- */
35
- getTimings(): TimingMetric[];
36
- /**
37
- * Get summary statistics
38
- */
39
- getSummary(): {
40
- total: number;
41
- count: number;
42
- average: number;
43
- slowest: TimingMetric | undefined;
44
- };
45
- /**
46
- * Clear all timings
47
- */
48
- clear(): void;
49
- }
50
- /**
51
- * Simple memoization decorator for functions
52
- */
53
- export declare function memoize<T extends (...args: never[]) => unknown>(fn: T, options?: {
54
- ttl?: number;
55
- maxSize?: number;
56
- }): T;
57
- /**
58
- * Debounce a function
59
- */
60
- export declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delayMs: number): (...args: Parameters<T>) => void;
61
- /**
62
- * Throttle a function
63
- */
64
- export declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, delayMs: number): (...args: Parameters<T>) => void;
65
- //# sourceMappingURL=performance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../src/shared/performance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAI3B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQ7D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAerC;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;IAU5E;;OAEG;IACG,YAAY,CAAC,CAAC,EAClB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC;IAUb;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,UAAU,IAAI;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;KACnC;IAaD;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAC7D,EAAE,EAAE,CAAC,EACL,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,CAAC,CAyBH;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,OAAO,EAAE,MAAM,GACd,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAWlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,OAAO,EAAE,MAAM,GACd,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAUlC"}