@portel/photon 1.22.1 → 1.23.1

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 (214) hide show
  1. package/README.md +19 -8
  2. package/dist/a2ui/mapper.d.ts +40 -0
  3. package/dist/a2ui/mapper.d.ts.map +1 -0
  4. package/dist/a2ui/mapper.js +286 -0
  5. package/dist/a2ui/mapper.js.map +1 -0
  6. package/dist/a2ui/types.d.ts +129 -0
  7. package/dist/a2ui/types.d.ts.map +1 -0
  8. package/dist/a2ui/types.js +20 -0
  9. package/dist/a2ui/types.js.map +1 -0
  10. package/dist/ag-ui/adapter.d.ts +9 -1
  11. package/dist/ag-ui/adapter.d.ts.map +1 -1
  12. package/dist/ag-ui/adapter.js +33 -16
  13. package/dist/ag-ui/adapter.js.map +1 -1
  14. package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
  15. package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
  16. package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
  17. package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
  18. package/dist/auto-ui/beam.d.ts.map +1 -1
  19. package/dist/auto-ui/beam.js +34 -34
  20. package/dist/auto-ui/beam.js.map +1 -1
  21. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  22. package/dist/auto-ui/bridge/renderers.js +371 -0
  23. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  24. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  25. package/dist/auto-ui/streamable-http-transport.js +38 -1
  26. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  27. package/dist/auto-ui/types.d.ts +19 -0
  28. package/dist/auto-ui/types.d.ts.map +1 -1
  29. package/dist/auto-ui/types.js.map +1 -1
  30. package/dist/beam.bundle.js +757 -107
  31. package/dist/beam.bundle.js.map +4 -4
  32. package/dist/cli/commands/beam.d.ts.map +1 -1
  33. package/dist/cli/commands/beam.js +2 -0
  34. package/dist/cli/commands/beam.js.map +1 -1
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +2 -0
  37. package/dist/cli/commands/build.js.map +1 -1
  38. package/dist/cli/commands/doctor.d.ts.map +1 -1
  39. package/dist/cli/commands/doctor.js +92 -3
  40. package/dist/cli/commands/doctor.js.map +1 -1
  41. package/dist/cli/commands/host.d.ts.map +1 -1
  42. package/dist/cli/commands/host.js +9 -1
  43. package/dist/cli/commands/host.js.map +1 -1
  44. package/dist/cli/commands/info.d.ts.map +1 -1
  45. package/dist/cli/commands/info.js +7 -3
  46. package/dist/cli/commands/info.js.map +1 -1
  47. package/dist/cli/commands/init.d.ts.map +1 -1
  48. package/dist/cli/commands/init.js +4 -0
  49. package/dist/cli/commands/init.js.map +1 -1
  50. package/dist/cli/commands/maker.d.ts +8 -0
  51. package/dist/cli/commands/maker.d.ts.map +1 -1
  52. package/dist/cli/commands/maker.js +113 -46
  53. package/dist/cli/commands/maker.js.map +1 -1
  54. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  55. package/dist/cli/commands/marketplace.js +7 -1
  56. package/dist/cli/commands/marketplace.js.map +1 -1
  57. package/dist/cli/commands/mcp.d.ts +10 -0
  58. package/dist/cli/commands/mcp.d.ts.map +1 -1
  59. package/dist/cli/commands/mcp.js +215 -4
  60. package/dist/cli/commands/mcp.js.map +1 -1
  61. package/dist/cli/commands/package.d.ts.map +1 -1
  62. package/dist/cli/commands/package.js +33 -15
  63. package/dist/cli/commands/package.js.map +1 -1
  64. package/dist/cli/commands/ps.d.ts +16 -0
  65. package/dist/cli/commands/ps.d.ts.map +1 -0
  66. package/dist/cli/commands/ps.js +267 -0
  67. package/dist/cli/commands/ps.js.map +1 -0
  68. package/dist/cli/commands/run.d.ts.map +1 -1
  69. package/dist/cli/commands/run.js +7 -0
  70. package/dist/cli/commands/run.js.map +1 -1
  71. package/dist/cli/commands/update.d.ts.map +1 -1
  72. package/dist/cli/commands/update.js +14 -4
  73. package/dist/cli/commands/update.js.map +1 -1
  74. package/dist/cli/index.d.ts.map +1 -1
  75. package/dist/cli/index.js +9 -4
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/context-store.d.ts +4 -4
  78. package/dist/context-store.d.ts.map +1 -1
  79. package/dist/context-store.js +20 -17
  80. package/dist/context-store.js.map +1 -1
  81. package/dist/context.d.ts +5 -4
  82. package/dist/context.d.ts.map +1 -1
  83. package/dist/context.js +68 -14
  84. package/dist/context.js.map +1 -1
  85. package/dist/daemon/client.d.ts +60 -0
  86. package/dist/daemon/client.d.ts.map +1 -1
  87. package/dist/daemon/client.js +76 -0
  88. package/dist/daemon/client.js.map +1 -1
  89. package/dist/daemon/execution-history-sqlite.d.ts +50 -0
  90. package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
  91. package/dist/daemon/execution-history-sqlite.js +165 -0
  92. package/dist/daemon/execution-history-sqlite.js.map +1 -0
  93. package/dist/daemon/execution-history.d.ts +78 -0
  94. package/dist/daemon/execution-history.d.ts.map +1 -0
  95. package/dist/daemon/execution-history.js +246 -0
  96. package/dist/daemon/execution-history.js.map +1 -0
  97. package/dist/daemon/hot-reload-state.d.ts +27 -0
  98. package/dist/daemon/hot-reload-state.d.ts.map +1 -0
  99. package/dist/daemon/hot-reload-state.js +48 -0
  100. package/dist/daemon/hot-reload-state.js.map +1 -0
  101. package/dist/daemon/protocol.d.ts +5 -1
  102. package/dist/daemon/protocol.d.ts.map +1 -1
  103. package/dist/daemon/protocol.js +13 -0
  104. package/dist/daemon/protocol.js.map +1 -1
  105. package/dist/daemon/registry-keys.d.ts +88 -0
  106. package/dist/daemon/registry-keys.d.ts.map +1 -0
  107. package/dist/daemon/registry-keys.js +91 -0
  108. package/dist/daemon/registry-keys.js.map +1 -0
  109. package/dist/daemon/server.js +1521 -186
  110. package/dist/daemon/server.js.map +1 -1
  111. package/dist/daemon/session-resolver.d.ts +28 -0
  112. package/dist/daemon/session-resolver.d.ts.map +1 -0
  113. package/dist/daemon/session-resolver.js +41 -0
  114. package/dist/daemon/session-resolver.js.map +1 -0
  115. package/dist/data-migration.js +20 -9
  116. package/dist/data-migration.js.map +1 -1
  117. package/dist/loader.d.ts +22 -8
  118. package/dist/loader.d.ts.map +1 -1
  119. package/dist/loader.js +214 -94
  120. package/dist/loader.js.map +1 -1
  121. package/dist/marketplace-manager.d.ts.map +1 -1
  122. package/dist/marketplace-manager.js +9 -5
  123. package/dist/marketplace-manager.js.map +1 -1
  124. package/dist/namespace-migration.d.ts.map +1 -1
  125. package/dist/namespace-migration.js +28 -23
  126. package/dist/namespace-migration.js.map +1 -1
  127. package/dist/photon-cli-runner.d.ts.map +1 -1
  128. package/dist/photon-cli-runner.js +57 -8
  129. package/dist/photon-cli-runner.js.map +1 -1
  130. package/dist/serv/auth/auth-store.d.ts +155 -0
  131. package/dist/serv/auth/auth-store.d.ts.map +1 -0
  132. package/dist/serv/auth/auth-store.js +240 -0
  133. package/dist/serv/auth/auth-store.js.map +1 -0
  134. package/dist/serv/auth/endpoints.d.ts +113 -0
  135. package/dist/serv/auth/endpoints.d.ts.map +1 -0
  136. package/dist/serv/auth/endpoints.js +1005 -0
  137. package/dist/serv/auth/endpoints.js.map +1 -0
  138. package/dist/serv/auth/http-adapter.d.ts +60 -0
  139. package/dist/serv/auth/http-adapter.d.ts.map +1 -0
  140. package/dist/serv/auth/http-adapter.js +235 -0
  141. package/dist/serv/auth/http-adapter.js.map +1 -0
  142. package/dist/serv/auth/jwt.d.ts +92 -6
  143. package/dist/serv/auth/jwt.d.ts.map +1 -1
  144. package/dist/serv/auth/jwt.js +226 -24
  145. package/dist/serv/auth/jwt.js.map +1 -1
  146. package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
  147. package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
  148. package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
  149. package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
  150. package/dist/serv/auth/sqlite-stores.d.ts +85 -0
  151. package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
  152. package/dist/serv/auth/sqlite-stores.js +446 -0
  153. package/dist/serv/auth/sqlite-stores.js.map +1 -0
  154. package/dist/serv/auth/well-known.d.ts +54 -1
  155. package/dist/serv/auth/well-known.d.ts.map +1 -1
  156. package/dist/serv/auth/well-known.js +166 -17
  157. package/dist/serv/auth/well-known.js.map +1 -1
  158. package/dist/serv/index.d.ts +45 -2
  159. package/dist/serv/index.d.ts.map +1 -1
  160. package/dist/serv/index.js +65 -1
  161. package/dist/serv/index.js.map +1 -1
  162. package/dist/serv/types/index.d.ts +80 -0
  163. package/dist/serv/types/index.d.ts.map +1 -1
  164. package/dist/serv/types/index.js.map +1 -1
  165. package/dist/server.d.ts.map +1 -1
  166. package/dist/server.js +61 -6
  167. package/dist/server.js.map +1 -1
  168. package/dist/shared/announce-context.d.ts +51 -0
  169. package/dist/shared/announce-context.d.ts.map +1 -0
  170. package/dist/shared/announce-context.js +73 -0
  171. package/dist/shared/announce-context.js.map +1 -0
  172. package/dist/shared/audit-sqlite.d.ts +63 -0
  173. package/dist/shared/audit-sqlite.d.ts.map +1 -0
  174. package/dist/shared/audit-sqlite.js +187 -0
  175. package/dist/shared/audit-sqlite.js.map +1 -0
  176. package/dist/shared/audit.d.ts +25 -3
  177. package/dist/shared/audit.d.ts.map +1 -1
  178. package/dist/shared/audit.js +97 -3
  179. package/dist/shared/audit.js.map +1 -1
  180. package/dist/shared/error-handler.d.ts +10 -1
  181. package/dist/shared/error-handler.d.ts.map +1 -1
  182. package/dist/shared/error-handler.js +17 -2
  183. package/dist/shared/error-handler.js.map +1 -1
  184. package/dist/shared/security.d.ts +12 -0
  185. package/dist/shared/security.d.ts.map +1 -1
  186. package/dist/shared/security.js +80 -0
  187. package/dist/shared/security.js.map +1 -1
  188. package/dist/shared/sqlite-runtime.d.ts +46 -0
  189. package/dist/shared/sqlite-runtime.d.ts.map +1 -0
  190. package/dist/shared/sqlite-runtime.js +120 -0
  191. package/dist/shared/sqlite-runtime.js.map +1 -0
  192. package/dist/tasks/store.d.ts +1 -1
  193. package/dist/tasks/store.d.ts.map +1 -1
  194. package/dist/tasks/store.js +29 -15
  195. package/dist/tasks/store.js.map +1 -1
  196. package/dist/telemetry/metrics.d.ts +26 -0
  197. package/dist/telemetry/metrics.d.ts.map +1 -1
  198. package/dist/telemetry/metrics.js +31 -0
  199. package/dist/telemetry/metrics.js.map +1 -1
  200. package/dist/test-runner.d.ts.map +1 -1
  201. package/dist/test-runner.js +3 -3
  202. package/dist/test-runner.js.map +1 -1
  203. package/dist/tsx-compiler.d.ts.map +1 -1
  204. package/dist/tsx-compiler.js +18 -1
  205. package/dist/tsx-compiler.js.map +1 -1
  206. package/dist/version-checker.d.ts.map +1 -1
  207. package/dist/version-checker.js +7 -14
  208. package/dist/version-checker.js.map +1 -1
  209. package/dist/version.d.ts +12 -0
  210. package/dist/version.d.ts.map +1 -1
  211. package/dist/version.js +103 -1
  212. package/dist/version.js.map +1 -1
  213. package/package.json +10 -2
  214. package/templates/photon.template.ts +7 -13
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Execution history for scheduled jobs.
3
+ *
4
+ * Two backends, selected at runtime:
5
+ * - JSONL (default): per-photon append-only log at
6
+ * `{PHOTON_DIR}/.data/{photon}/schedules/executions.jsonl`
7
+ * with size rotation (10MB → .1.jsonl … .3.jsonl) and boot-time TTL sweep.
8
+ * - SQLite (opt-in via initExecutionHistorySqlite): single shared DB with
9
+ * indexed queries. Recommended when `photon ps history` is queried often
10
+ * or the daemon keeps many photons (linear full-file scans add up).
11
+ *
12
+ * Writes are best-effort: failures never propagate to callers of
13
+ * recordExecution — an audit log that crashes scheduled jobs is worse than
14
+ * a missing audit log.
15
+ */
16
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'fs';
17
+ import { dirname, join } from 'path';
18
+ import { getPhotonSchedulesDir } from '@portel/photon-core';
19
+ import { getDefaultContext } from '../context.js';
20
+ import { createLogger } from '../shared/logger.js';
21
+ import { getErrorMessage } from '../shared/error-handler.js';
22
+ const logger = createLogger({ component: 'execution-history' });
23
+ /** Rotate current file when it grows past this size. */
24
+ const MAX_FILE_SIZE = 10 * 1024 * 1024;
25
+ /** Number of rotated archives to keep (executions.1.jsonl … .N.jsonl). */
26
+ const MAX_ROTATED_FILES = 3;
27
+ /** Retention window for boot sweep. */
28
+ const TTL_MS = 14 * 24 * 60 * 60 * 1000;
29
+ /** Per-method cap applied by the boot sweep. */
30
+ const MAX_ENTRIES_PER_METHOD = 500;
31
+ /** Truncation cap for the serialized outputPreview field. */
32
+ const OUTPUT_PREVIEW_MAX = 500;
33
+ /** Absolute path to a photon's executions.jsonl under the Option B layout. */
34
+ export function executionsFile(photonName, workingDir) {
35
+ const baseDir = workingDir || getDefaultContext().baseDir;
36
+ return join(getPhotonSchedulesDir('', photonName, baseDir), 'executions.jsonl');
37
+ }
38
+ /**
39
+ * Active SQLite backend. When set, recordExecution and readExecutionHistory
40
+ * route through it; sweeps become no-ops since SQLite handles its own.
41
+ */
42
+ let sqliteBackend = null;
43
+ /**
44
+ * Upgrade the execution-history writer to a SQLite backend. Call once at
45
+ * daemon startup; safe to call more than once. The default path lives next
46
+ * to the per-photon .data directories so existing deployments can keep
47
+ * both representations alongside during migration.
48
+ */
49
+ export async function initExecutionHistorySqlite(opts) {
50
+ if (sqliteBackend)
51
+ return;
52
+ const { openExecutionHistoryDatabase, SqliteExecutionHistoryBackend } = await import('./execution-history-sqlite.js');
53
+ mkdirSync(dirname(opts.path), { recursive: true });
54
+ const db = await openExecutionHistoryDatabase(opts.path);
55
+ sqliteBackend = new SqliteExecutionHistoryBackend(db, {
56
+ ttlMs: opts.ttlMs,
57
+ maxPerMethod: opts.maxPerMethod,
58
+ });
59
+ }
60
+ /** Swap the SQLite backend for tests or custom providers. */
61
+ export function setExecutionHistoryBackend(backend) {
62
+ sqliteBackend = backend;
63
+ }
64
+ /** Expose the active backend for sweep + query helpers. */
65
+ export function getExecutionHistoryBackend() {
66
+ return sqliteBackend;
67
+ }
68
+ /**
69
+ * Append a single entry; rotate if the current file has crossed MAX_FILE_SIZE.
70
+ * Never throws.
71
+ */
72
+ export function recordExecution(photonName, entry, workingDir) {
73
+ if (sqliteBackend) {
74
+ try {
75
+ sqliteBackend.record(photonName, entry, workingDir);
76
+ return;
77
+ }
78
+ catch (err) {
79
+ logger.debug('SQLite execution record failed, falling back to JSONL', {
80
+ photon: photonName,
81
+ error: getErrorMessage(err),
82
+ });
83
+ }
84
+ }
85
+ const file = executionsFile(photonName, workingDir);
86
+ try {
87
+ mkdirSync(dirname(file), { recursive: true });
88
+ rotateIfNeeded(file);
89
+ appendFileSync(file, JSON.stringify(entry) + '\n');
90
+ }
91
+ catch (err) {
92
+ logger.debug('Failed to record execution', {
93
+ photon: photonName,
94
+ error: getErrorMessage(err),
95
+ });
96
+ }
97
+ }
98
+ function rotateIfNeeded(file) {
99
+ try {
100
+ if (!existsSync(file))
101
+ return;
102
+ const stats = statSync(file);
103
+ if (stats.size < MAX_FILE_SIZE)
104
+ return;
105
+ const dir = dirname(file);
106
+ for (let i = MAX_ROTATED_FILES; i >= 1; i--) {
107
+ const src = i === 1 ? file : join(dir, `executions.${i - 1}.jsonl`);
108
+ const dst = join(dir, `executions.${i}.jsonl`);
109
+ if (i === MAX_ROTATED_FILES && existsSync(dst)) {
110
+ unlinkSync(dst);
111
+ }
112
+ if (existsSync(src)) {
113
+ renameSync(src, dst);
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Rotation is best-effort.
119
+ }
120
+ }
121
+ /** Parse every line of the active file. Tolerates malformed lines. */
122
+ function readEntries(file) {
123
+ if (!existsSync(file))
124
+ return [];
125
+ try {
126
+ const raw = readFileSync(file, 'utf-8');
127
+ const out = [];
128
+ for (const line of raw.split('\n')) {
129
+ if (!line.trim())
130
+ continue;
131
+ try {
132
+ const e = JSON.parse(line);
133
+ if (e && typeof e.ts === 'number' && typeof e.method === 'string') {
134
+ out.push(e);
135
+ }
136
+ }
137
+ catch {
138
+ // Skip malformed lines rather than poison the whole read.
139
+ }
140
+ }
141
+ return out;
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ }
147
+ /** Return entries matching the query, newest first. */
148
+ export function readExecutionHistory(photonName, query = {}, workingDir) {
149
+ if (sqliteBackend) {
150
+ return sqliteBackend.query(photonName, query, workingDir);
151
+ }
152
+ const entries = readEntries(executionsFile(photonName, workingDir));
153
+ let filtered = entries;
154
+ if (query.method)
155
+ filtered = filtered.filter((e) => e.method === query.method);
156
+ if (typeof query.sinceTs === 'number') {
157
+ const since = query.sinceTs;
158
+ filtered = filtered.filter((e) => e.ts >= since);
159
+ }
160
+ filtered = filtered.slice().sort((a, b) => b.ts - a.ts);
161
+ if (typeof query.limit === 'number' && query.limit > 0) {
162
+ filtered = filtered.slice(0, query.limit);
163
+ }
164
+ return filtered;
165
+ }
166
+ /**
167
+ * Apply TTL + per-method cap to one file. Writes only if anything was
168
+ * dropped. Safe to call at boot per base.
169
+ */
170
+ export function sweepExecutions(file, now = Date.now()) {
171
+ if (!existsSync(file))
172
+ return;
173
+ try {
174
+ const entries = readEntries(file);
175
+ if (entries.length === 0)
176
+ return;
177
+ const cutoff = now - TTL_MS;
178
+ const aged = entries.filter((e) => e.ts >= cutoff);
179
+ const byMethod = new Map();
180
+ for (const e of aged) {
181
+ const arr = byMethod.get(e.method) || [];
182
+ arr.push(e);
183
+ byMethod.set(e.method, arr);
184
+ }
185
+ const kept = [];
186
+ for (const arr of byMethod.values()) {
187
+ arr.sort((a, b) => a.ts - b.ts);
188
+ const trimmed = arr.length > MAX_ENTRIES_PER_METHOD ? arr.slice(arr.length - MAX_ENTRIES_PER_METHOD) : arr;
189
+ kept.push(...trimmed);
190
+ }
191
+ if (kept.length === entries.length)
192
+ return;
193
+ kept.sort((a, b) => a.ts - b.ts);
194
+ const body = kept.length === 0 ? '' : kept.map((e) => JSON.stringify(e)).join('\n') + '\n';
195
+ writeFileSync(file, body);
196
+ }
197
+ catch (err) {
198
+ logger.debug('Failed to sweep executions', { file, error: getErrorMessage(err) });
199
+ }
200
+ }
201
+ /**
202
+ * Sweep every photon's executions.jsonl under each listed base. Intended to
203
+ * run once at daemon startup, after the bases registry is loaded.
204
+ */
205
+ export function sweepAllBases(bases, now = Date.now()) {
206
+ for (const base of bases) {
207
+ const dataDir = join(base, '.data');
208
+ if (!existsSync(dataDir))
209
+ continue;
210
+ let names = [];
211
+ try {
212
+ names = readdirSync(dataDir);
213
+ }
214
+ catch {
215
+ continue;
216
+ }
217
+ for (const name of names) {
218
+ const file = join(dataDir, name, 'schedules', 'executions.jsonl');
219
+ if (existsSync(file))
220
+ sweepExecutions(file, now);
221
+ }
222
+ }
223
+ }
224
+ /** Compact serialization of a tool return value, capped at OUTPUT_PREVIEW_MAX. */
225
+ export function previewResult(value) {
226
+ if (value === undefined || value === null)
227
+ return undefined;
228
+ try {
229
+ const s = typeof value === 'string' ? value : JSON.stringify(value);
230
+ if (!s)
231
+ return undefined;
232
+ return s.length > OUTPUT_PREVIEW_MAX ? s.slice(0, OUTPUT_PREVIEW_MAX) + '…' : s;
233
+ }
234
+ catch {
235
+ return undefined;
236
+ }
237
+ }
238
+ /** Internal constants exported for tests. */
239
+ export const __test__ = {
240
+ MAX_FILE_SIZE,
241
+ MAX_ROTATED_FILES,
242
+ TTL_MS,
243
+ MAX_ENTRIES_PER_METHOD,
244
+ OUTPUT_PREVIEW_MAX,
245
+ };
246
+ //# sourceMappingURL=execution-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-history.js","sourceRoot":"","sources":["../../src/daemon/execution-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Hot-reload state transfer helpers.
3
+ *
4
+ * Copying user-defined state from the old photon instance to the freshly
5
+ * loaded one, while letting the loader's fresh values win for fields it
6
+ * owns. Broken out into its own module so tests can import it without
7
+ * booting the daemon entrypoint.
8
+ */
9
+ /**
10
+ * Loader-injected fields that must NOT be copied from the old instance
11
+ * to the new instance during hot-reload. The fresh instance already
12
+ * carries the latest schema and backing for these fields (reloaded from
13
+ * source + disk); overwriting with stale values keeps the daemon serving
14
+ * the pre-reload settings shape until a full restart.
15
+ *
16
+ * Function fields are filtered out by the `typeof value !== 'function'`
17
+ * check in the copy loop, so we only list non-function injected fields.
18
+ */
19
+ export declare const LOADER_INJECTED_SKIP: Set<string>;
20
+ /**
21
+ * Copy user-defined state from `oldInstance` to `newInstance`. Skips
22
+ * functions (re-wired by the loader), the constructor marker, and
23
+ * loader-injected settings fields (fresh-instance values win). Swallows
24
+ * per-field write errors so read-only proxies don't abort the transfer.
25
+ */
26
+ export declare function transferHotReloadState(oldInstance: Record<string, unknown>, newInstance: Record<string, unknown>): void;
27
+ //# sourceMappingURL=hot-reload-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-reload-state.d.ts","sourceRoot":"","sources":["../../src/daemon/hot-reload-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,aAK/B,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,IAAI,CAYN"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Hot-reload state transfer helpers.
3
+ *
4
+ * Copying user-defined state from the old photon instance to the freshly
5
+ * loaded one, while letting the loader's fresh values win for fields it
6
+ * owns. Broken out into its own module so tests can import it without
7
+ * booting the daemon entrypoint.
8
+ */
9
+ /**
10
+ * Loader-injected fields that must NOT be copied from the old instance
11
+ * to the new instance during hot-reload. The fresh instance already
12
+ * carries the latest schema and backing for these fields (reloaded from
13
+ * source + disk); overwriting with stale values keeps the daemon serving
14
+ * the pre-reload settings shape until a full restart.
15
+ *
16
+ * Function fields are filtered out by the `typeof value !== 'function'`
17
+ * check in the copy loop, so we only list non-function injected fields.
18
+ */
19
+ export const LOADER_INJECTED_SKIP = new Set([
20
+ '_settingsBacking',
21
+ '_settingsPhotonName',
22
+ '_settingsInstanceName',
23
+ '_settingsSchema',
24
+ ]);
25
+ /**
26
+ * Copy user-defined state from `oldInstance` to `newInstance`. Skips
27
+ * functions (re-wired by the loader), the constructor marker, and
28
+ * loader-injected settings fields (fresh-instance values win). Swallows
29
+ * per-field write errors so read-only proxies don't abort the transfer.
30
+ */
31
+ export function transferHotReloadState(oldInstance, newInstance) {
32
+ for (const key of Object.keys(oldInstance)) {
33
+ if (LOADER_INJECTED_SKIP.has(key))
34
+ continue;
35
+ if (key === 'constructor')
36
+ continue;
37
+ const value = oldInstance[key];
38
+ if (typeof value === 'function')
39
+ continue;
40
+ try {
41
+ newInstance[key] = value;
42
+ }
43
+ catch {
44
+ // Read-only fields (e.g. settings proxy) — skip silently.
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=hot-reload-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-reload-state.js","sourceRoot":"","sources":["../../src/daemon/hot-reload-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAClD,kBAAkB;IAClB,qBAAqB;IACrB,uBAAuB;IACvB,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAoC,EACpC,WAAoC;IAEpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,GAAG,KAAK,aAAa;YAAE,SAAS;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,KAAK,KAAK,UAAU;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -8,7 +8,7 @@ import type { PhotonClass } from '@portel/photon-core';
8
8
  * Message from CLI client to daemon server
9
9
  */
10
10
  export interface DaemonRequest {
11
- type: 'command' | 'ping' | 'shutdown' | 'reload' | 'prompt_response' | 'subscribe' | 'unsubscribe' | 'publish' | 'lock' | 'unlock' | 'assign_lock' | 'transfer_lock' | 'query_lock' | 'schedule' | 'unschedule' | 'list_jobs' | 'list_locks' | 'get_events_since' | 'clear_instances' | 'get_circuit_health' | 'status';
11
+ type: 'command' | 'ping' | 'shutdown' | 'reload' | 'prompt_response' | 'subscribe' | 'unsubscribe' | 'publish' | 'lock' | 'unlock' | 'assign_lock' | 'transfer_lock' | 'query_lock' | 'schedule' | 'unschedule' | 'list_jobs' | 'ps' | 'enable_schedule' | 'disable_schedule' | 'pause_schedule' | 'resume_schedule' | 'get_execution_history' | 'list_locks' | 'get_events_since' | 'clear_instances' | 'get_circuit_health' | 'status';
12
12
  id: string;
13
13
  /** Photon name for routing to correct SessionManager (required for multi-photon daemon) */
14
14
  photonName?: string;
@@ -44,6 +44,10 @@ export interface DaemonRequest {
44
44
  cron?: string;
45
45
  /** Last event timestamp received by client (for delta sync on reconnect) */
46
46
  lastEventId?: string;
47
+ /** Max rows for history-style queries (get_execution_history). */
48
+ limit?: number;
49
+ /** Lower time bound (unix ms) for history-style queries. */
50
+ sinceTs?: number;
47
51
  }
48
52
  /**
49
53
  * Response from daemon server to CLI client
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,12 @@ export function isValidDaemonRequest(obj) {
29
29
  'schedule',
30
30
  'unschedule',
31
31
  'list_jobs',
32
+ 'ps',
33
+ 'enable_schedule',
34
+ 'disable_schedule',
35
+ 'pause_schedule',
36
+ 'resume_schedule',
37
+ 'get_execution_history',
32
38
  'list_locks',
33
39
  'get_events_since',
34
40
  'clear_instances',
@@ -70,6 +76,13 @@ export function isValidDaemonRequest(obj) {
70
76
  if (typeof req.photonPath !== 'string')
71
77
  return false;
72
78
  }
79
+ // Execution-history query is scoped to a specific photon + method.
80
+ if (req.type === 'get_execution_history') {
81
+ if (typeof req.photonName !== 'string')
82
+ return false;
83
+ if (typeof req.method !== 'string')
84
+ return false;
85
+ }
73
86
  return true;
74
87
  }
75
88
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4JH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,GAA6B,CAAC;IAE1C,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,UAAU,GAAG;QACjB,SAAS;QACT,MAAM;QACN,UAAU;QACV,QAAQ;QACR,iBAAiB;QACjB,WAAW;QACX,aAAa;QACb,SAAS;QACT,MAAM;QACN,QAAQ;QACR,aAAa;QACb,eAAe;QACf,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;QACpB,QAAQ;KACT,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3D,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IACnD,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,CAAC,EAAE,CAAC;QACzE,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IACpD,CAAC;IAED,sCAAsC;IACtC,IACE,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,CAAC,EAC7F,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IACrD,CAAC;IAED,sDAAsD;IACtD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IACjD,CAAC;IAED,4BAA4B;IAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IAED,6BAA6B;IAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,IACE,CAAC;QACC,QAAQ;QACR,OAAO;QACP,MAAM;QACN,QAAQ;QACR,iBAAiB;QACjB,gBAAgB;QAChB,MAAM;QACN,UAAU;KACX,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,CAAC;QAE9B,OAAO,KAAK,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Composite-key helpers for daemon registries.
3
+ *
4
+ * Every daemon-side map keyed on "a photon" in a multi-PHOTON_DIR world needs
5
+ * to be keyed on (photon, base) instead — otherwise two workspaces hosting
6
+ * photons with the same name clobber each other. The schedule regression
7
+ * cascade that came out of the v1.22.1→main post-release review traced
8
+ * directly to photon-name-only keys in scattered Map<string, ...>s. This
9
+ * module centralizes every key producer the daemon uses so call sites can't
10
+ * drift apart.
11
+ *
12
+ * Keep this module pure (no daemon side-effects, no cross-module state).
13
+ * It's safe to import from tests without starting the daemon.
14
+ */
15
+ /**
16
+ * Branded key types. `ScopedKey<'...'>` is structurally a string, but
17
+ * TypeScript refuses to assign a plain `string` to it. That means any
18
+ * `Map<ScopedKey<'schedule'>, V>` can ONLY be indexed by the result of
19
+ * `declaredKey(...)`. Bare-string lookups — the cause of the whole
20
+ * multi-base cascade — stop compiling.
21
+ *
22
+ * The brand is erased at runtime; this is purely a compile-time guardrail.
23
+ */
24
+ declare const __brand: unique symbol;
25
+ export type ScopedKey<Tag extends string> = string & {
26
+ readonly [__brand]: Tag;
27
+ };
28
+ export type ScheduleKey = ScopedKey<'schedule'>;
29
+ export type WebhookRouteKey = ScopedKey<'webhook'>;
30
+ export type LocationKey = ScopedKey<'location'>;
31
+ export type PhotonCompositeKey = ScopedKey<'photon'>;
32
+ /**
33
+ * Coerce a raw string to a ScheduleKey at a trust boundary (IPC protocol
34
+ * input, persisted file read, etc.). The boundary is where you explicitly
35
+ * accept that TypeScript can't verify the value's shape. Use sparingly —
36
+ * prefer producing keys through declaredKey() when the photon/method/base
37
+ * are known at compile time.
38
+ */
39
+ export declare function asScheduleKey(raw: string): ScheduleKey;
40
+ export declare function asWebhookRouteKey(raw: string): WebhookRouteKey;
41
+ export declare function asLocationKey(raw: string): LocationKey;
42
+ /**
43
+ * Composite cache/session key: `<photon>` for the default base, else
44
+ * `<photon>:<hash8>` where hash8 is sha256(baseDir) truncated. Preserves
45
+ * legacy behavior when the workingDir matches the supplied default base,
46
+ * so single-base deployments keep their existing key shape.
47
+ */
48
+ export declare function compositeKey(photonName: string, workingDir: string | undefined, defaultBase: string): PhotonCompositeKey;
49
+ /**
50
+ * Identity key for declared schedules / scheduled-job timers:
51
+ * `<resolved-base>::<photon>:<method>`. `<resolved-base>` is the absolute
52
+ * path of the owning PHOTON_DIR, `-` when no base is available (legacy
53
+ * callers predating multi-base).
54
+ *
55
+ * Unlike compositeKey, this ALWAYS includes the base segment. The
56
+ * scheduled-job maps use the base segment as discriminator so same-named
57
+ * photon methods in different bases don't collide.
58
+ */
59
+ export declare function declaredKey(photon: string, method: string, workingDir?: string): ScheduleKey;
60
+ /**
61
+ * Identity key for the webhookRoutes map: `<resolved-base>::<photon>`.
62
+ * Webhook lookups from the HTTP handler pass only a photon name (they don't
63
+ * know the base), so callers that need cross-base search use
64
+ * `findMatching(map, photon)` over the values instead of a direct .get().
65
+ */
66
+ export declare function webhookKey(photon: string, workingDir?: string): WebhookRouteKey;
67
+ /**
68
+ * Identity key for proactivePhotonLocations — same shape as webhookKey,
69
+ * intentionally kept separate because the two maps hold different value
70
+ * types and could drift in the future.
71
+ */
72
+ export declare function locationKey(photon: string, workingDir?: string): LocationKey;
73
+ /**
74
+ * Narrow signature for entries that carry a `photon` field — every value
75
+ * stored in a base-scoped map must expose it so cross-base search works.
76
+ */
77
+ export interface PhotonScoped {
78
+ photon: string;
79
+ workingDir?: string;
80
+ }
81
+ /**
82
+ * Iterate a base-scoped map and return every entry whose photon matches.
83
+ * Used by callers that only have a photon name in scope (HTTP webhook
84
+ * handler, IPC clients that don't pre-know the base).
85
+ */
86
+ export declare function findByPhoton<V extends PhotonScoped>(map: Map<ScopedKey<string>, V> | Map<string, V>, photon: string): V[];
87
+ export {};
88
+ //# sourceMappingURL=registry-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-keys.d.ts","sourceRoot":"","sources":["../../src/daemon/registry-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH;;;;;;;;GAQG;AAEH,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AACrC,MAAM,MAAM,SAAS,CAAC,GAAG,SAAS,MAAM,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAE9D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,GAClB,kBAAkB,CAIpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAG5F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,CAG/E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAG5E;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EACjD,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAC/C,MAAM,EAAE,MAAM,GACb,CAAC,EAAE,CAML"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Composite-key helpers for daemon registries.
3
+ *
4
+ * Every daemon-side map keyed on "a photon" in a multi-PHOTON_DIR world needs
5
+ * to be keyed on (photon, base) instead — otherwise two workspaces hosting
6
+ * photons with the same name clobber each other. The schedule regression
7
+ * cascade that came out of the v1.22.1→main post-release review traced
8
+ * directly to photon-name-only keys in scattered Map<string, ...>s. This
9
+ * module centralizes every key producer the daemon uses so call sites can't
10
+ * drift apart.
11
+ *
12
+ * Keep this module pure (no daemon side-effects, no cross-module state).
13
+ * It's safe to import from tests without starting the daemon.
14
+ */
15
+ import * as crypto from 'crypto';
16
+ import * as path from 'path';
17
+ /**
18
+ * Coerce a raw string to a ScheduleKey at a trust boundary (IPC protocol
19
+ * input, persisted file read, etc.). The boundary is where you explicitly
20
+ * accept that TypeScript can't verify the value's shape. Use sparingly —
21
+ * prefer producing keys through declaredKey() when the photon/method/base
22
+ * are known at compile time.
23
+ */
24
+ export function asScheduleKey(raw) {
25
+ return raw;
26
+ }
27
+ export function asWebhookRouteKey(raw) {
28
+ return raw;
29
+ }
30
+ export function asLocationKey(raw) {
31
+ return raw;
32
+ }
33
+ /**
34
+ * Composite cache/session key: `<photon>` for the default base, else
35
+ * `<photon>:<hash8>` where hash8 is sha256(baseDir) truncated. Preserves
36
+ * legacy behavior when the workingDir matches the supplied default base,
37
+ * so single-base deployments keep their existing key shape.
38
+ */
39
+ export function compositeKey(photonName, workingDir, defaultBase) {
40
+ if (!workingDir || workingDir === defaultBase)
41
+ return photonName;
42
+ const dirHash = crypto.createHash('sha256').update(workingDir).digest('hex').slice(0, 8);
43
+ return `${photonName}:${dirHash}`;
44
+ }
45
+ /**
46
+ * Identity key for declared schedules / scheduled-job timers:
47
+ * `<resolved-base>::<photon>:<method>`. `<resolved-base>` is the absolute
48
+ * path of the owning PHOTON_DIR, `-` when no base is available (legacy
49
+ * callers predating multi-base).
50
+ *
51
+ * Unlike compositeKey, this ALWAYS includes the base segment. The
52
+ * scheduled-job maps use the base segment as discriminator so same-named
53
+ * photon methods in different bases don't collide.
54
+ */
55
+ export function declaredKey(photon, method, workingDir) {
56
+ const base = workingDir ? path.resolve(workingDir) : '-';
57
+ return `${base}::${photon}:${method}`;
58
+ }
59
+ /**
60
+ * Identity key for the webhookRoutes map: `<resolved-base>::<photon>`.
61
+ * Webhook lookups from the HTTP handler pass only a photon name (they don't
62
+ * know the base), so callers that need cross-base search use
63
+ * `findMatching(map, photon)` over the values instead of a direct .get().
64
+ */
65
+ export function webhookKey(photon, workingDir) {
66
+ const base = workingDir ? path.resolve(workingDir) : '-';
67
+ return `${base}::${photon}`;
68
+ }
69
+ /**
70
+ * Identity key for proactivePhotonLocations — same shape as webhookKey,
71
+ * intentionally kept separate because the two maps hold different value
72
+ * types and could drift in the future.
73
+ */
74
+ export function locationKey(photon, workingDir) {
75
+ const base = workingDir ? path.resolve(workingDir) : '-';
76
+ return `${base}::${photon}`;
77
+ }
78
+ /**
79
+ * Iterate a base-scoped map and return every entry whose photon matches.
80
+ * Used by callers that only have a photon name in scope (HTTP webhook
81
+ * handler, IPC clients that don't pre-know the base).
82
+ */
83
+ export function findByPhoton(map, photon) {
84
+ const out = [];
85
+ for (const entry of map.values()) {
86
+ if (entry.photon === photon)
87
+ out.push(entry);
88
+ }
89
+ return out;
90
+ }
91
+ //# sourceMappingURL=registry-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-keys.js","sourceRoot":"","sources":["../../src/daemon/registry-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAoB7B;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,GAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,GAAkB,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,UAAkB,EAClB,UAA8B,EAC9B,WAAmB;IAEnB,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,UAAgC,CAAC;IACvF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,GAAG,UAAU,IAAI,OAAO,EAAwB,CAAC;AAC1D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAc,EAAE,UAAmB;IAC7E,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,GAAG,IAAI,KAAK,MAAM,IAAI,MAAM,EAAiB,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAAmB;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,GAAG,IAAI,KAAK,MAAM,EAAqB,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,UAAmB;IAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,GAAG,IAAI,KAAK,MAAM,EAAiB,CAAC;AAC7C,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,GAA+C,EAC/C,MAAc;IAEd,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}