@dp-pcs/ogp 0.3.3 → 0.4.3
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/README.md +317 -61
- package/dist/cli/completion.d.ts +5 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +148 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/config.d.ts +3 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +207 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/expose.d.ts.map +1 -1
- package/dist/cli/expose.js +20 -13
- package/dist/cli/expose.js.map +1 -1
- package/dist/cli/federation.d.ts +14 -0
- package/dist/cli/federation.d.ts.map +1 -1
- package/dist/cli/federation.js +347 -23
- package/dist/cli/federation.js.map +1 -1
- package/dist/cli/project.d.ts +4 -3
- package/dist/cli/project.d.ts.map +1 -1
- package/dist/cli/project.js +34 -24
- package/dist/cli/project.js.map +1 -1
- package/dist/cli/setup.d.ts +23 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +560 -32
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli.js +358 -35
- package/dist/cli.js.map +1 -1
- package/dist/daemon/agent-comms.d.ts.map +1 -1
- package/dist/daemon/agent-comms.js +15 -10
- package/dist/daemon/agent-comms.js.map +1 -1
- package/dist/daemon/heartbeat.d.ts +22 -0
- package/dist/daemon/heartbeat.d.ts.map +1 -0
- package/dist/daemon/heartbeat.js +119 -0
- package/dist/daemon/heartbeat.js.map +1 -0
- package/dist/daemon/intent-registry.d.ts.map +1 -1
- package/dist/daemon/intent-registry.js +19 -10
- package/dist/daemon/intent-registry.js.map +1 -1
- package/dist/daemon/keypair.d.ts +1 -0
- package/dist/daemon/keypair.d.ts.map +1 -1
- package/dist/daemon/keypair.js +151 -18
- package/dist/daemon/keypair.js.map +1 -1
- package/dist/daemon/message-handler.d.ts.map +1 -1
- package/dist/daemon/message-handler.js +30 -16
- package/dist/daemon/message-handler.js.map +1 -1
- package/dist/daemon/notify.d.ts +19 -0
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +376 -73
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/openclaw-bridge.d.ts +34 -0
- package/dist/daemon/openclaw-bridge.d.ts.map +1 -0
- package/dist/daemon/openclaw-bridge.js +261 -0
- package/dist/daemon/openclaw-bridge.js.map +1 -0
- package/dist/daemon/peers.d.ts +21 -0
- package/dist/daemon/peers.d.ts.map +1 -1
- package/dist/daemon/peers.js +125 -20
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/projects.d.ts +9 -6
- package/dist/daemon/projects.d.ts.map +1 -1
- package/dist/daemon/projects.js +30 -20
- package/dist/daemon/projects.js.map +1 -1
- package/dist/daemon/server.d.ts +17 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +188 -77
- package/dist/daemon/server.js.map +1 -1
- package/dist/shared/config.d.ts +52 -1
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +18 -11
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/framework-detection.d.ts +31 -0
- package/dist/shared/framework-detection.d.ts.map +1 -0
- package/dist/shared/framework-detection.js +91 -0
- package/dist/shared/framework-detection.js.map +1 -0
- package/dist/shared/help.d.ts +5 -0
- package/dist/shared/help.d.ts.map +1 -0
- package/dist/shared/help.js +281 -0
- package/dist/shared/help.js.map +1 -0
- package/dist/shared/meta-config.d.ts +44 -0
- package/dist/shared/meta-config.d.ts.map +1 -0
- package/dist/shared/meta-config.js +89 -0
- package/dist/shared/meta-config.js.map +1 -0
- package/dist/shared/migration.d.ts +57 -0
- package/dist/shared/migration.d.ts.map +1 -0
- package/dist/shared/migration.js +255 -0
- package/dist/shared/migration.js.map +1 -0
- package/docs/CLI-REFERENCE.md +1361 -0
- package/docs/GETTING-STARTED.md +953 -0
- package/docs/MIGRATION.md +202 -0
- package/docs/MULTI-FRAMEWORK-DEMO.md +352 -0
- package/docs/MULTI-FRAMEWORK-DESIGN.md +378 -0
- package/docs/MULTI-FRAMEWORK-IMPL.md +197 -0
- package/docs/case-studies/CRASH_RESOLUTION_20260407.md +190 -0
- package/docs/case-studies/OpenClaw_Hermes_Status_Report_20260407.md +142 -0
- package/docs/case-studies/OpenClaw_Stability_Fix_Summary.md +209 -0
- package/docs/case-studies/README.md +40 -0
- package/docs/case-studies/crash_observations.md +250 -0
- package/docs/cloudflare-named-tunnel-setup.md +126 -0
- package/docs/federation-flow.md +27 -37
- package/docs/hermes-implementation-checklist.md +4 -0
- package/docs/project-intent-testing.md +97 -0
- package/docs/quickstart.md +12 -4
- package/docs/rendezvous.md +13 -14
- package/docs/scopes.md +13 -13
- package/package.json +12 -6
- package/scripts/completion.bash +123 -0
- package/scripts/completion.zsh +372 -0
- package/scripts/install-skills.js +19 -1
- package/scripts/test-migration-execute.js +74 -0
- package/scripts/test-migration.js +42 -0
- package/scripts/test-project-intents.mjs +614 -0
- package/skills/ogp/SKILL.md +197 -64
- package/skills/ogp-agent-comms/SKILL.md +107 -41
- package/skills/ogp-expose/SKILL.md +183 -25
- package/skills/ogp-project/SKILL.md +110 -88
|
@@ -10,14 +10,16 @@ import fs from 'node:fs';
|
|
|
10
10
|
import path from 'node:path';
|
|
11
11
|
import { getConfigDir, ensureConfigDir, loadConfig, saveConfig } from '../shared/config.js';
|
|
12
12
|
import { getPeer } from './peers.js';
|
|
13
|
-
const ACTIVITY_LOG_FILE = path.join(getConfigDir(), 'activity.log');
|
|
14
13
|
const MAX_LOG_LINES = 1000;
|
|
14
|
+
function getActivityLogFile() {
|
|
15
|
+
return path.join(getConfigDir(), 'activity.log');
|
|
16
|
+
}
|
|
15
17
|
const DEFAULT_AGENT_COMMS_CONFIG = {
|
|
16
18
|
globalPolicy: {
|
|
17
19
|
'general': { level: 'summary' },
|
|
18
20
|
'testing': { level: 'full' }
|
|
19
21
|
},
|
|
20
|
-
defaultLevel: '
|
|
22
|
+
defaultLevel: 'off',
|
|
21
23
|
activityLog: true
|
|
22
24
|
};
|
|
23
25
|
/**
|
|
@@ -136,7 +138,7 @@ export function logActivity(entry) {
|
|
|
136
138
|
const levelTag = entry.level ? ` [${entry.level.toUpperCase()}]` : '';
|
|
137
139
|
const logLine = `${fullEntry.timestamp} ${dirSymbol} ${entry.peerName} ${arrow} ${entry.topic}:${levelTag} ${msgPreview}\n`;
|
|
138
140
|
// Append to log file
|
|
139
|
-
fs.appendFileSync(
|
|
141
|
+
fs.appendFileSync(getActivityLogFile(), logLine, 'utf-8');
|
|
140
142
|
// Rotate if too large
|
|
141
143
|
rotateActivityLog();
|
|
142
144
|
}
|
|
@@ -144,23 +146,25 @@ export function logActivity(entry) {
|
|
|
144
146
|
* Rotate activity log if it exceeds max lines
|
|
145
147
|
*/
|
|
146
148
|
function rotateActivityLog() {
|
|
147
|
-
|
|
149
|
+
const activityLogFile = getActivityLogFile();
|
|
150
|
+
if (!fs.existsSync(activityLogFile))
|
|
148
151
|
return;
|
|
149
|
-
const content = fs.readFileSync(
|
|
152
|
+
const content = fs.readFileSync(activityLogFile, 'utf-8');
|
|
150
153
|
const lines = content.split('\n').filter(l => l.trim());
|
|
151
154
|
if (lines.length > MAX_LOG_LINES) {
|
|
152
155
|
// Keep only the last MAX_LOG_LINES entries
|
|
153
156
|
const trimmed = lines.slice(-MAX_LOG_LINES).join('\n') + '\n';
|
|
154
|
-
fs.writeFileSync(
|
|
157
|
+
fs.writeFileSync(activityLogFile, trimmed, 'utf-8');
|
|
155
158
|
}
|
|
156
159
|
}
|
|
157
160
|
/**
|
|
158
161
|
* Read activity log entries
|
|
159
162
|
*/
|
|
160
163
|
export function readActivityLog(options) {
|
|
161
|
-
|
|
164
|
+
const activityLogFile = getActivityLogFile();
|
|
165
|
+
if (!fs.existsSync(activityLogFile))
|
|
162
166
|
return [];
|
|
163
|
-
const content = fs.readFileSync(
|
|
167
|
+
const content = fs.readFileSync(activityLogFile, 'utf-8');
|
|
164
168
|
let lines = content.split('\n').filter(l => l.trim());
|
|
165
169
|
// Filter by peer if specified
|
|
166
170
|
if (options?.peerId) {
|
|
@@ -177,8 +181,9 @@ export function readActivityLog(options) {
|
|
|
177
181
|
* Clear activity log
|
|
178
182
|
*/
|
|
179
183
|
export function clearActivityLog() {
|
|
180
|
-
|
|
181
|
-
|
|
184
|
+
const activityLogFile = getActivityLogFile();
|
|
185
|
+
if (fs.existsSync(activityLogFile)) {
|
|
186
|
+
fs.unlinkSync(activityLogFile);
|
|
182
187
|
}
|
|
183
188
|
}
|
|
184
189
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-comms.js","sourceRoot":"","sources":["../../src/daemon/agent-comms.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,UAAU,EAMX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-comms.js","sourceRoot":"","sources":["../../src/daemon/agent-comms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start the periodic heartbeat timer
|
|
3
|
+
*/
|
|
4
|
+
export declare function startHeartbeat(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Stop the periodic heartbeat timer
|
|
7
|
+
*/
|
|
8
|
+
export declare function stopHeartbeat(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Get heartbeat configuration
|
|
11
|
+
*/
|
|
12
|
+
export declare function getHeartbeatConfig(): {
|
|
13
|
+
intervalMs: number;
|
|
14
|
+
timeoutMs: number;
|
|
15
|
+
maxConsecutiveFailures: number;
|
|
16
|
+
isRunning: boolean;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Manually trigger a health check (for testing/debugging)
|
|
20
|
+
*/
|
|
21
|
+
export declare function triggerHealthCheck(): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/daemon/heartbeat.ts"],"names":[],"mappings":"AAmFA;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAqBrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;;;EAOjC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { listPeers, updatePeer } from './peers.js';
|
|
2
|
+
let heartbeatTimer = null;
|
|
3
|
+
const HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
4
|
+
const HEALTH_CHECK_TIMEOUT_MS = 10000; // 10 seconds
|
|
5
|
+
const MAX_CONSECUTIVE_FAILURES = 3; // Mark unhealthy after 3 consecutive failures
|
|
6
|
+
/**
|
|
7
|
+
* Check if a single peer is healthy by fetching their /.well-known/ogp endpoint
|
|
8
|
+
*/
|
|
9
|
+
async function checkPeerHealth(peer) {
|
|
10
|
+
try {
|
|
11
|
+
const controller = new AbortController();
|
|
12
|
+
const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);
|
|
13
|
+
const response = await fetch(`${peer.gatewayUrl}/.well-known/ogp`, {
|
|
14
|
+
signal: controller.signal,
|
|
15
|
+
headers: {
|
|
16
|
+
'User-Agent': 'OGP-Heartbeat/1.0'
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
clearTimeout(timeoutId);
|
|
20
|
+
// Consider any 2xx response as healthy
|
|
21
|
+
return response.ok;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// Network errors, timeouts, etc. = unhealthy
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Run health checks on all approved peers
|
|
30
|
+
*/
|
|
31
|
+
async function runHealthChecks() {
|
|
32
|
+
const peers = listPeers('approved');
|
|
33
|
+
if (peers.length === 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log(`[OGP Heartbeat] Checking health of ${peers.length} peer(s)...`);
|
|
37
|
+
// Check all peers in parallel
|
|
38
|
+
const healthCheckPromises = peers.map(async (peer) => {
|
|
39
|
+
const isHealthy = await checkPeerHealth(peer);
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
if (isHealthy) {
|
|
42
|
+
// Peer is healthy - reset failure count and update lastSeenAt
|
|
43
|
+
if (peer.healthy === false) {
|
|
44
|
+
console.log(`[OGP Heartbeat] Peer ${peer.displayName} (${peer.id}) is now healthy`);
|
|
45
|
+
}
|
|
46
|
+
updatePeer(peer.id, {
|
|
47
|
+
lastSeenAt: now,
|
|
48
|
+
healthy: true,
|
|
49
|
+
healthCheckFailures: 0
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Peer is unhealthy - increment failure count
|
|
54
|
+
const failures = (peer.healthCheckFailures || 0) + 1;
|
|
55
|
+
const wasHealthy = peer.healthy !== false;
|
|
56
|
+
// Mark as unhealthy if we've reached the threshold
|
|
57
|
+
const isNowUnhealthy = failures >= MAX_CONSECUTIVE_FAILURES;
|
|
58
|
+
if (wasHealthy && isNowUnhealthy) {
|
|
59
|
+
console.warn(`[OGP Heartbeat] Peer ${peer.displayName} (${peer.id}) marked as unhealthy after ${failures} consecutive failures`);
|
|
60
|
+
}
|
|
61
|
+
updatePeer(peer.id, {
|
|
62
|
+
healthy: isNowUnhealthy ? false : peer.healthy,
|
|
63
|
+
healthCheckFailures: failures
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
await Promise.allSettled(healthCheckPromises);
|
|
68
|
+
console.log(`[OGP Heartbeat] Health check completed`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Start the periodic heartbeat timer
|
|
72
|
+
*/
|
|
73
|
+
export function startHeartbeat() {
|
|
74
|
+
if (heartbeatTimer) {
|
|
75
|
+
console.warn('[OGP Heartbeat] Heartbeat already running');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(`[OGP Heartbeat] Starting heartbeat (interval: ${HEARTBEAT_INTERVAL_MS / 1000}s)`);
|
|
79
|
+
// Run initial health check after a short delay (30 seconds) to avoid startup congestion
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
runHealthChecks().catch((error) => {
|
|
82
|
+
console.error('[OGP Heartbeat] Error during initial health check:', error);
|
|
83
|
+
});
|
|
84
|
+
}, 30000);
|
|
85
|
+
// Then run periodically
|
|
86
|
+
heartbeatTimer = setInterval(() => {
|
|
87
|
+
runHealthChecks().catch((error) => {
|
|
88
|
+
console.error('[OGP Heartbeat] Error during health check:', error);
|
|
89
|
+
});
|
|
90
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Stop the periodic heartbeat timer
|
|
94
|
+
*/
|
|
95
|
+
export function stopHeartbeat() {
|
|
96
|
+
if (heartbeatTimer) {
|
|
97
|
+
clearInterval(heartbeatTimer);
|
|
98
|
+
heartbeatTimer = null;
|
|
99
|
+
console.log('[OGP Heartbeat] Heartbeat stopped');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get heartbeat configuration
|
|
104
|
+
*/
|
|
105
|
+
export function getHeartbeatConfig() {
|
|
106
|
+
return {
|
|
107
|
+
intervalMs: HEARTBEAT_INTERVAL_MS,
|
|
108
|
+
timeoutMs: HEALTH_CHECK_TIMEOUT_MS,
|
|
109
|
+
maxConsecutiveFailures: MAX_CONSECUTIVE_FAILURES,
|
|
110
|
+
isRunning: heartbeatTimer !== null
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Manually trigger a health check (for testing/debugging)
|
|
115
|
+
*/
|
|
116
|
+
export async function triggerHealthCheck() {
|
|
117
|
+
await runHealthChecks();
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/daemon/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAE9D,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AACzD,MAAM,uBAAuB,GAAG,KAAK,CAAC,CAAC,aAAa;AACpD,MAAM,wBAAwB,GAAG,CAAC,CAAC,CAAC,8CAA8C;AAElF;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,IAAU;IACvC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAEhF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,kBAAkB,EAAE;YACjE,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,mBAAmB;aAClC;SACF,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,uCAAuC;QACvC,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6CAA6C;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAEpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;IAE7E,8BAA8B;IAC9B,MAAM,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,SAAS,EAAE,CAAC;YACd,8DAA8D;YAC9D,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACtF,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE;gBAClB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,IAAI;gBACb,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;YAE1C,mDAAmD;YACnD,MAAM,cAAc,GAAG,QAAQ,IAAI,wBAAwB,CAAC;YAE5D,IAAI,UAAU,IAAI,cAAc,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE,+BAA+B,QAAQ,uBAAuB,CAAC,CAAC;YACnI,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE;gBAClB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;gBAC9C,mBAAmB,EAAE,QAAQ;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iDAAiD,qBAAqB,GAAG,IAAI,IAAI,CAAC,CAAC;IAE/F,wFAAwF;IACxF,UAAU,CAAC,GAAG,EAAE;QACd,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,wBAAwB;IACxB,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,qBAAqB,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,cAAc,EAAE,CAAC;QACnB,aAAa,CAAC,cAAc,CAAC,CAAC;QAC9B,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,UAAU,EAAE,qBAAqB;QACjC,SAAS,EAAE,uBAAuB;QAClC,sBAAsB,EAAE,wBAAwB;QAChD,SAAS,EAAE,cAAc,KAAK,IAAI;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-registry.d.ts","sourceRoot":"","sources":["../../src/daemon/intent-registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"intent-registry.d.ts","sourceRoot":"","sources":["../../src/daemon/intent-registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsHD,wBAAgB,WAAW,IAAI,MAAM,EAAE,CA4BtC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAGnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CASnD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASlD;AAED,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getConfigDir, ensureConfigDir } from '../shared/config.js';
|
|
4
|
-
|
|
4
|
+
function getIntentsFile() {
|
|
5
|
+
return path.join(getConfigDir(), 'intent-registry.json');
|
|
6
|
+
}
|
|
5
7
|
const DEFAULT_INTENTS = [
|
|
6
8
|
{
|
|
7
9
|
name: 'message',
|
|
@@ -69,26 +71,32 @@ const DEFAULT_INTENTS = [
|
|
|
69
71
|
},
|
|
70
72
|
{
|
|
71
73
|
name: 'project.contribute',
|
|
72
|
-
description: 'Add a summary/update to a project
|
|
74
|
+
description: 'Add a summary/update to a project entry type',
|
|
73
75
|
schema: {
|
|
74
76
|
type: 'object',
|
|
75
77
|
properties: {
|
|
76
78
|
projectId: { type: 'string', description: 'Project to contribute to' },
|
|
77
|
-
|
|
79
|
+
entryType: { type: 'string', description: 'Entry type for this contribution' },
|
|
80
|
+
topic: { type: 'string', description: 'Legacy alias for entryType' },
|
|
78
81
|
summary: { type: 'string', description: 'Summary of the contribution' },
|
|
79
82
|
metadata: { type: 'object', description: 'Additional structured data' }
|
|
80
83
|
},
|
|
81
|
-
required: ['projectId', '
|
|
84
|
+
required: ['projectId', 'summary'],
|
|
85
|
+
anyOf: [
|
|
86
|
+
{ required: ['entryType'] },
|
|
87
|
+
{ required: ['topic'] }
|
|
88
|
+
]
|
|
82
89
|
}
|
|
83
90
|
},
|
|
84
91
|
{
|
|
85
92
|
name: 'project.query',
|
|
86
|
-
description: 'Ask what a peer has done on a project
|
|
93
|
+
description: 'Ask what a peer has done on a project entry type',
|
|
87
94
|
schema: {
|
|
88
95
|
type: 'object',
|
|
89
96
|
properties: {
|
|
90
97
|
projectId: { type: 'string', description: 'Project to query' },
|
|
91
|
-
|
|
98
|
+
entryType: { type: 'string', description: 'Entry type to query about (optional)' },
|
|
99
|
+
topic: { type: 'string', description: 'Legacy alias for entryType (optional)' },
|
|
92
100
|
authorId: { type: 'string', description: 'Specific author to query (optional)' },
|
|
93
101
|
limit: { type: 'number', description: 'Maximum number of contributions to return', minimum: 1, maximum: 50 }
|
|
94
102
|
},
|
|
@@ -97,7 +105,7 @@ const DEFAULT_INTENTS = [
|
|
|
97
105
|
},
|
|
98
106
|
{
|
|
99
107
|
name: 'project.status',
|
|
100
|
-
description: 'Get current state of all
|
|
108
|
+
description: 'Get current state of all entry types in a project',
|
|
101
109
|
schema: {
|
|
102
110
|
type: 'object',
|
|
103
111
|
properties: {
|
|
@@ -109,11 +117,12 @@ const DEFAULT_INTENTS = [
|
|
|
109
117
|
];
|
|
110
118
|
export function loadIntents() {
|
|
111
119
|
ensureConfigDir();
|
|
112
|
-
|
|
120
|
+
const intentsFile = getIntentsFile();
|
|
121
|
+
if (!fs.existsSync(intentsFile)) {
|
|
113
122
|
saveIntents(DEFAULT_INTENTS);
|
|
114
123
|
return DEFAULT_INTENTS;
|
|
115
124
|
}
|
|
116
|
-
const data = fs.readFileSync(
|
|
125
|
+
const data = fs.readFileSync(intentsFile, 'utf-8');
|
|
117
126
|
const existingIntents = JSON.parse(data);
|
|
118
127
|
// Merge new default intents that don't exist in the file (upgrade path)
|
|
119
128
|
let updated = false;
|
|
@@ -133,7 +142,7 @@ export function loadIntents() {
|
|
|
133
142
|
}
|
|
134
143
|
export function saveIntents(intents) {
|
|
135
144
|
ensureConfigDir();
|
|
136
|
-
fs.writeFileSync(
|
|
145
|
+
fs.writeFileSync(getIntentsFile(), JSON.stringify(intents, null, 2), 'utf-8');
|
|
137
146
|
}
|
|
138
147
|
export function registerIntent(intent) {
|
|
139
148
|
const intents = loadIntents();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-registry.js","sourceRoot":"","sources":["../../src/daemon/intent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AASpE,
|
|
1
|
+
{"version":3,"file":"intent-registry.js","sourceRoot":"","sources":["../../src/daemon/intent-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/keypair.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA8KrE,wBAAgB,YAAY,IAAI,OAAO,CAatC;AAID,wBAAgB,qBAAqB,IAAI,OAAO,CA+E/C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAGtC"}
|
package/dist/daemon/keypair.js
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
3
4
|
import { execSync } from 'node:child_process';
|
|
4
5
|
import { generateKeyPair } from '../shared/signing.js';
|
|
5
|
-
import { getConfigDir, ensureConfigDir } from '../shared/config.js';
|
|
6
|
-
const KEYPAIR_FILE = path.join(getConfigDir(), 'keypair.json');
|
|
7
|
-
const KEYCHAIN_SERVICE = 'ogp-federation';
|
|
6
|
+
import { getConfigDir, ensureConfigDir, loadConfig } from '../shared/config.js';
|
|
8
7
|
const KEYCHAIN_ACCOUNT = 'private-key';
|
|
8
|
+
const KEYPAIR_ENCRYPTION_VERSION = 1;
|
|
9
|
+
function getKeypairFile() {
|
|
10
|
+
return path.join(getConfigDir(), 'keypair.json');
|
|
11
|
+
}
|
|
12
|
+
// Make keychain service unique per OGP instance to avoid key collision.
|
|
13
|
+
// This must resolve at call time so multi-framework commands honor the current OGP_HOME.
|
|
14
|
+
function getKeychainService() {
|
|
15
|
+
const configDirHash = crypto.createHash('md5').update(getConfigDir()).digest('hex').slice(0, 8);
|
|
16
|
+
return `ogp-federation-${configDirHash}`;
|
|
17
|
+
}
|
|
9
18
|
// --- macOS Keychain helpers ---
|
|
10
19
|
function isMacOS() {
|
|
11
20
|
return process.platform === 'darwin';
|
|
12
21
|
}
|
|
13
22
|
function keychainStore(privateKey) {
|
|
14
23
|
try {
|
|
15
|
-
execSync(`security add-generic-password -U -s ${
|
|
24
|
+
execSync(`security add-generic-password -U -s ${getKeychainService()} -a ${KEYCHAIN_ACCOUNT} -w ${JSON.stringify(privateKey)}`, { stdio: 'pipe' });
|
|
16
25
|
}
|
|
17
26
|
catch {
|
|
18
27
|
// ignore — falls back to file
|
|
@@ -20,26 +29,127 @@ function keychainStore(privateKey) {
|
|
|
20
29
|
}
|
|
21
30
|
function keychainLoad() {
|
|
22
31
|
try {
|
|
23
|
-
|
|
32
|
+
// Try new instance-specific service name first
|
|
33
|
+
const result = execSync(`security find-generic-password -s ${getKeychainService()} -a ${KEYCHAIN_ACCOUNT} -w`, { stdio: 'pipe' }).toString().trim();
|
|
24
34
|
return result || null;
|
|
25
35
|
}
|
|
26
36
|
catch {
|
|
37
|
+
// Migration: try old shared service name (pre-v0.3.4)
|
|
38
|
+
try {
|
|
39
|
+
const oldService = 'ogp-federation'; // Old hardcoded service name
|
|
40
|
+
const oldResult = execSync(`security find-generic-password -s ${oldService} -a ${KEYCHAIN_ACCOUNT} -w`, { stdio: 'pipe' }).toString().trim();
|
|
41
|
+
if (oldResult) {
|
|
42
|
+
console.log(`[OGP] Migrating private key from shared keychain (${oldService}) to instance-specific keychain (${getKeychainService()})`);
|
|
43
|
+
keychainStore(oldResult);
|
|
44
|
+
return oldResult;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch { }
|
|
27
48
|
return null;
|
|
28
49
|
}
|
|
29
50
|
}
|
|
30
51
|
function keychainDelete() {
|
|
31
52
|
try {
|
|
32
|
-
execSync(`security delete-generic-password -s ${
|
|
53
|
+
execSync(`security delete-generic-password -s ${getKeychainService()} -a ${KEYCHAIN_ACCOUNT}`, { stdio: 'pipe' });
|
|
33
54
|
}
|
|
34
55
|
catch {
|
|
35
56
|
// ignore — may not exist
|
|
36
57
|
}
|
|
37
58
|
}
|
|
59
|
+
function getKeyEncryptionSecret() {
|
|
60
|
+
const envSecret = process.env.OGP_KEYPAIR_SECRET?.trim();
|
|
61
|
+
if (envSecret) {
|
|
62
|
+
return { secret: envSecret, source: 'env' };
|
|
63
|
+
}
|
|
64
|
+
const config = loadConfig();
|
|
65
|
+
const hermesSecret = config?.hermesWebhookSecret?.trim();
|
|
66
|
+
if (hermesSecret) {
|
|
67
|
+
return { secret: hermesSecret, source: 'hermesWebhookSecret' };
|
|
68
|
+
}
|
|
69
|
+
const openclawToken = config?.openclawToken?.trim();
|
|
70
|
+
if (openclawToken) {
|
|
71
|
+
return { secret: openclawToken, source: 'openclawToken' };
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function isEncryptedKeypairRecord(data) {
|
|
76
|
+
return Boolean(data &&
|
|
77
|
+
typeof data === 'object' &&
|
|
78
|
+
typeof data.publicKey === 'string' &&
|
|
79
|
+
typeof data.privateKeyCiphertext === 'string' &&
|
|
80
|
+
data.encryption &&
|
|
81
|
+
data.encryption.scheme === 'aes-256-gcm+scrypt' &&
|
|
82
|
+
typeof data.encryption.salt === 'string' &&
|
|
83
|
+
typeof data.encryption.iv === 'string' &&
|
|
84
|
+
typeof data.encryption.authTag === 'string');
|
|
85
|
+
}
|
|
86
|
+
function encryptPrivateKey(privateKey, secret, source) {
|
|
87
|
+
const salt = crypto.randomBytes(16);
|
|
88
|
+
const iv = crypto.randomBytes(12);
|
|
89
|
+
const key = crypto.scryptSync(secret, salt, 32);
|
|
90
|
+
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
|
|
91
|
+
const ciphertext = Buffer.concat([
|
|
92
|
+
cipher.update(privateKey, 'utf-8'),
|
|
93
|
+
cipher.final()
|
|
94
|
+
]);
|
|
95
|
+
const authTag = cipher.getAuthTag();
|
|
96
|
+
return {
|
|
97
|
+
version: KEYPAIR_ENCRYPTION_VERSION,
|
|
98
|
+
scheme: 'aes-256-gcm+scrypt',
|
|
99
|
+
salt: salt.toString('base64'),
|
|
100
|
+
iv: iv.toString('base64'),
|
|
101
|
+
authTag: authTag.toString('base64'),
|
|
102
|
+
secretSource: source,
|
|
103
|
+
privateKeyCiphertext: ciphertext.toString('base64')
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function decryptPrivateKey(record, secret) {
|
|
107
|
+
const salt = Buffer.from(record.encryption.salt, 'base64');
|
|
108
|
+
const iv = Buffer.from(record.encryption.iv, 'base64');
|
|
109
|
+
const authTag = Buffer.from(record.encryption.authTag, 'base64');
|
|
110
|
+
const ciphertext = Buffer.from(record.privateKeyCiphertext, 'base64');
|
|
111
|
+
const key = crypto.scryptSync(secret, salt, 32);
|
|
112
|
+
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
|
|
113
|
+
decipher.setAuthTag(authTag);
|
|
114
|
+
return Buffer.concat([
|
|
115
|
+
decipher.update(ciphertext),
|
|
116
|
+
decipher.final()
|
|
117
|
+
]).toString('utf-8');
|
|
118
|
+
}
|
|
119
|
+
function writeEncryptedKeypairFile(keypairFile, keypair, secret, source) {
|
|
120
|
+
const encrypted = encryptPrivateKey(keypair.privateKey, secret, source);
|
|
121
|
+
const record = {
|
|
122
|
+
publicKey: keypair.publicKey,
|
|
123
|
+
privateKeyCiphertext: encrypted.privateKeyCiphertext,
|
|
124
|
+
encryption: {
|
|
125
|
+
version: encrypted.version,
|
|
126
|
+
scheme: encrypted.scheme,
|
|
127
|
+
salt: encrypted.salt,
|
|
128
|
+
iv: encrypted.iv,
|
|
129
|
+
authTag: encrypted.authTag,
|
|
130
|
+
secretSource: encrypted.secretSource
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
fs.writeFileSync(keypairFile, JSON.stringify(record, null, 2), 'utf-8');
|
|
134
|
+
fs.chmodSync(keypairFile, 0o600);
|
|
135
|
+
}
|
|
136
|
+
export function resetKeyPair() {
|
|
137
|
+
ensureConfigDir();
|
|
138
|
+
const keypairFile = getKeypairFile();
|
|
139
|
+
if (fs.existsSync(keypairFile)) {
|
|
140
|
+
fs.unlinkSync(keypairFile);
|
|
141
|
+
}
|
|
142
|
+
if (isMacOS()) {
|
|
143
|
+
keychainDelete();
|
|
144
|
+
}
|
|
145
|
+
return loadOrGenerateKeyPair();
|
|
146
|
+
}
|
|
38
147
|
// --- Keypair management ---
|
|
39
148
|
export function loadOrGenerateKeyPair() {
|
|
40
149
|
ensureConfigDir();
|
|
41
|
-
|
|
42
|
-
|
|
150
|
+
const keypairFile = getKeypairFile();
|
|
151
|
+
if (fs.existsSync(keypairFile)) {
|
|
152
|
+
const data = JSON.parse(fs.readFileSync(keypairFile, 'utf-8'));
|
|
43
153
|
// Migration: if private key is in file and we're on macOS, move it to Keychain
|
|
44
154
|
if (data.privateKey && isMacOS()) {
|
|
45
155
|
const existing = keychainLoad();
|
|
@@ -49,22 +159,38 @@ export function loadOrGenerateKeyPair() {
|
|
|
49
159
|
}
|
|
50
160
|
// Scrub private key from file
|
|
51
161
|
const safe = { publicKey: data.publicKey };
|
|
52
|
-
fs.writeFileSync(
|
|
162
|
+
fs.writeFileSync(keypairFile, JSON.stringify(safe, null, 2), 'utf-8');
|
|
53
163
|
}
|
|
54
164
|
// Load private key from Keychain (macOS) or file (other)
|
|
55
165
|
let privateKey;
|
|
56
166
|
if (isMacOS()) {
|
|
57
167
|
const fromKeychain = keychainLoad();
|
|
58
168
|
if (!fromKeychain) {
|
|
59
|
-
throw new Error('[OGP] Private key not found in Keychain. Run `ogp setup --reset-keypair` to regenerate.');
|
|
169
|
+
throw new Error('[OGP] Private key not found in macOS Keychain. On macOS, keypair.json stores only the public key cache. Run `ogp setup --reset-keypair` to regenerate.');
|
|
60
170
|
}
|
|
61
171
|
privateKey = fromKeychain;
|
|
62
172
|
}
|
|
63
173
|
else {
|
|
64
|
-
|
|
174
|
+
const secretConfig = getKeyEncryptionSecret();
|
|
175
|
+
if (isEncryptedKeypairRecord(data)) {
|
|
176
|
+
if (!secretConfig) {
|
|
177
|
+
throw new Error('[OGP] Encrypted private key present but no decryption secret is available. Set OGP_KEYPAIR_SECRET or configure the platform secret before starting OGP.');
|
|
178
|
+
}
|
|
179
|
+
privateKey = decryptPrivateKey(data, secretConfig.secret);
|
|
180
|
+
}
|
|
181
|
+
else if (data.privateKey) {
|
|
182
|
+
privateKey = data.privateKey;
|
|
183
|
+
if (secretConfig) {
|
|
184
|
+
writeEncryptedKeypairFile(keypairFile, { publicKey: data.publicKey, privateKey }, secretConfig.secret, secretConfig.source);
|
|
185
|
+
console.log(`[OGP] Migrated private key at rest to encrypted storage (${secretConfig.source})`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
console.warn('[OGP] Private key is stored in legacy plaintext format because no encryption secret is configured. Set OGP_KEYPAIR_SECRET or configure the platform secret, then run `ogp setup --reset-keypair` to harden this instance.');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
65
192
|
throw new Error('[OGP] Private key missing from keypair.json on non-macOS platform.');
|
|
66
193
|
}
|
|
67
|
-
privateKey = data.privateKey;
|
|
68
194
|
}
|
|
69
195
|
return { publicKey: data.publicKey, privateKey };
|
|
70
196
|
}
|
|
@@ -73,14 +199,21 @@ export function loadOrGenerateKeyPair() {
|
|
|
73
199
|
if (isMacOS()) {
|
|
74
200
|
// Store private key in Keychain, public key in file only
|
|
75
201
|
keychainStore(keypair.privateKey);
|
|
76
|
-
fs.writeFileSync(
|
|
77
|
-
console.log(
|
|
202
|
+
fs.writeFileSync(keypairFile, JSON.stringify({ publicKey: keypair.publicKey }, null, 2), 'utf-8');
|
|
203
|
+
console.log(`[OGP] Generated new Ed25519 keypair (private key stored in macOS Keychain service ${getKeychainService()}, public key cached in keypair.json)`);
|
|
78
204
|
}
|
|
79
205
|
else {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
206
|
+
const secretConfig = getKeyEncryptionSecret();
|
|
207
|
+
if (secretConfig) {
|
|
208
|
+
writeEncryptedKeypairFile(keypairFile, keypair, secretConfig.secret, secretConfig.source);
|
|
209
|
+
console.log(`[OGP] Generated new Ed25519 keypair (private key encrypted at rest using ${secretConfig.source}, file mode 600)`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// Legacy fallback for standalone or partially configured environments.
|
|
213
|
+
fs.writeFileSync(keypairFile, JSON.stringify(keypair, null, 2), 'utf-8');
|
|
214
|
+
fs.chmodSync(keypairFile, 0o600);
|
|
215
|
+
console.warn('[OGP] Generated new Ed25519 keypair in legacy plaintext storage because no encryption secret is configured. Set OGP_KEYPAIR_SECRET or configure the platform secret to encrypt the private key at rest.');
|
|
216
|
+
}
|
|
84
217
|
}
|
|
85
218
|
return keypair;
|
|
86
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keypair.js","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"keypair.js","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"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"}
|