fraim-hub 2.0.204

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 (120) hide show
  1. package/README.md +467 -0
  2. package/bin/fraim-hub.js +17 -0
  3. package/dist/src/ai-hub/brand-store.js +17 -0
  4. package/dist/src/ai-hub/catalog.js +412 -0
  5. package/dist/src/ai-hub/cert-store.js +70 -0
  6. package/dist/src/ai-hub/cli.js +212 -0
  7. package/dist/src/ai-hub/configured-agents.js +283 -0
  8. package/dist/src/ai-hub/conversation-store.js +428 -0
  9. package/dist/src/ai-hub/desktop-main.js +449 -0
  10. package/dist/src/ai-hub/hosts.js +1669 -0
  11. package/dist/src/ai-hub/hub-latest-version.js +52 -0
  12. package/dist/src/ai-hub/hub-launch-decision.js +57 -0
  13. package/dist/src/ai-hub/hub-runtime-file.js +43 -0
  14. package/dist/src/ai-hub/managed-browser.js +269 -0
  15. package/dist/src/ai-hub/manager-turns.js +64 -0
  16. package/dist/src/ai-hub/office-sideload.js +156 -0
  17. package/dist/src/ai-hub/openclaw-bridge.js +250 -0
  18. package/dist/src/ai-hub/preferences.js +201 -0
  19. package/dist/src/ai-hub/remote-hub-gateway.js +88 -0
  20. package/dist/src/ai-hub/server.js +4013 -0
  21. package/dist/src/ai-hub/types.js +2 -0
  22. package/dist/src/ai-hub/url-safety.js +19 -0
  23. package/dist/src/api/admin/payments.js +33 -0
  24. package/dist/src/api/admin/sales-leads.js +21 -0
  25. package/dist/src/api/payment/create-session.js +338 -0
  26. package/dist/src/api/payment/dashboard-link.js +149 -0
  27. package/dist/src/api/payment/session-details.js +31 -0
  28. package/dist/src/api/payment/webhook.js +587 -0
  29. package/dist/src/api/sales/contact.js +44 -0
  30. package/dist/src/cli/api/get-provider-client.js +41 -0
  31. package/dist/src/cli/api/provider-client.js +107 -0
  32. package/dist/src/cli/commands/add-ide.js +462 -0
  33. package/dist/src/cli/fraim-hub.js +50 -0
  34. package/dist/src/cli/internal/device-flow-service.js +83 -0
  35. package/dist/src/cli/mcp/command-resolution.js +81 -0
  36. package/dist/src/cli/mcp/fraim-mcp-latest-launcher.js +136 -0
  37. package/dist/src/cli/mcp/ide-formats.js +317 -0
  38. package/dist/src/cli/mcp/mcp-server-builder.js +48 -0
  39. package/dist/src/cli/mcp/mcp-server-registry.js +173 -0
  40. package/dist/src/cli/providers/local-provider-registry.js +165 -0
  41. package/dist/src/cli/providers/provider-registry.js +230 -0
  42. package/dist/src/cli/setup/claude-code-telemetry.js +59 -0
  43. package/dist/src/cli/setup/codex-local-config.js +37 -0
  44. package/dist/src/cli/setup/ide-detector.js +383 -0
  45. package/dist/src/cli/setup/ide-global-integration.js +100 -0
  46. package/dist/src/cli/setup/ide-invocation-surfaces.js +160 -0
  47. package/dist/src/cli/setup/mcp-config-generator.js +225 -0
  48. package/dist/src/cli/setup/provider-prompts.js +339 -0
  49. package/dist/src/cli/utils/managed-agent-paths.js +118 -0
  50. package/dist/src/cli/utils/script-sync-utils.js +221 -0
  51. package/dist/src/cli/utils/user-config.js +100 -0
  52. package/dist/src/cli/utils/version-utils.js +35 -0
  53. package/dist/src/config/ai-manager-hiring.js +121 -0
  54. package/dist/src/config/feature-flags.js +25 -0
  55. package/dist/src/config/persona-capability-bundles.js +277 -0
  56. package/dist/src/config/persona-hiring.js +270 -0
  57. package/dist/src/config/portfolio-slug-overrides.js +17 -0
  58. package/dist/src/config/pricing.js +37 -0
  59. package/dist/src/config/stripe.js +43 -0
  60. package/dist/src/core/brand-store.js +232 -0
  61. package/dist/src/core/quality-evidence.js +331 -0
  62. package/dist/src/core/utils/git-utils.js +194 -0
  63. package/dist/src/core/utils/ports.js +32 -0
  64. package/dist/src/core/utils/project-fraim-paths.js +220 -0
  65. package/dist/src/db/payment-repository.js +61 -0
  66. package/dist/src/first-run/types.js +93 -0
  67. package/dist/src/fraim/db-service.js +2409 -0
  68. package/dist/src/local-mcp-server/agent-token-prices.js +167 -0
  69. package/dist/src/local-mcp-server/learning-context-builder.js +975 -0
  70. package/dist/src/middleware/rate-limit.js +110 -0
  71. package/dist/src/models/payment.js +2 -0
  72. package/dist/src/routes/payment-routes.js +186 -0
  73. package/dist/src/routes/persona-catalog-routes.js +84 -0
  74. package/dist/src/services/dashboard-access.js +27 -0
  75. package/dist/src/services/email-service.js +951 -0
  76. package/dist/src/services/persona-entitlement-service.js +352 -0
  77. package/dist/src/services/workspace-identity.js +21 -0
  78. package/dist/src/types/analytics.js +2 -0
  79. package/dist/src/utils/payment-calculator.js +52 -0
  80. package/extensions/office-word/favicon.ico +0 -0
  81. package/extensions/office-word/icon-64.png +0 -0
  82. package/extensions/office-word/manifest.xml +33 -0
  83. package/extensions/office-word/taskpane.html +242 -0
  84. package/index.js +85 -0
  85. package/package.json +106 -0
  86. package/public/ai-hub/index.html +910 -0
  87. package/public/ai-hub/powerpoint-taskpane/icon-64.png +0 -0
  88. package/public/ai-hub/powerpoint-taskpane/index.html +236 -0
  89. package/public/ai-hub/powerpoint-taskpane/manifest.xml +30 -0
  90. package/public/ai-hub/review.css +444 -0
  91. package/public/ai-hub/script.js +11737 -0
  92. package/public/ai-hub/styles.css +5102 -0
  93. package/public/first-run/error-frame.js +100 -0
  94. package/public/first-run/index.html +35 -0
  95. package/public/first-run/script.js +739 -0
  96. package/public/first-run/styles.css +929 -0
  97. package/public/portfolio/ashley.html +523 -0
  98. package/public/portfolio/auditya.html +83 -0
  99. package/public/portfolio/banke.html +83 -0
  100. package/public/portfolio/beza.html +659 -0
  101. package/public/portfolio/careena.html +632 -0
  102. package/public/portfolio/casey.html +568 -0
  103. package/public/portfolio/celia.html +490 -0
  104. package/public/portfolio/deidre.html +642 -0
  105. package/public/portfolio/gautam.html +597 -0
  106. package/public/portfolio/hari.html +469 -0
  107. package/public/portfolio/huxley.html +1354 -0
  108. package/public/portfolio/index.html +741 -0
  109. package/public/portfolio/maestro.html +518 -0
  110. package/public/portfolio/mandy.html +590 -0
  111. package/public/portfolio/mona.html +597 -0
  112. package/public/portfolio/pam.html +887 -0
  113. package/public/portfolio/procella.html +107 -0
  114. package/public/portfolio/qasm.html +569 -0
  115. package/public/portfolio/ricardo.html +489 -0
  116. package/public/portfolio/sade.html +560 -0
  117. package/public/portfolio/sam.html +654 -0
  118. package/public/portfolio/sechar.html +580 -0
  119. package/public/portfolio/sreya.html +599 -0
  120. package/public/portfolio/swen.html +601 -0
@@ -0,0 +1,242 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>FRAIM Hub</title>
7
+ <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>
8
+ <script src="config.js" type="text/javascript"></script>
9
+ <style>
10
+ * { margin: 0; padding: 0; box-sizing: border-box; }
11
+ html, body { height: 100%; overflow: hidden; }
12
+ iframe { width: 100%; height: 100vh; border: none; display: block; }
13
+ </style>
14
+ </head>
15
+ <body>
16
+ <iframe id="hub" src="" allow="clipboard-read; clipboard-write"></iframe>
17
+ <script>
18
+ // In Word Online the taskpane is served over HTTPS (ssl-proxy at localhost:43092).
19
+ // Loading an HTTP iframe from an HTTPS page is mixed-content-blocked, so use the
20
+ // same origin as the taskpane when running over HTTPS (the ssl-proxy forwards all
21
+ // routes to the Hub). HTTP (isolated tests) keeps the direct Hub address.
22
+ var HUB_ORIGIN = window.location.protocol === 'https:'
23
+ ? window.location.origin
24
+ : (window.FRAIM_HUB_ORIGIN || 'http://127.0.0.1:43091');
25
+ var hubFrame = document.getElementById('hub');
26
+ var pendingPush = null; // context queued before hub-ready fires
27
+ var hubReady = false;
28
+ var selectionHandlerAdded = false;
29
+
30
+ // ── postMessage bridge (inbound from Hub) ─────────────────────────────────
31
+ window.addEventListener('message', function(event) {
32
+ if (event.origin !== HUB_ORIGIN) return;
33
+ var msg = event.data || {};
34
+ if (msg.type === 'hub-ready') {
35
+ hubReady = true;
36
+ if (pendingPush) { pushToHub(pendingPush); pendingPush = null; }
37
+ } else if (msg.type === 'word-request') {
38
+ handleWordRequest(msg.action, msg.requestId, msg.payload || {});
39
+ }
40
+ });
41
+
42
+ function pushToHub(msg) {
43
+ if (hubFrame && hubFrame.contentWindow) {
44
+ hubFrame.contentWindow.postMessage(msg, HUB_ORIGIN);
45
+ }
46
+ }
47
+
48
+ // ── Reading Word context ───────────────────────────────────────────────────
49
+ function docMeta() {
50
+ var meta = { docUrl: '', docTitle: '' };
51
+ try {
52
+ var doc = window.Office && Office.context && Office.context.document;
53
+ meta.docUrl = (doc && doc.url) ? doc.url : '';
54
+ if (meta.docUrl) {
55
+ var parts = meta.docUrl.replace(/\\/g, '/').split('/');
56
+ meta.docTitle = (parts[parts.length - 1] || '').replace(/\.[^.]+$/, '');
57
+ }
58
+ } catch(e) {}
59
+ return meta;
60
+ }
61
+
62
+ function readSelectionAsync(cb) {
63
+ try {
64
+ Office.context.document.getSelectedDataAsync(
65
+ Office.CoercionType.Text,
66
+ { valueFormat: 'unformatted', filterType: 'onlySelected' },
67
+ function(r) { cb(r.status === Office.AsyncResultStatus.Succeeded ? String(r.value || '').trim() : ''); }
68
+ );
69
+ } catch(e) { cb(''); }
70
+ }
71
+
72
+ function readBodyAsync(cb) {
73
+ try {
74
+ Office.context.document.getSelectedDataAsync(
75
+ Office.CoercionType.Text,
76
+ { valueFormat: 'unformatted' },
77
+ function(r) { cb(r.status === Office.AsyncResultStatus.Succeeded ? String(r.value || '') : ''); }
78
+ );
79
+ } catch(e) { cb(''); }
80
+ }
81
+
82
+ function readCommentsAsync(cb) {
83
+ try {
84
+ if (typeof Word !== 'undefined' && Word.run) {
85
+ Word.run(function(ctx) {
86
+ var comments = ctx.document.body.getComments();
87
+ comments.load('items/id,items/authorName,items/content,items/resolved');
88
+ return ctx.sync().then(function() {
89
+ cb((comments.items || []).slice(0, 20).map(function(c) {
90
+ return { id: c.id || '', author: c.authorName || '', text: c.content || '', resolved: !!c.resolved };
91
+ }));
92
+ });
93
+ }).catch(function() { cb([]); });
94
+ } else { cb([]); }
95
+ } catch(e) { cb([]); }
96
+ }
97
+
98
+ function readFullContext(cb) {
99
+ var meta = docMeta();
100
+ readSelectionAsync(function(selection) {
101
+ readBodyAsync(function(body) {
102
+ readCommentsAsync(function(comments) {
103
+ cb({
104
+ docUrl: meta.docUrl,
105
+ docTitle: meta.docTitle,
106
+ selection: selection,
107
+ hasSelection: selection.length > 0,
108
+ bodyPreview: body.slice(0, 2000),
109
+ wordCount: body ? body.split(/\s+/).filter(Boolean).length : 0,
110
+ comments: comments,
111
+ });
112
+ });
113
+ });
114
+ });
115
+ }
116
+
117
+ // ── Selection-change handler ───────────────────────────────────────────────
118
+ function addSelectionHandler() {
119
+ if (selectionHandlerAdded) return;
120
+ try {
121
+ Office.context.document.addHandlerAsync(
122
+ Office.EventType.DocumentSelectionChanged,
123
+ function() {
124
+ readSelectionAsync(function(sel) {
125
+ var m = docMeta();
126
+ pushToHub({ type: 'word-context-update', payload: {
127
+ docUrl: m.docUrl, docTitle: m.docTitle,
128
+ selection: sel, hasSelection: sel.length > 0,
129
+ }});
130
+ });
131
+ },
132
+ function(r) { if (r.status === Office.AsyncResultStatus.Succeeded) selectionHandlerAdded = true; }
133
+ );
134
+ } catch(e) {}
135
+ }
136
+
137
+ // ── Handling requests from Hub ─────────────────────────────────────────────
138
+ function handleWordRequest(action, requestId, payload) {
139
+ function respond(result) {
140
+ pushToHub({ type: 'word-response', requestId: requestId, payload: result });
141
+ }
142
+ if (action === 'get-context') {
143
+ readFullContext(function(ctx) { respond(ctx); });
144
+ } else if (action === 'get-selection') {
145
+ readSelectionAsync(function(sel) { respond({ selection: sel, hasSelection: sel.length > 0 }); });
146
+ } else if (action === 'insert-text') {
147
+ // Replace current selection (or insert at cursor) with given text.
148
+ try {
149
+ Office.context.document.setSelectedDataAsync(
150
+ payload.text || '',
151
+ { coercionType: Office.CoercionType.Text },
152
+ function(r) { respond({ ok: r.status === Office.AsyncResultStatus.Succeeded }); }
153
+ );
154
+ } catch(e) { respond({ ok: false, error: e.message }); }
155
+ } else if (action === 'insert-after') {
156
+ // Insert text after the current selection using Word API.
157
+ try {
158
+ if (typeof Word !== 'undefined' && Word.run) {
159
+ Word.run(function(ctx) {
160
+ var sel = ctx.document.getSelection();
161
+ sel.insertText((payload.newline !== false ? '\n' : '') + (payload.text || ''), Word.InsertLocation.after);
162
+ return ctx.sync();
163
+ }).then(function() { respond({ ok: true }); }).catch(function(e) { respond({ ok: false, error: e.message }); });
164
+ } else { respond({ ok: false, error: 'Word API 1.1+ not available' }); }
165
+ } catch(e) { respond({ ok: false, error: e.message }); }
166
+ } else if (action === 'append-to-doc') {
167
+ // Append text at the very end of the document.
168
+ try {
169
+ if (typeof Word !== 'undefined' && Word.run) {
170
+ Word.run(function(ctx) {
171
+ ctx.document.body.insertText('\n' + (payload.text || ''), Word.InsertLocation.end);
172
+ return ctx.sync();
173
+ }).then(function() { respond({ ok: true }); }).catch(function(e) { respond({ ok: false, error: e.message }); });
174
+ } else { respond({ ok: false, error: 'Word API 1.1+ not available' }); }
175
+ } catch(e) { respond({ ok: false, error: e.message }); }
176
+ } else if (action === 'reply-to-comment') {
177
+ // Reply to a comment by ID.
178
+ try {
179
+ if (typeof Word !== 'undefined' && Word.run) {
180
+ Word.run(function(ctx) {
181
+ var comments = ctx.document.body.getComments();
182
+ comments.load('items/id');
183
+ return ctx.sync().then(function() {
184
+ var target = (comments.items || []).find(function(c) { return c.id === payload.commentId; });
185
+ if (!target) throw new Error('Comment not found: ' + payload.commentId);
186
+ target.reply(payload.text || '');
187
+ return ctx.sync();
188
+ });
189
+ }).then(function() { respond({ ok: true }); }).catch(function(e) { respond({ ok: false, error: e.message }); });
190
+ } else { respond({ ok: false, error: 'Word API not available' }); }
191
+ } catch(e) { respond({ ok: false, error: e.message }); }
192
+ } else if (action === 'track-changes-on') {
193
+ try {
194
+ if (typeof Word !== 'undefined' && Word.run) {
195
+ Word.run(function(ctx) {
196
+ ctx.document.changeTrackingMode = Word.ChangeTrackingMode.trackAll;
197
+ return ctx.sync();
198
+ }).then(function() { respond({ ok: true }); }).catch(function(e) { respond({ ok: false, error: e.message }); });
199
+ } else { respond({ ok: false, error: 'Word API not available' }); }
200
+ } catch(e) { respond({ ok: false, error: e.message }); }
201
+ } else if (action === 'track-changes-off') {
202
+ try {
203
+ if (typeof Word !== 'undefined' && Word.run) {
204
+ Word.run(function(ctx) {
205
+ ctx.document.changeTrackingMode = Word.ChangeTrackingMode.off;
206
+ return ctx.sync();
207
+ }).then(function() { respond({ ok: true }); }).catch(function(e) { respond({ ok: false, error: e.message }); });
208
+ } else { respond({ ok: false, error: 'Word API not available' }); }
209
+ } catch(e) { respond({ ok: false, error: e.message }); }
210
+ } else {
211
+ respond({ ok: false, error: 'Unknown action: ' + action });
212
+ }
213
+ }
214
+
215
+ // ── Mount ─────────────────────────────────────────────────────────────────
216
+ function mountHub() {
217
+ var meta = docMeta();
218
+ var params = new URLSearchParams({ surface: 'task-pane' });
219
+ if (meta.docUrl) params.set('docUrl', meta.docUrl);
220
+ if (meta.docTitle) params.set('docTitle', meta.docTitle);
221
+ hubFrame.src = HUB_ORIGIN + '/ai-hub/?' + params.toString();
222
+
223
+ hubFrame.addEventListener('load', function() {
224
+ // Push full context once Hub has registered its message listener.
225
+ setTimeout(function() {
226
+ readFullContext(function(ctx) {
227
+ var msg = { type: 'word-context', payload: ctx };
228
+ if (hubReady) { pushToHub(msg); } else { pendingPush = msg; }
229
+ });
230
+ }, 300);
231
+ addSelectionHandler();
232
+ });
233
+ }
234
+
235
+ if (typeof Office !== 'undefined') {
236
+ Office.onReady(function() { mountHub(); });
237
+ } else {
238
+ window.addEventListener('DOMContentLoaded', mountHub);
239
+ }
240
+ </script>
241
+ </body>
242
+ </html>
package/index.js ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * FRAIM Framework - Smart Entry Point
5
+ * This file handles both production (dist/) and development (src/) environments.
6
+ */
7
+
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+ const { spawnSync } = require('child_process');
11
+
12
+ /**
13
+ * Runs the CLI using either the compiled JS or the source TS via tsx
14
+ */
15
+ function runCLI() {
16
+ const distPath = path.join(__dirname, 'dist', 'src', 'cli', 'fraim.js');
17
+ const srcPath = path.join(__dirname, 'src', 'cli', 'fraim.ts');
18
+
19
+ // 1. Check if we have a compiled version (Production / CI)
20
+ if (fs.existsSync(distPath)) {
21
+ require(distPath);
22
+ return;
23
+ }
24
+
25
+ // 2. Explicitly fail in production if dist/ is missing
26
+ if (process.env.NODE_ENV === 'production') {
27
+ console.error('❌ FRAIM Error: Production build (dist/) not found.');
28
+ console.error('In production environments, you must run the compiled version.');
29
+ console.error(`Expected: ${distPath}`);
30
+ process.exit(1);
31
+ }
32
+
33
+ // 3. Fallback to source version using tsx (Development)
34
+ if (fs.existsSync(srcPath)) {
35
+ // We use spawnSync to run tsx so we don't have to require it in memory
36
+ // if it's not needed, and it handles the process arguments correctly.
37
+ //
38
+ // IMPORTANT FIX: Directory names with spaces and dashes (e.g., "FRAIM - Issue 166")
39
+ // cause argument parsing issues on Windows when shell: true is used.
40
+ // Without quoting, a path like "C:\...\FRAIM - Issue 166\src\cli\fraim.ts" gets
41
+ // split into multiple arguments, with the dash interpreted as a command flag,
42
+ // resulting in "error: unknown command '-'".
43
+ //
44
+ // Solution: On Windows with shell: true, quote paths containing spaces.
45
+ // On Unix with shell: false, pass the path unquoted (spawnSync handles it correctly).
46
+ const isWindows = process.platform === 'win32';
47
+
48
+ // On Windows with shell, quote paths with spaces to prevent shell misinterpretation
49
+ // On Unix without shell, pass path as-is (spawnSync handles spaces correctly)
50
+ const processedSrcPath = (isWindows && srcPath.includes(' '))
51
+ ? `"${srcPath}"`
52
+ : srcPath;
53
+
54
+ const result = spawnSync(
55
+ 'npx',
56
+ ['tsx', processedSrcPath, ...process.argv.slice(2)],
57
+ {
58
+ stdio: 'inherit',
59
+ shell: isWindows, // Windows needs shell for npx, Unix doesn't
60
+ windowsHide: true
61
+ }
62
+ );
63
+ process.exit(result.status || 0);
64
+ }
65
+
66
+ console.error('❌ FRAIM Error: Could not find CLI entry point.');
67
+ console.error('Expected one of:');
68
+ console.error(` - ${distPath}`);
69
+ console.error(` - ${srcPath}`);
70
+ process.exit(1);
71
+ }
72
+
73
+ // Global programmatic exports
74
+ module.exports = {
75
+ FRAIM_INFO: {
76
+ name: 'FRAIM',
77
+ version: '2.0.98',
78
+ repository: 'https://github.com/mathursrus/FRAIM'
79
+ }
80
+ };
81
+
82
+ // If this file is run directly (via npx or global link), run the CLI
83
+ if (require.main === module) {
84
+ runCLI();
85
+ }
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "fraim-hub",
3
+ "version": "2.0.204",
4
+ "description": "FRAIM Hub local companion package.",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "fraim-hub": "bin/fraim-hub.js"
8
+ },
9
+ "files": [
10
+ "dist/src/ai-hub/",
11
+ "dist/src/api/admin/payments.js",
12
+ "dist/src/api/admin/sales-leads.js",
13
+ "dist/src/api/payment/",
14
+ "dist/src/api/sales/contact.js",
15
+ "dist/src/cli/api/get-provider-client.js",
16
+ "dist/src/cli/api/provider-client.js",
17
+ "dist/src/cli/commands/add-ide.js",
18
+ "dist/src/cli/fraim-hub.js",
19
+ "dist/src/cli/internal/device-flow-service.js",
20
+ "dist/src/cli/mcp/command-resolution.js",
21
+ "dist/src/cli/mcp/fraim-mcp-latest-launcher.js",
22
+ "dist/src/cli/mcp/ide-formats.js",
23
+ "dist/src/cli/mcp/mcp-server-builder.js",
24
+ "dist/src/cli/mcp/mcp-server-registry.js",
25
+ "dist/src/cli/providers/local-provider-registry.js",
26
+ "dist/src/cli/providers/provider-registry.js",
27
+ "dist/src/cli/setup/claude-code-telemetry.js",
28
+ "dist/src/cli/setup/codex-local-config.js",
29
+ "dist/src/cli/setup/ide-detector.js",
30
+ "dist/src/cli/setup/ide-global-integration.js",
31
+ "dist/src/cli/setup/ide-invocation-surfaces.js",
32
+ "dist/src/cli/setup/mcp-config-generator.js",
33
+ "dist/src/cli/setup/provider-prompts.js",
34
+ "dist/src/cli/utils/managed-agent-paths.js",
35
+ "dist/src/cli/utils/script-sync-utils.js",
36
+ "dist/src/cli/utils/user-config.js",
37
+ "dist/src/cli/utils/version-utils.js",
38
+ "dist/src/config/ai-manager-hiring.js",
39
+ "dist/src/config/feature-flags.js",
40
+ "dist/src/config/persona-capability-bundles.js",
41
+ "dist/src/config/persona-hiring.js",
42
+ "dist/src/config/portfolio-slug-overrides.js",
43
+ "dist/src/config/pricing.js",
44
+ "dist/src/config/stripe.js",
45
+ "dist/src/core/brand-store.js",
46
+ "dist/src/core/quality-evidence.js",
47
+ "dist/src/core/utils/git-utils.js",
48
+ "dist/src/core/utils/ports.js",
49
+ "dist/src/core/utils/project-fraim-paths.js",
50
+ "dist/src/db/payment-repository.js",
51
+ "dist/src/fraim/db-service.js",
52
+ "dist/src/first-run/types.js",
53
+ "dist/src/local-mcp-server/agent-token-prices.js",
54
+ "dist/src/local-mcp-server/learning-context-builder.js",
55
+ "dist/src/middleware/rate-limit.js",
56
+ "dist/src/models/payment.js",
57
+ "dist/src/routes/payment-routes.js",
58
+ "dist/src/routes/persona-catalog-routes.js",
59
+ "dist/src/services/dashboard-access.js",
60
+ "dist/src/services/email-service.js",
61
+ "dist/src/services/persona-entitlement-service.js",
62
+ "dist/src/services/workspace-identity.js",
63
+ "dist/src/types/analytics.js",
64
+ "dist/src/utils/payment-calculator.js",
65
+ "bin/fraim-hub.js",
66
+ "extensions/office-word/",
67
+ "public/ai-hub/",
68
+ "public/first-run/",
69
+ "public/portfolio/",
70
+ "index.js",
71
+ "README.md",
72
+ "CHANGELOG.md",
73
+ "LICENSE",
74
+ "package.json"
75
+ ],
76
+ "publishConfig": {
77
+ "access": "public"
78
+ },
79
+ "engines": {
80
+ "node": ">=16.0.0"
81
+ },
82
+ "dependencies": {
83
+ "@octokit/rest": "^22.0.1",
84
+ "adm-zip": "^0.5.16",
85
+ "axios": "^1.7.0",
86
+ "chalk": "4.1.2",
87
+ "commander": "^14.0.2",
88
+ "cors": "^2.8.5",
89
+ "dotenv": "^16.4.7",
90
+ "electron": "^41.2.2",
91
+ "express": "^5.2.1",
92
+ "fraim": "2.0.204",
93
+ "mongodb": "^7.0.0",
94
+ "node-cron": "4.2.1",
95
+ "node-edge-tts": "^1.2.10",
96
+ "nodemailer": "^8.0.3",
97
+ "prompts": "^2.4.2",
98
+ "resend": "^6.9.3",
99
+ "selfsigned": "^5.5.0",
100
+ "semver": "^7.7.4",
101
+ "stripe": "^20.3.1",
102
+ "toml": "^3.0.0",
103
+ "tree-kill": "^1.2.2",
104
+ "xml2js": "^0.6.2"
105
+ }
106
+ }