@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.
Files changed (112) hide show
  1. package/README.md +317 -61
  2. package/dist/cli/completion.d.ts +5 -0
  3. package/dist/cli/completion.d.ts.map +1 -0
  4. package/dist/cli/completion.js +148 -0
  5. package/dist/cli/completion.js.map +1 -0
  6. package/dist/cli/config.d.ts +3 -0
  7. package/dist/cli/config.d.ts.map +1 -0
  8. package/dist/cli/config.js +207 -0
  9. package/dist/cli/config.js.map +1 -0
  10. package/dist/cli/expose.d.ts.map +1 -1
  11. package/dist/cli/expose.js +20 -13
  12. package/dist/cli/expose.js.map +1 -1
  13. package/dist/cli/federation.d.ts +14 -0
  14. package/dist/cli/federation.d.ts.map +1 -1
  15. package/dist/cli/federation.js +347 -23
  16. package/dist/cli/federation.js.map +1 -1
  17. package/dist/cli/project.d.ts +4 -3
  18. package/dist/cli/project.d.ts.map +1 -1
  19. package/dist/cli/project.js +34 -24
  20. package/dist/cli/project.js.map +1 -1
  21. package/dist/cli/setup.d.ts +23 -0
  22. package/dist/cli/setup.d.ts.map +1 -1
  23. package/dist/cli/setup.js +560 -32
  24. package/dist/cli/setup.js.map +1 -1
  25. package/dist/cli.js +358 -35
  26. package/dist/cli.js.map +1 -1
  27. package/dist/daemon/agent-comms.d.ts.map +1 -1
  28. package/dist/daemon/agent-comms.js +15 -10
  29. package/dist/daemon/agent-comms.js.map +1 -1
  30. package/dist/daemon/heartbeat.d.ts +22 -0
  31. package/dist/daemon/heartbeat.d.ts.map +1 -0
  32. package/dist/daemon/heartbeat.js +119 -0
  33. package/dist/daemon/heartbeat.js.map +1 -0
  34. package/dist/daemon/intent-registry.d.ts.map +1 -1
  35. package/dist/daemon/intent-registry.js +19 -10
  36. package/dist/daemon/intent-registry.js.map +1 -1
  37. package/dist/daemon/keypair.d.ts +1 -0
  38. package/dist/daemon/keypair.d.ts.map +1 -1
  39. package/dist/daemon/keypair.js +151 -18
  40. package/dist/daemon/keypair.js.map +1 -1
  41. package/dist/daemon/message-handler.d.ts.map +1 -1
  42. package/dist/daemon/message-handler.js +30 -16
  43. package/dist/daemon/message-handler.js.map +1 -1
  44. package/dist/daemon/notify.d.ts +19 -0
  45. package/dist/daemon/notify.d.ts.map +1 -1
  46. package/dist/daemon/notify.js +376 -73
  47. package/dist/daemon/notify.js.map +1 -1
  48. package/dist/daemon/openclaw-bridge.d.ts +34 -0
  49. package/dist/daemon/openclaw-bridge.d.ts.map +1 -0
  50. package/dist/daemon/openclaw-bridge.js +261 -0
  51. package/dist/daemon/openclaw-bridge.js.map +1 -0
  52. package/dist/daemon/peers.d.ts +21 -0
  53. package/dist/daemon/peers.d.ts.map +1 -1
  54. package/dist/daemon/peers.js +125 -20
  55. package/dist/daemon/peers.js.map +1 -1
  56. package/dist/daemon/projects.d.ts +9 -6
  57. package/dist/daemon/projects.d.ts.map +1 -1
  58. package/dist/daemon/projects.js +30 -20
  59. package/dist/daemon/projects.js.map +1 -1
  60. package/dist/daemon/server.d.ts +17 -0
  61. package/dist/daemon/server.d.ts.map +1 -1
  62. package/dist/daemon/server.js +188 -77
  63. package/dist/daemon/server.js.map +1 -1
  64. package/dist/shared/config.d.ts +52 -1
  65. package/dist/shared/config.d.ts.map +1 -1
  66. package/dist/shared/config.js +18 -11
  67. package/dist/shared/config.js.map +1 -1
  68. package/dist/shared/framework-detection.d.ts +31 -0
  69. package/dist/shared/framework-detection.d.ts.map +1 -0
  70. package/dist/shared/framework-detection.js +91 -0
  71. package/dist/shared/framework-detection.js.map +1 -0
  72. package/dist/shared/help.d.ts +5 -0
  73. package/dist/shared/help.d.ts.map +1 -0
  74. package/dist/shared/help.js +281 -0
  75. package/dist/shared/help.js.map +1 -0
  76. package/dist/shared/meta-config.d.ts +44 -0
  77. package/dist/shared/meta-config.d.ts.map +1 -0
  78. package/dist/shared/meta-config.js +89 -0
  79. package/dist/shared/meta-config.js.map +1 -0
  80. package/dist/shared/migration.d.ts +57 -0
  81. package/dist/shared/migration.d.ts.map +1 -0
  82. package/dist/shared/migration.js +255 -0
  83. package/dist/shared/migration.js.map +1 -0
  84. package/docs/CLI-REFERENCE.md +1361 -0
  85. package/docs/GETTING-STARTED.md +953 -0
  86. package/docs/MIGRATION.md +202 -0
  87. package/docs/MULTI-FRAMEWORK-DEMO.md +352 -0
  88. package/docs/MULTI-FRAMEWORK-DESIGN.md +378 -0
  89. package/docs/MULTI-FRAMEWORK-IMPL.md +197 -0
  90. package/docs/case-studies/CRASH_RESOLUTION_20260407.md +190 -0
  91. package/docs/case-studies/OpenClaw_Hermes_Status_Report_20260407.md +142 -0
  92. package/docs/case-studies/OpenClaw_Stability_Fix_Summary.md +209 -0
  93. package/docs/case-studies/README.md +40 -0
  94. package/docs/case-studies/crash_observations.md +250 -0
  95. package/docs/cloudflare-named-tunnel-setup.md +126 -0
  96. package/docs/federation-flow.md +27 -37
  97. package/docs/hermes-implementation-checklist.md +4 -0
  98. package/docs/project-intent-testing.md +97 -0
  99. package/docs/quickstart.md +12 -4
  100. package/docs/rendezvous.md +13 -14
  101. package/docs/scopes.md +13 -13
  102. package/package.json +12 -6
  103. package/scripts/completion.bash +123 -0
  104. package/scripts/completion.zsh +372 -0
  105. package/scripts/install-skills.js +19 -1
  106. package/scripts/test-migration-execute.js +74 -0
  107. package/scripts/test-migration.js +42 -0
  108. package/scripts/test-project-intents.mjs +614 -0
  109. package/skills/ogp/SKILL.md +197 -64
  110. package/skills/ogp-agent-comms/SKILL.md +107 -41
  111. package/skills/ogp-expose/SKILL.md +183 -25
  112. 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: 'summary',
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(ACTIVITY_LOG_FILE, logLine, 'utf-8');
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
- if (!fs.existsSync(ACTIVITY_LOG_FILE))
149
+ const activityLogFile = getActivityLogFile();
150
+ if (!fs.existsSync(activityLogFile))
148
151
  return;
149
- const content = fs.readFileSync(ACTIVITY_LOG_FILE, 'utf-8');
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(ACTIVITY_LOG_FILE, trimmed, 'utf-8');
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
- if (!fs.existsSync(ACTIVITY_LOG_FILE))
164
+ const activityLogFile = getActivityLogFile();
165
+ if (!fs.existsSync(activityLogFile))
162
166
  return [];
163
- const content = fs.readFileSync(ACTIVITY_LOG_FILE, 'utf-8');
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
- if (fs.existsSync(ACTIVITY_LOG_FILE)) {
181
- fs.unlinkSync(ACTIVITY_LOG_FILE);
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":"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"}
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":"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"}
@@ -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;AA8GD,wBAAgB,WAAW,IAAI,MAAM,EAAE,CA2BtC;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
+ {"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
- const INTENTS_FILE = path.join(getConfigDir(), 'intent-registry.json');
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 topic',
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
- topic: { type: 'string', description: 'Topic area for this contribution' },
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', 'topic', 'summary']
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 topic',
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
- topic: { type: 'string', description: 'Topic to query about (optional)' },
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 topics in a project',
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
- if (!fs.existsSync(INTENTS_FILE)) {
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(INTENTS_FILE, 'utf-8');
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(INTENTS_FILE, JSON.stringify(intents, null, 2), 'utf-8');
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":"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"}
1
+ {"version":3,"file":"intent-registry.js","sourceRoot":"","sources":["../../src/daemon/intent-registry.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type KeyPair } from '../shared/signing.js';
2
+ export declare function resetKeyPair(): KeyPair;
2
3
  export declare function loadOrGenerateKeyPair(): KeyPair;
3
4
  export declare function getPublicKey(): string;
4
5
  export declare function getPrivateKey(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAiDrE,wBAAgB,qBAAqB,IAAI,OAAO,CAoD/C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAGtC"}
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"}
@@ -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 ${KEYCHAIN_SERVICE} -a ${KEYCHAIN_ACCOUNT} -w ${JSON.stringify(privateKey)}`, { stdio: 'pipe' });
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
- const result = execSync(`security find-generic-password -s ${KEYCHAIN_SERVICE} -a ${KEYCHAIN_ACCOUNT} -w`, { stdio: 'pipe' }).toString().trim();
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 ${KEYCHAIN_SERVICE} -a ${KEYCHAIN_ACCOUNT}`, { stdio: 'pipe' });
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
- if (fs.existsSync(KEYPAIR_FILE)) {
42
- const data = JSON.parse(fs.readFileSync(KEYPAIR_FILE, 'utf-8'));
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(KEYPAIR_FILE, JSON.stringify(safe, null, 2), 'utf-8');
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
- if (!data.privateKey) {
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(KEYPAIR_FILE, JSON.stringify({ publicKey: keypair.publicKey }, null, 2), 'utf-8');
77
- console.log('[OGP] Generated new Ed25519 keypair (private key stored in macOS Keychain)');
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
- // Non-macOS: store full keypair in file (restrict permissions)
81
- fs.writeFileSync(KEYPAIR_FILE, JSON.stringify(keypair, null, 2), 'utf-8');
82
- fs.chmodSync(KEYPAIR_FILE, 0o600);
83
- console.log('[OGP] Generated new Ed25519 keypair (private key stored in keypair.json, mode 600)');
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":"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"}
1
+ {"version":3,"file":"keypair.js","sourceRoot":"","sources":["../../src/daemon/keypair.ts"],"names":[],"mappings":"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"}