@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.
- package/dist/bridge/live-handler.d.ts +27 -0
- package/dist/bridge/live-handler.d.ts.map +1 -0
- package/dist/bridge/live-handler.js +47 -0
- package/dist/bridge/live-handler.js.map +1 -0
- package/dist/bridge/live-handler.test.d.ts +2 -0
- package/dist/bridge/live-handler.test.d.ts.map +1 -0
- package/dist/bridge/live-handler.test.js +182 -0
- package/dist/bridge/live-handler.test.js.map +1 -0
- package/dist/bridge/mock-handler.d.ts +25 -0
- package/dist/bridge/mock-handler.d.ts.map +1 -0
- package/dist/bridge/mock-handler.js +81 -0
- package/dist/bridge/mock-handler.js.map +1 -0
- package/dist/bridge/mock-handler.test.d.ts +2 -0
- package/dist/bridge/mock-handler.test.d.ts.map +1 -0
- package/dist/bridge/mock-handler.test.js +322 -0
- package/dist/bridge/mock-handler.test.js.map +1 -0
- package/dist/bridge/types.d.ts +18 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +8 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/cli/dev.d.ts +15 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +64 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/dev.test.d.ts +2 -0
- package/dist/cli/dev.test.d.ts.map +1 -0
- package/dist/cli/dev.test.js +114 -0
- package/dist/cli/dev.test.js.map +1 -0
- package/dist/cli/entities.d.ts +9 -0
- package/dist/cli/entities.d.ts.map +1 -0
- package/dist/cli/entities.js +71 -0
- package/dist/cli/entities.js.map +1 -0
- package/dist/cli/entities.test.d.ts +2 -0
- package/dist/cli/entities.test.d.ts.map +1 -0
- package/dist/cli/entities.test.js +179 -0
- package/dist/cli/entities.test.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.test.d.ts +2 -0
- package/dist/cli/index.test.d.ts.map +1 -0
- package/dist/cli/index.test.js +55 -0
- package/dist/cli/index.test.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +80 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/login.test.d.ts +2 -0
- package/dist/cli/login.test.d.ts.map +1 -0
- package/dist/cli/login.test.js +53 -0
- package/dist/cli/login.test.js.map +1 -0
- package/dist/cli/submit.d.ts +9 -0
- package/dist/cli/submit.d.ts.map +1 -0
- package/dist/cli/submit.js +250 -0
- package/dist/cli/submit.js.map +1 -0
- package/dist/cli/submit.test.d.ts +2 -0
- package/dist/cli/submit.test.d.ts.map +1 -0
- package/dist/cli/submit.test.js +381 -0
- package/dist/cli/submit.test.js.map +1 -0
- package/dist/cli/validate.d.ts +9 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +154 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/validate.test.d.ts +2 -0
- package/dist/cli/validate.test.d.ts.map +1 -0
- package/dist/cli/validate.test.js +275 -0
- package/dist/cli/validate.test.js.map +1 -0
- package/dist/config/config-loader.d.ts +25 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +78 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-loader.test.d.ts +2 -0
- package/dist/config/config-loader.test.d.ts.map +1 -0
- package/dist/config/config-loader.test.js +163 -0
- package/dist/config/config-loader.test.js.map +1 -0
- package/dist/config/credentials.d.ts +11 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +71 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/credentials.test.d.ts +2 -0
- package/dist/config/credentials.test.d.ts.map +1 -0
- package/dist/config/credentials.test.js +115 -0
- package/dist/config/credentials.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mocks/entity-responses.d.ts +15 -0
- package/dist/mocks/entity-responses.d.ts.map +1 -0
- package/dist/mocks/entity-responses.js +21 -0
- package/dist/mocks/entity-responses.js.map +1 -0
- package/dist/mocks/entity-responses.test.d.ts +2 -0
- package/dist/mocks/entity-responses.test.d.ts.map +1 -0
- package/dist/mocks/entity-responses.test.js +53 -0
- package/dist/mocks/entity-responses.test.js.map +1 -0
- package/dist/mocks/theme.d.ts +22 -0
- package/dist/mocks/theme.d.ts.map +1 -0
- package/dist/mocks/theme.js +37 -0
- package/dist/mocks/theme.js.map +1 -0
- package/dist/mocks/theme.test.d.ts +2 -0
- package/dist/mocks/theme.test.d.ts.map +1 -0
- package/dist/mocks/theme.test.js +66 -0
- package/dist/mocks/theme.test.js.map +1 -0
- package/dist/mocks/user.d.ts +12 -0
- package/dist/mocks/user.d.ts.map +1 -0
- package/dist/mocks/user.js +14 -0
- package/dist/mocks/user.js.map +1 -0
- package/dist/mocks/user.test.d.ts +2 -0
- package/dist/mocks/user.test.d.ts.map +1 -0
- package/dist/mocks/user.test.js +23 -0
- package/dist/mocks/user.test.js.map +1 -0
- package/dist/server/harness-server.d.ts +24 -0
- package/dist/server/harness-server.d.ts.map +1 -0
- package/dist/server/harness-server.js +433 -0
- package/dist/server/harness-server.js.map +1 -0
- package/dist/server/harness-server.test.d.ts +2 -0
- package/dist/server/harness-server.test.d.ts.map +1 -0
- package/dist/server/harness-server.test.js +178 -0
- package/dist/server/harness-server.test.js.map +1 -0
- package/dist/server/static/harness.css +160 -0
- package/dist/server/static/harness.html +35 -0
- package/dist/server/static/harness.js +345 -0
- package/package.json +43 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"harness-server.test.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.test.ts"],"names":[],"mappings":""}
|