@fias/plugin-dev-harness 1.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 (125) hide show
  1. package/dist/bridge/live-handler.d.ts +27 -0
  2. package/dist/bridge/live-handler.d.ts.map +1 -0
  3. package/dist/bridge/live-handler.js +47 -0
  4. package/dist/bridge/live-handler.js.map +1 -0
  5. package/dist/bridge/live-handler.test.d.ts +2 -0
  6. package/dist/bridge/live-handler.test.d.ts.map +1 -0
  7. package/dist/bridge/live-handler.test.js +182 -0
  8. package/dist/bridge/live-handler.test.js.map +1 -0
  9. package/dist/bridge/mock-handler.d.ts +25 -0
  10. package/dist/bridge/mock-handler.d.ts.map +1 -0
  11. package/dist/bridge/mock-handler.js +81 -0
  12. package/dist/bridge/mock-handler.js.map +1 -0
  13. package/dist/bridge/mock-handler.test.d.ts +2 -0
  14. package/dist/bridge/mock-handler.test.d.ts.map +1 -0
  15. package/dist/bridge/mock-handler.test.js +322 -0
  16. package/dist/bridge/mock-handler.test.js.map +1 -0
  17. package/dist/bridge/types.d.ts +18 -0
  18. package/dist/bridge/types.d.ts.map +1 -0
  19. package/dist/bridge/types.js +8 -0
  20. package/dist/bridge/types.js.map +1 -0
  21. package/dist/cli/dev.d.ts +15 -0
  22. package/dist/cli/dev.d.ts.map +1 -0
  23. package/dist/cli/dev.js +64 -0
  24. package/dist/cli/dev.js.map +1 -0
  25. package/dist/cli/dev.test.d.ts +2 -0
  26. package/dist/cli/dev.test.d.ts.map +1 -0
  27. package/dist/cli/dev.test.js +114 -0
  28. package/dist/cli/dev.test.js.map +1 -0
  29. package/dist/cli/entities.d.ts +9 -0
  30. package/dist/cli/entities.d.ts.map +1 -0
  31. package/dist/cli/entities.js +71 -0
  32. package/dist/cli/entities.js.map +1 -0
  33. package/dist/cli/entities.test.d.ts +2 -0
  34. package/dist/cli/entities.test.d.ts.map +1 -0
  35. package/dist/cli/entities.test.js +179 -0
  36. package/dist/cli/entities.test.js.map +1 -0
  37. package/dist/cli/index.d.ts +9 -0
  38. package/dist/cli/index.d.ts.map +1 -0
  39. package/dist/cli/index.js +29 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/cli/index.test.d.ts +2 -0
  42. package/dist/cli/index.test.d.ts.map +1 -0
  43. package/dist/cli/index.test.js +55 -0
  44. package/dist/cli/index.test.js.map +1 -0
  45. package/dist/cli/login.d.ts +9 -0
  46. package/dist/cli/login.d.ts.map +1 -0
  47. package/dist/cli/login.js +80 -0
  48. package/dist/cli/login.js.map +1 -0
  49. package/dist/cli/login.test.d.ts +2 -0
  50. package/dist/cli/login.test.d.ts.map +1 -0
  51. package/dist/cli/login.test.js +53 -0
  52. package/dist/cli/login.test.js.map +1 -0
  53. package/dist/cli/submit.d.ts +9 -0
  54. package/dist/cli/submit.d.ts.map +1 -0
  55. package/dist/cli/submit.js +250 -0
  56. package/dist/cli/submit.js.map +1 -0
  57. package/dist/cli/submit.test.d.ts +2 -0
  58. package/dist/cli/submit.test.d.ts.map +1 -0
  59. package/dist/cli/submit.test.js +381 -0
  60. package/dist/cli/submit.test.js.map +1 -0
  61. package/dist/cli/validate.d.ts +9 -0
  62. package/dist/cli/validate.d.ts.map +1 -0
  63. package/dist/cli/validate.js +154 -0
  64. package/dist/cli/validate.js.map +1 -0
  65. package/dist/cli/validate.test.d.ts +2 -0
  66. package/dist/cli/validate.test.d.ts.map +1 -0
  67. package/dist/cli/validate.test.js +275 -0
  68. package/dist/cli/validate.test.js.map +1 -0
  69. package/dist/config/config-loader.d.ts +25 -0
  70. package/dist/config/config-loader.d.ts.map +1 -0
  71. package/dist/config/config-loader.js +78 -0
  72. package/dist/config/config-loader.js.map +1 -0
  73. package/dist/config/config-loader.test.d.ts +2 -0
  74. package/dist/config/config-loader.test.d.ts.map +1 -0
  75. package/dist/config/config-loader.test.js +163 -0
  76. package/dist/config/config-loader.test.js.map +1 -0
  77. package/dist/config/credentials.d.ts +11 -0
  78. package/dist/config/credentials.d.ts.map +1 -0
  79. package/dist/config/credentials.js +71 -0
  80. package/dist/config/credentials.js.map +1 -0
  81. package/dist/config/credentials.test.d.ts +2 -0
  82. package/dist/config/credentials.test.d.ts.map +1 -0
  83. package/dist/config/credentials.test.js +115 -0
  84. package/dist/config/credentials.test.js.map +1 -0
  85. package/dist/index.d.ts +9 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +12 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/mocks/entity-responses.d.ts +15 -0
  90. package/dist/mocks/entity-responses.d.ts.map +1 -0
  91. package/dist/mocks/entity-responses.js +21 -0
  92. package/dist/mocks/entity-responses.js.map +1 -0
  93. package/dist/mocks/entity-responses.test.d.ts +2 -0
  94. package/dist/mocks/entity-responses.test.d.ts.map +1 -0
  95. package/dist/mocks/entity-responses.test.js +53 -0
  96. package/dist/mocks/entity-responses.test.js.map +1 -0
  97. package/dist/mocks/theme.d.ts +22 -0
  98. package/dist/mocks/theme.d.ts.map +1 -0
  99. package/dist/mocks/theme.js +37 -0
  100. package/dist/mocks/theme.js.map +1 -0
  101. package/dist/mocks/theme.test.d.ts +2 -0
  102. package/dist/mocks/theme.test.d.ts.map +1 -0
  103. package/dist/mocks/theme.test.js +66 -0
  104. package/dist/mocks/theme.test.js.map +1 -0
  105. package/dist/mocks/user.d.ts +12 -0
  106. package/dist/mocks/user.d.ts.map +1 -0
  107. package/dist/mocks/user.js +14 -0
  108. package/dist/mocks/user.js.map +1 -0
  109. package/dist/mocks/user.test.d.ts +2 -0
  110. package/dist/mocks/user.test.d.ts.map +1 -0
  111. package/dist/mocks/user.test.js +23 -0
  112. package/dist/mocks/user.test.js.map +1 -0
  113. package/dist/server/harness-server.d.ts +24 -0
  114. package/dist/server/harness-server.d.ts.map +1 -0
  115. package/dist/server/harness-server.js +433 -0
  116. package/dist/server/harness-server.js.map +1 -0
  117. package/dist/server/harness-server.test.d.ts +2 -0
  118. package/dist/server/harness-server.test.d.ts.map +1 -0
  119. package/dist/server/harness-server.test.js +178 -0
  120. package/dist/server/harness-server.test.js.map +1 -0
  121. package/dist/server/static/harness.css +160 -0
  122. package/dist/server/static/harness.html +35 -0
  123. package/dist/server/static/harness.js +345 -0
  124. package/package.json +43 -0
  125. package/templates/fias-dev.config.json +12 -0
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const theme_1 = require("./theme");
4
+ describe('mocks/theme', () => {
5
+ describe('DARK_THEME', () => {
6
+ it('has mode set to dark', () => {
7
+ expect(theme_1.DARK_THEME.mode).toBe('dark');
8
+ });
9
+ it('has all required color properties', () => {
10
+ const expectedKeys = [
11
+ 'background',
12
+ 'foreground',
13
+ 'primary',
14
+ 'secondary',
15
+ 'accent',
16
+ 'muted',
17
+ 'border',
18
+ ];
19
+ for (const key of expectedKeys) {
20
+ expect(theme_1.DARK_THEME.colors).toHaveProperty(key);
21
+ expect(typeof theme_1.DARK_THEME.colors[key]).toBe('string');
22
+ expect(theme_1.DARK_THEME.colors[key].length).toBeGreaterThan(0);
23
+ }
24
+ });
25
+ });
26
+ describe('LIGHT_THEME', () => {
27
+ it('has mode set to light', () => {
28
+ expect(theme_1.LIGHT_THEME.mode).toBe('light');
29
+ });
30
+ it('has all required color properties', () => {
31
+ const expectedKeys = [
32
+ 'background',
33
+ 'foreground',
34
+ 'primary',
35
+ 'secondary',
36
+ 'accent',
37
+ 'muted',
38
+ 'border',
39
+ ];
40
+ for (const key of expectedKeys) {
41
+ expect(theme_1.LIGHT_THEME.colors).toHaveProperty(key);
42
+ expect(typeof theme_1.LIGHT_THEME.colors[key]).toBe('string');
43
+ expect(theme_1.LIGHT_THEME.colors[key].length).toBeGreaterThan(0);
44
+ }
45
+ });
46
+ });
47
+ describe('getTheme()', () => {
48
+ it('returns dark theme when mode is dark', () => {
49
+ const theme = (0, theme_1.getTheme)('dark');
50
+ expect(theme).toEqual(theme_1.DARK_THEME);
51
+ expect(theme.mode).toBe('dark');
52
+ });
53
+ it('returns light theme when mode is light', () => {
54
+ const theme = (0, theme_1.getTheme)('light');
55
+ expect(theme).toEqual(theme_1.LIGHT_THEME);
56
+ expect(theme.mode).toBe('light');
57
+ });
58
+ it('returns different themes for different modes', () => {
59
+ const dark = (0, theme_1.getTheme)('dark');
60
+ const light = (0, theme_1.getTheme)('light');
61
+ expect(dark.colors.background).not.toBe(light.colors.background);
62
+ expect(dark.colors.foreground).not.toBe(light.colors.foreground);
63
+ });
64
+ });
65
+ });
66
+ //# sourceMappingURL=theme.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.test.js","sourceRoot":"","sources":["../../src/mocks/theme.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Default Mock User
3
+ *
4
+ * Mock user data for development mode.
5
+ */
6
+ export interface MockUser {
7
+ userId: string;
8
+ displayName: string;
9
+ avatar: string | null;
10
+ }
11
+ export declare const DEFAULT_MOCK_USER: MockUser;
12
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/mocks/user.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAI/B,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Default Mock User
4
+ *
5
+ * Mock user data for development mode.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_MOCK_USER = void 0;
9
+ exports.DEFAULT_MOCK_USER = {
10
+ userId: 'dev_user_001',
11
+ displayName: 'Dev User',
12
+ avatar: null,
13
+ };
14
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/mocks/user.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAQU,QAAA,iBAAiB,GAAa;IACzC,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE,UAAU;IACvB,MAAM,EAAE,IAAI;CACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=user.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.test.d.ts","sourceRoot":"","sources":["../../src/mocks/user.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const user_1 = require("./user");
4
+ describe('mocks/user', () => {
5
+ describe('DEFAULT_MOCK_USER', () => {
6
+ it('has expected userId', () => {
7
+ expect(user_1.DEFAULT_MOCK_USER.userId).toBe('dev_user_001');
8
+ });
9
+ it('has expected displayName', () => {
10
+ expect(user_1.DEFAULT_MOCK_USER.displayName).toBe('Dev User');
11
+ });
12
+ it('has null avatar', () => {
13
+ expect(user_1.DEFAULT_MOCK_USER.avatar).toBeNull();
14
+ });
15
+ it('conforms to MockUser interface', () => {
16
+ const user = user_1.DEFAULT_MOCK_USER;
17
+ expect(user).toHaveProperty('userId');
18
+ expect(user).toHaveProperty('displayName');
19
+ expect(user).toHaveProperty('avatar');
20
+ });
21
+ });
22
+ });
23
+ //# sourceMappingURL=user.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.test.js","sourceRoot":"","sources":["../../src/mocks/user.test.ts"],"names":[],"mappings":";;AAAA,iCAA2C;AAG3C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,wBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,wBAAiB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,wBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,IAAI,GAAa,wBAAiB,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Harness Server
3
+ *
4
+ * Express server that serves the harness host page and handles
5
+ * bridge API calls from the harness JavaScript.
6
+ */
7
+ import type { MockEntityConfig } from '../config/config-loader';
8
+ export interface HarnessServerOptions {
9
+ port: number;
10
+ pluginUrl: string;
11
+ isLive: boolean;
12
+ apiKey: string;
13
+ apiUrl: string;
14
+ permissions: string[];
15
+ mockUser: {
16
+ userId: string;
17
+ displayName: string;
18
+ avatar: string | null;
19
+ };
20
+ mockTheme: 'light' | 'dark';
21
+ mockEntities?: Record<string, MockEntityConfig>;
22
+ }
23
+ export declare function startHarnessServer(options: HarnessServerOptions): Promise<void>;
24
+ //# sourceMappingURL=harness-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-server.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACjD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGrF"}
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ /**
3
+ * Harness Server
4
+ *
5
+ * Express server that serves the harness host page and handles
6
+ * bridge API calls from the harness JavaScript.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.startHarnessServer = startHarnessServer;
46
+ const express_1 = __importDefault(require("express"));
47
+ const path = __importStar(require("path"));
48
+ const fs = __importStar(require("fs"));
49
+ const chalk_1 = __importDefault(require("chalk"));
50
+ const mock_handler_1 = require("../bridge/mock-handler");
51
+ const live_handler_1 = require("../bridge/live-handler");
52
+ async function startHarnessServer(options) {
53
+ const app = (0, express_1.default)();
54
+ app.use(express_1.default.json());
55
+ // Create appropriate bridge handler
56
+ const handler = options.isLive
57
+ ? new live_handler_1.LiveBridgeHandler({
58
+ apiKey: options.apiKey,
59
+ apiUrl: options.apiUrl,
60
+ permissions: options.permissions,
61
+ mockUser: options.mockUser,
62
+ mockTheme: options.mockTheme,
63
+ })
64
+ : new mock_handler_1.MockBridgeHandler({
65
+ mockUser: options.mockUser,
66
+ mockTheme: options.mockTheme,
67
+ mockEntities: options.mockEntities,
68
+ });
69
+ // Bridge API endpoint — called by harness.js
70
+ app.post('/api/bridge', async (req, res) => {
71
+ try {
72
+ const result = await handler.handle(req.body);
73
+ res.json(result);
74
+ }
75
+ catch (err) {
76
+ res.status(400).json({
77
+ error: err instanceof Error ? err.message : 'Bridge call failed',
78
+ });
79
+ }
80
+ });
81
+ // Credit balance endpoint (live mode only)
82
+ app.get('/api/credits', async (_req, res) => {
83
+ if (!options.isLive) {
84
+ res.json({ balance: Infinity, lifetimeUsed: 0, lifetimeGranted: 0 });
85
+ return;
86
+ }
87
+ try {
88
+ const response = await fetch(`${options.apiUrl}/developer/credits`, {
89
+ headers: { Authorization: `Bearer ${options.apiKey}` },
90
+ });
91
+ if (!response.ok) {
92
+ res.status(response.status).json({ error: 'Failed to fetch credits' });
93
+ return;
94
+ }
95
+ res.json(await response.json());
96
+ }
97
+ catch (err) {
98
+ res
99
+ .status(500)
100
+ .json({ error: err instanceof Error ? err.message : 'Failed to fetch credits' });
101
+ }
102
+ });
103
+ // Harness config endpoint — provides config to the frontend
104
+ app.get('/api/config', (_req, res) => {
105
+ res.json({
106
+ pluginUrl: options.pluginUrl,
107
+ isLive: options.isLive,
108
+ permissions: options.permissions,
109
+ mockTheme: options.mockTheme,
110
+ });
111
+ });
112
+ // Serve static harness files
113
+ const staticDir = path.join(__dirname, 'static');
114
+ // In development (ts-node) vs built (dist), static may be in different locations
115
+ const possibleStaticDirs = [
116
+ staticDir,
117
+ path.join(__dirname, '..', 'server', 'static'),
118
+ path.join(__dirname, '..', 'src', 'server', 'static'),
119
+ ];
120
+ let resolvedStaticDir = staticDir;
121
+ for (const dir of possibleStaticDirs) {
122
+ if (fs.existsSync(dir)) {
123
+ resolvedStaticDir = dir;
124
+ break;
125
+ }
126
+ }
127
+ app.use('/static', express_1.default.static(resolvedStaticDir));
128
+ // Serve harness HTML at root
129
+ app.get('/', (_req, res) => {
130
+ const htmlPath = path.join(resolvedStaticDir, 'harness.html');
131
+ if (fs.existsSync(htmlPath)) {
132
+ res.sendFile(htmlPath);
133
+ }
134
+ else {
135
+ res.send(generateFallbackHtml(options));
136
+ }
137
+ });
138
+ return new Promise((resolve) => {
139
+ app.listen(options.port, () => {
140
+ console.log(chalk_1.default.green(` Harness server running at http://localhost:${options.port}\n`));
141
+ console.log(chalk_1.default.dim(' Press Ctrl+C to stop\n'));
142
+ resolve();
143
+ });
144
+ });
145
+ }
146
+ /**
147
+ * Fallback HTML when static files haven't been copied to dist.
148
+ * This enables the harness to work during development.
149
+ */
150
+ function generateFallbackHtml(options) {
151
+ return `<!DOCTYPE html>
152
+ <html lang="en">
153
+ <head>
154
+ <meta charset="UTF-8" />
155
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
156
+ <title>FIAS Dev Harness</title>
157
+ <style>${EMBEDDED_CSS}</style>
158
+ </head>
159
+ <body>
160
+ <div class="toolbar">
161
+ <div class="toolbar-left">
162
+ <span class="logo">FIAS Dev Harness</span>
163
+ <span class="mode-badge ${options.isLive ? 'mode-live' : 'mode-mock'}">
164
+ ${options.isLive ? 'LIVE' : 'MOCK'}
165
+ </span>
166
+ <div class="permissions">
167
+ ${options.permissions.map((p) => `<span class="perm-badge">${p}</span>`).join('')}
168
+ </div>
169
+ </div>
170
+ <div class="toolbar-right">
171
+ <span id="credit-balance" class="credit-balance" style="display: ${options.isLive ? 'inline' : 'none'}"></span>
172
+ <button id="theme-toggle" class="btn-icon" title="Toggle theme">☀/☾</button>
173
+ <button id="reload-btn" class="btn-icon" title="Reload plugin">↻</button>
174
+ </div>
175
+ </div>
176
+ <iframe
177
+ id="plugin-iframe"
178
+ src="${options.pluginUrl}"
179
+ sandbox="allow-scripts allow-forms"
180
+ ></iframe>
181
+ <div id="console-panel" class="console-panel">
182
+ <div class="console-header" id="console-toggle">
183
+ <span>Dev Console</span>
184
+ <span id="console-count">0 messages</span>
185
+ </div>
186
+ <div class="console-body" id="console-body"></div>
187
+ </div>
188
+ <script>${EMBEDDED_JS}</script>
189
+ </body>
190
+ </html>`;
191
+ }
192
+ const EMBEDDED_CSS = `
193
+ * { margin: 0; padding: 0; box-sizing: border-box; }
194
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0a0a0f; color: #e4e4e7; display: flex; flex-direction: column; height: 100vh; }
195
+ .toolbar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: #18181b; border-bottom: 1px solid #3f3f46; flex-shrink: 0; }
196
+ .toolbar-left, .toolbar-right { display: flex; align-items: center; gap: 12px; }
197
+ .logo { font-weight: 600; font-size: 14px; color: #a78bfa; }
198
+ .mode-badge { padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; }
199
+ .mode-mock { background: #166534; color: #86efac; }
200
+ .mode-live { background: #854d0e; color: #fde047; }
201
+ .permissions { display: flex; gap: 4px; }
202
+ .perm-badge { padding: 2px 6px; border-radius: 3px; font-size: 10px; background: #27272a; color: #a1a1aa; }
203
+ .credit-balance { font-size: 12px; color: #fde047; }
204
+ .btn-icon { background: #27272a; border: 1px solid #3f3f46; color: #e4e4e7; padding: 4px 8px; border-radius: 4px; cursor: pointer; font-size: 14px; }
205
+ .btn-icon:hover { background: #3f3f46; }
206
+ #plugin-iframe { flex: 1; border: none; width: 100%; }
207
+ .console-panel { flex-shrink: 0; border-top: 1px solid #3f3f46; background: #18181b; max-height: 250px; display: flex; flex-direction: column; }
208
+ .console-header { display: flex; justify-content: space-between; padding: 6px 16px; cursor: pointer; font-size: 12px; color: #a1a1aa; border-bottom: 1px solid #27272a; }
209
+ .console-body { overflow-y: auto; padding: 8px 16px; font-family: monospace; font-size: 11px; flex: 1; display: none; }
210
+ .console-body.open { display: block; }
211
+ .log-entry { padding: 2px 0; border-bottom: 1px solid #1e1e22; }
212
+ .log-info { color: #93c5fd; }
213
+ .log-warn { color: #fde047; }
214
+ .log-error { color: #fca5a5; }
215
+ .log-time { color: #6b7280; margin-right: 8px; }
216
+ .log-cost { color: #fbbf24; margin-left: 8px; }
217
+ `;
218
+ const EMBEDDED_JS = `
219
+ (function() {
220
+ const iframe = document.getElementById('plugin-iframe');
221
+ const consoleBody = document.getElementById('console-body');
222
+ const consoleCount = document.getElementById('console-count');
223
+ const consoleToggle = document.getElementById('console-toggle');
224
+ const creditBalance = document.getElementById('credit-balance');
225
+ const themeToggle = document.getElementById('theme-toggle');
226
+ const reloadBtn = document.getElementById('reload-btn');
227
+
228
+ let messageCount = 0;
229
+ let currentTheme = 'dark';
230
+
231
+ // Fetch config
232
+ fetch('/api/config')
233
+ .then(r => r.json())
234
+ .then(config => {
235
+ currentTheme = config.mockTheme || 'dark';
236
+ if (config.isLive) fetchCredits();
237
+ });
238
+
239
+ // Console toggle
240
+ consoleToggle.addEventListener('click', () => {
241
+ consoleBody.classList.toggle('open');
242
+ });
243
+
244
+ // Reload button
245
+ reloadBtn.addEventListener('click', () => {
246
+ iframe.src = iframe.src;
247
+ });
248
+
249
+ // Theme toggle
250
+ themeToggle.addEventListener('click', () => {
251
+ currentTheme = currentTheme === 'dark' ? 'light' : 'dark';
252
+ sendToPlugin({ type: 'theme_update', messageId: 'theme_' + Date.now(), payload: getTheme() });
253
+ });
254
+
255
+ function getTheme() {
256
+ if (currentTheme === 'light') {
257
+ return { mode: 'light', colors: { background: '#ffffff', foreground: '#18181b', primary: '#7c3aed', secondary: '#ede9fe', accent: '#8b5cf6', muted: '#f4f4f5', border: '#e4e4e7' }};
258
+ }
259
+ return { mode: 'dark', colors: { background: '#0a0a0f', foreground: '#e4e4e7', primary: '#6d28d9', secondary: '#1e1b4b', accent: '#8b5cf6', muted: '#27272a', border: '#3f3f46' }};
260
+ }
261
+
262
+ // Permission map (matches production PluginBridgeHost)
263
+ const PERMISSION_MAP = {
264
+ get_user: 'user:profile:read',
265
+ get_theme: 'theme:read',
266
+ entity_invoke: 'entities:invoke',
267
+ storage_read: 'storage:sandbox',
268
+ storage_write: 'storage:sandbox',
269
+ storage_list: 'storage:sandbox',
270
+ storage_delete: 'storage:sandbox',
271
+ };
272
+
273
+ // Rate limits (matches production PluginBridgeHost)
274
+ const RATE_LIMITS = {
275
+ entity_invoke: { maxPerMinute: 60 },
276
+ storage_write: { maxPerMinute: 120 },
277
+ storage_read: { maxPerMinute: 300 },
278
+ storage_list: { maxPerMinute: 60 },
279
+ storage_delete: { maxPerMinute: 60 },
280
+ };
281
+ const rateBuckets = {};
282
+
283
+ function checkRateLimit(type) {
284
+ const limit = RATE_LIMITS[type];
285
+ if (!limit) return;
286
+ const now = Date.now();
287
+ const bucket = rateBuckets[type];
288
+ if (!bucket || now - bucket.windowStart > 60000) {
289
+ rateBuckets[type] = { count: 1, windowStart: now };
290
+ return;
291
+ }
292
+ if (bucket.count >= limit.maxPerMinute) {
293
+ throw new Error('Rate limit exceeded for ' + type + ': max ' + limit.maxPerMinute + '/minute');
294
+ }
295
+ bucket.count++;
296
+ }
297
+
298
+ // Listen for plugin messages
299
+ window.addEventListener('message', async (event) => {
300
+ if (event.source !== iframe.contentWindow) return;
301
+
302
+ const data = event.data;
303
+ if (!data || typeof data !== 'object' || !data.type || !data.messageId) return;
304
+
305
+ logMessage('recv', data.type, data.payload);
306
+
307
+ // Fire-and-forget messages
308
+ if (data.type === 'ready') return;
309
+
310
+ if (data.type === 'resize') {
311
+ const height = data.payload && data.payload.height;
312
+ if (typeof height === 'number' && height > 0) {
313
+ iframe.style.height = height + 'px';
314
+ iframe.style.flex = 'none';
315
+ }
316
+ return;
317
+ }
318
+
319
+ if (data.type === 'toast') {
320
+ const msg = data.payload && data.payload.message;
321
+ if (typeof msg === 'string') {
322
+ logMessage('toast', msg, data.payload);
323
+ }
324
+ return;
325
+ }
326
+
327
+ if (data.type === 'navigate') {
328
+ const navPath = data.payload && data.payload.path;
329
+ if (typeof navPath === 'string') {
330
+ logMessage('nav', navPath);
331
+ }
332
+ return;
333
+ }
334
+
335
+ // Request/response messages
336
+ try {
337
+ // Check permissions
338
+ const requiredPerm = PERMISSION_MAP[data.type];
339
+ if (requiredPerm) {
340
+ const config = await fetch('/api/config').then(r => r.json());
341
+ if (!config.permissions.includes(requiredPerm)) {
342
+ throw new Error('Permission denied: ' + requiredPerm + ' not granted');
343
+ }
344
+ }
345
+
346
+ checkRateLimit(data.type);
347
+
348
+ const response = await fetch('/api/bridge', {
349
+ method: 'POST',
350
+ headers: { 'Content-Type': 'application/json' },
351
+ body: JSON.stringify({ type: data.type, payload: data.payload }),
352
+ });
353
+
354
+ if (!response.ok) {
355
+ const err = await response.json().catch(() => ({}));
356
+ throw new Error(err.error || 'Bridge call failed');
357
+ }
358
+
359
+ const result = await response.json();
360
+ logMessage('send', 'response', result);
361
+
362
+ // Show cost for entity invocations
363
+ if (data.type === 'entity_invoke' && result.metadata && result.metadata.cost > 0) {
364
+ logMessage('cost', 'Credits used: ' + result.metadata.cost.toFixed(4));
365
+ fetchCredits();
366
+ }
367
+
368
+ sendToPlugin({ type: 'response', messageId: data.messageId, payload: result });
369
+ } catch (err) {
370
+ logMessage('error', err.message);
371
+ sendToPlugin({ type: 'response', messageId: data.messageId, payload: null, error: err.message });
372
+ }
373
+ });
374
+
375
+ // Send init message when iframe loads
376
+ iframe.addEventListener('load', () => {
377
+ fetch('/api/config')
378
+ .then(r => r.json())
379
+ .then(config => {
380
+ sendToPlugin({
381
+ type: 'init',
382
+ messageId: 'init_0',
383
+ payload: {
384
+ archId: 'dev_harness',
385
+ permissions: config.permissions,
386
+ theme: getTheme(),
387
+ currentPath: '/',
388
+ },
389
+ });
390
+ logMessage('send', 'init');
391
+ });
392
+ });
393
+
394
+ function sendToPlugin(message) {
395
+ iframe.contentWindow && iframe.contentWindow.postMessage(message, '*');
396
+ }
397
+
398
+ function fetchCredits() {
399
+ fetch('/api/credits')
400
+ .then(r => r.json())
401
+ .then(data => {
402
+ if (data.balance !== undefined && data.balance !== Infinity) {
403
+ creditBalance.textContent = 'Credits: ' + data.balance.toFixed(2);
404
+ }
405
+ })
406
+ .catch(() => {});
407
+ }
408
+
409
+ function logMessage(direction, type, payload) {
410
+ messageCount++;
411
+ consoleCount.textContent = messageCount + ' messages';
412
+
413
+ const entry = document.createElement('div');
414
+ entry.className = 'log-entry';
415
+
416
+ const time = new Date().toLocaleTimeString();
417
+ let cls = 'log-info';
418
+ if (direction === 'error') cls = 'log-error';
419
+ if (direction === 'warn' || direction === 'cost') cls = 'log-warn';
420
+
421
+ let text = '<span class="log-time">' + time + '</span>';
422
+ text += '<span class="' + cls + '">[' + direction.toUpperCase() + '] ' + type + '</span>';
423
+ if (payload && typeof payload === 'object') {
424
+ text += ' <span style="color:#6b7280">' + JSON.stringify(payload).substring(0, 120) + '</span>';
425
+ }
426
+
427
+ entry.innerHTML = text;
428
+ consoleBody.appendChild(entry);
429
+ consoleBody.scrollTop = consoleBody.scrollHeight;
430
+ }
431
+ })();
432
+ `;
433
+ //# sourceMappingURL=harness-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-server.js","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=harness-server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-server.test.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.test.ts"],"names":[],"mappings":""}