@portel/photon 1.27.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -452,6 +452,39 @@ photon test # Run tests
452
452
  photon ps # Observe & control scheduled jobs, webhooks, sessions
453
453
  ```
454
454
 
455
+ ### `photon ps`: scheduled jobs, webhooks, and sessions
456
+
457
+ `photon ps` is the operator surface for the daemon. Without arguments
458
+ it prints a four-section snapshot — ACTIVE schedules, DECLARED-but-
459
+ not-enrolled, WEBHOOKS, and ACTIVE SESSIONS.
460
+
461
+ ```bash
462
+ photon ps # full snapshot
463
+ photon ps --json # structured output for scripts
464
+ photon ps --type active # one section only
465
+ photon ps --base ~/Projects/kith # filter to one PHOTON_DIR
466
+ ```
467
+
468
+ **Two-step model.** A `@scheduled` annotation in source is **DECLARED**
469
+ until enrolled. Enrollment is per-machine, persistent, and explicit:
470
+
471
+ ```bash
472
+ photon ps enable newsletter:sendDigest # DECLARED → ACTIVE
473
+ photon ps disable newsletter:sendDigest # ACTIVE → suppressed (survives restart)
474
+ photon ps pause newsletter:sendDigest # stop firing without removing enrollment
475
+ photon ps resume newsletter:sendDigest # undo pause
476
+ photon ps history newsletter:sendDigest # last 20 firings: timestamp, status, error
477
+ ```
478
+
479
+ For manual cron schedules without a `@scheduled` tag, use the Beam Pulse
480
+ panel ("Add schedule") or call `this.schedule.create()` from photon code.
481
+
482
+ `this.schedule.create()` (programmatic schedules) skips DECLARED and
483
+ goes straight to ACTIVE. See
484
+ [`docs/GUIDE.md#scheduling`](docs/GUIDE.md#scheduling-scheduled-thisschedule-photon-ps)
485
+ for the full reference, the daemon state layout, and `.photon-no-host`
486
+ for multi-host setups.
487
+
455
488
  ### Install from GitHub
456
489
 
457
490
  Use qualified refs to install and run photons directly from any GitHub repository:
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsF5D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqF5D"}
@@ -20,19 +20,18 @@ export function registerUpdateCommand(program) {
20
20
  try {
21
21
  const { printInfo, printSuccess, printWarning, printHeader, printError } = await import('../../cli-formatter.js');
22
22
  const { execSync } = await import('child_process');
23
- // 1. Check latest version
23
+ const { fetchLatestVersion } = await import('../../shared/npm-registry.js');
24
+ // 1. Check latest version. Hits registry.npmjs.org over HTTPS
25
+ // directly — shelling out to `npm view` failed under launchd PATH
26
+ // and reported the failure as "registry unreachable" (Bug 3, v1.27.0).
24
27
  let latestVersion = null;
25
28
  try {
26
29
  latestVersion = await runTask('Checking for updates', async () => {
27
- return execSync('npm view @portel/photon version', {
28
- encoding: 'utf-8',
29
- timeout: 10000,
30
- stdio: ['pipe', 'pipe', 'pipe'],
31
- }).trim();
30
+ return await fetchLatestVersion('@portel/photon');
32
31
  });
33
32
  }
34
- catch {
35
- printError('Could not reach npm registry');
33
+ catch (err) {
34
+ printError(`Could not check npm registry: ${getErrorMessage(err)}`);
36
35
  process.exit(1);
37
36
  }
38
37
  if (!latestVersion) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
@@ -3083,8 +3083,34 @@ async function handleRequest(request, socket) {
3083
3083
  workingDir: j.workingDir ?? defaultBase,
3084
3084
  createdBy: j.createdBy,
3085
3085
  }));
3086
+ // Resolve declared->active equivalence by (photon, method, cron, base).
3087
+ // The exact-key lookup `scheduledJobs.has(declaredKey(...))` only catches
3088
+ // a declaration that was enrolled via `photon ps enable` — it misses
3089
+ // the case where a photon ships BOTH `@scheduled` AND a legacy
3090
+ // `enable_schedule` that calls `this.schedule.create()`. The legacy
3091
+ // path keys jobs as `<photon>:sched:<uuid>`, so the declaration shows
3092
+ // up as DECLARED-not-enrolled even though an equivalent timer is
3093
+ // actively firing (Bug 5 in v1.27.0). Compare on the underlying
3094
+ // identity tuple so the CLI can suppress the cosmetic duplicate.
3086
3095
  const declared = Array.from(declaredSchedules.values()).map((d) => {
3087
3096
  const k = declaredKey(d.photon, d.method, d.workingDir);
3097
+ const declBase = d.workingDir ? path.resolve(d.workingDir) : defaultBase;
3098
+ let isActive = scheduledJobs.has(k);
3099
+ if (!isActive) {
3100
+ for (const job of scheduledJobs.values()) {
3101
+ if (job.photonName !== d.photon)
3102
+ continue;
3103
+ if (job.method !== d.method)
3104
+ continue;
3105
+ if (job.cron !== d.cron)
3106
+ continue;
3107
+ const jobBase = job.workingDir ? path.resolve(job.workingDir) : defaultBase;
3108
+ if (jobBase !== declBase)
3109
+ continue;
3110
+ isActive = true;
3111
+ break;
3112
+ }
3113
+ }
3088
3114
  return {
3089
3115
  key: k,
3090
3116
  photon: d.photon,
@@ -3092,7 +3118,7 @@ async function handleRequest(request, socket) {
3092
3118
  cron: d.cron,
3093
3119
  photonPath: d.photonPath,
3094
3120
  workingDir: d.workingDir ?? defaultBase,
3095
- active: scheduledJobs.has(k),
3121
+ active: isActive,
3096
3122
  };
3097
3123
  });
3098
3124
  const webhooks = [];