forkoff 1.0.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 (56) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +173 -0
  3. package/dist/api.d.ts +44 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +76 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/approval.d.ts +46 -0
  8. package/dist/approval.d.ts.map +1 -0
  9. package/dist/approval.js +119 -0
  10. package/dist/approval.js.map +1 -0
  11. package/dist/config.d.ts +36 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +209 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +868 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/integration.d.ts +30 -0
  20. package/dist/integration.d.ts.map +1 -0
  21. package/dist/integration.js +84 -0
  22. package/dist/integration.js.map +1 -0
  23. package/dist/terminal.d.ts +25 -0
  24. package/dist/terminal.d.ts.map +1 -0
  25. package/dist/terminal.js +171 -0
  26. package/dist/terminal.js.map +1 -0
  27. package/dist/tools/claude-hooks.d.ts +97 -0
  28. package/dist/tools/claude-hooks.d.ts.map +1 -0
  29. package/dist/tools/claude-hooks.js +348 -0
  30. package/dist/tools/claude-hooks.js.map +1 -0
  31. package/dist/tools/claude-process.d.ts +271 -0
  32. package/dist/tools/claude-process.d.ts.map +1 -0
  33. package/dist/tools/claude-process.js +931 -0
  34. package/dist/tools/claude-process.js.map +1 -0
  35. package/dist/tools/claude-sessions.d.ts +60 -0
  36. package/dist/tools/claude-sessions.d.ts.map +1 -0
  37. package/dist/tools/claude-sessions.js +285 -0
  38. package/dist/tools/claude-sessions.js.map +1 -0
  39. package/dist/tools/detector.d.ts +64 -0
  40. package/dist/tools/detector.d.ts.map +1 -0
  41. package/dist/tools/detector.js +383 -0
  42. package/dist/tools/detector.js.map +1 -0
  43. package/dist/tools/index.d.ts +8 -0
  44. package/dist/tools/index.d.ts.map +1 -0
  45. package/dist/tools/index.js +15 -0
  46. package/dist/tools/index.js.map +1 -0
  47. package/dist/transcript-streamer.d.ts +68 -0
  48. package/dist/transcript-streamer.d.ts.map +1 -0
  49. package/dist/transcript-streamer.js +459 -0
  50. package/dist/transcript-streamer.js.map +1 -0
  51. package/dist/websocket.d.ts +133 -0
  52. package/dist/websocket.d.ts.map +1 -0
  53. package/dist/websocket.js +247 -0
  54. package/dist/websocket.js.map +1 -0
  55. package/nul +0 -0
  56. package/package.json +54 -0
package/dist/config.js ADDED
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.config = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const node_machine_id_1 = require("node-machine-id");
41
+ const uuid_1 = require("uuid");
42
+ // SECURITY: Helper to check if URL is local (allows insecure connections for local dev)
43
+ function isLocalUrl(url) {
44
+ try {
45
+ const parsed = new URL(url);
46
+ const host = parsed.hostname.toLowerCase();
47
+ return host === 'localhost' ||
48
+ host === '127.0.0.1' ||
49
+ host.startsWith('192.168.') ||
50
+ host.startsWith('10.') ||
51
+ host.startsWith('172.16.') ||
52
+ host.startsWith('172.17.') ||
53
+ host.startsWith('172.18.') ||
54
+ host.startsWith('172.19.') ||
55
+ host.startsWith('172.2') ||
56
+ host.startsWith('172.30.') ||
57
+ host.startsWith('172.31.');
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ // SECURITY: Enforce secure protocol for non-local URLs
64
+ function enforceSecureUrl(url, type) {
65
+ if (isLocalUrl(url)) {
66
+ return url; // Allow insecure for local development
67
+ }
68
+ // For non-local URLs, enforce HTTPS/WSS
69
+ if (type === 'api' && url.startsWith('http://')) {
70
+ console.warn('[Config] SECURITY: Upgrading insecure API URL to HTTPS');
71
+ return url.replace('http://', 'https://');
72
+ }
73
+ if (type === 'ws' && url.startsWith('ws://')) {
74
+ console.warn('[Config] SECURITY: Upgrading insecure WebSocket URL to WSS');
75
+ return url.replace('ws://', 'wss://');
76
+ }
77
+ return url;
78
+ }
79
+ const defaultConfig = {
80
+ deviceId: null,
81
+ deviceName: os.hostname(),
82
+ apiUrl: 'https://api.forkoff.app/api',
83
+ wsUrl: 'wss://api.forkoff.app',
84
+ pairingCode: null,
85
+ pairedAt: null,
86
+ userId: null,
87
+ };
88
+ class Config {
89
+ constructor() {
90
+ this.configPath = this.getConfigPath();
91
+ this.data = this.load();
92
+ }
93
+ getConfigPath() {
94
+ const configDir = process.platform === 'win32'
95
+ ? path.join(process.env.APPDATA || os.homedir(), 'forkoff-cli')
96
+ : path.join(os.homedir(), '.config', 'forkoff-cli');
97
+ if (!fs.existsSync(configDir)) {
98
+ fs.mkdirSync(configDir, { recursive: true });
99
+ }
100
+ return path.join(configDir, 'config.json');
101
+ }
102
+ load() {
103
+ try {
104
+ if (fs.existsSync(this.configPath)) {
105
+ const content = fs.readFileSync(this.configPath, 'utf-8');
106
+ return { ...defaultConfig, ...JSON.parse(content) };
107
+ }
108
+ }
109
+ catch (error) {
110
+ // If config is corrupted, use defaults
111
+ }
112
+ return { ...defaultConfig };
113
+ }
114
+ save() {
115
+ fs.writeFileSync(this.configPath, JSON.stringify(this.data, null, 2));
116
+ }
117
+ get deviceId() {
118
+ return this.data.deviceId;
119
+ }
120
+ set deviceId(value) {
121
+ this.data.deviceId = value;
122
+ this.save();
123
+ }
124
+ get deviceName() {
125
+ return this.data.deviceName;
126
+ }
127
+ set deviceName(value) {
128
+ this.data.deviceName = value;
129
+ this.save();
130
+ }
131
+ get apiUrl() {
132
+ // SECURITY: Enforce HTTPS for non-local URLs
133
+ return enforceSecureUrl(this.data.apiUrl, 'api');
134
+ }
135
+ set apiUrl(value) {
136
+ // SECURITY: Enforce HTTPS for non-local URLs when setting
137
+ this.data.apiUrl = enforceSecureUrl(value, 'api');
138
+ this.save();
139
+ }
140
+ get wsUrl() {
141
+ // SECURITY: Enforce WSS for non-local URLs
142
+ return enforceSecureUrl(this.data.wsUrl, 'ws');
143
+ }
144
+ set wsUrl(value) {
145
+ // SECURITY: Enforce WSS for non-local URLs when setting
146
+ this.data.wsUrl = enforceSecureUrl(value, 'ws');
147
+ this.save();
148
+ }
149
+ get pairingCode() {
150
+ return this.data.pairingCode;
151
+ }
152
+ set pairingCode(value) {
153
+ this.data.pairingCode = value;
154
+ this.save();
155
+ }
156
+ get pairedAt() {
157
+ return this.data.pairedAt;
158
+ }
159
+ set pairedAt(value) {
160
+ this.data.pairedAt = value;
161
+ this.save();
162
+ }
163
+ get userId() {
164
+ return this.data.userId;
165
+ }
166
+ set userId(value) {
167
+ this.data.userId = value;
168
+ this.save();
169
+ }
170
+ get isPaired() {
171
+ return !!this.userId && !!this.deviceId;
172
+ }
173
+ // Get unique machine identifier
174
+ getMachineId() {
175
+ try {
176
+ return (0, node_machine_id_1.machineIdSync)();
177
+ }
178
+ catch {
179
+ // Fallback to stored or new UUID
180
+ if (!this.data.machineId) {
181
+ this.data.machineId = (0, uuid_1.v4)();
182
+ this.save();
183
+ }
184
+ return this.data.machineId;
185
+ }
186
+ }
187
+ // Get device info for registration
188
+ getDeviceInfo() {
189
+ return {
190
+ name: this.deviceName,
191
+ type: 'desktop',
192
+ platform: os.platform(),
193
+ hostname: os.hostname(),
194
+ machineId: this.getMachineId(),
195
+ };
196
+ }
197
+ // Reset all config
198
+ reset() {
199
+ this.data = { ...defaultConfig };
200
+ this.save();
201
+ }
202
+ // Get config file path
203
+ getPath() {
204
+ return this.configPath;
205
+ }
206
+ }
207
+ exports.config = new Config();
208
+ exports.default = exports.config;
209
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}