@portel/photon-core 2.23.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/base.d.ts +37 -0
  2. package/dist/base.d.ts.map +1 -1
  3. package/dist/base.js +71 -2
  4. package/dist/base.js.map +1 -1
  5. package/dist/description-sanitizer.d.ts +34 -0
  6. package/dist/description-sanitizer.d.ts.map +1 -0
  7. package/dist/description-sanitizer.js +80 -0
  8. package/dist/description-sanitizer.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/memory.d.ts.map +1 -1
  14. package/dist/memory.js +28 -0
  15. package/dist/memory.js.map +1 -1
  16. package/dist/middleware.d.ts.map +1 -1
  17. package/dist/middleware.js +96 -0
  18. package/dist/middleware.js.map +1 -1
  19. package/dist/mixins.d.ts.map +1 -1
  20. package/dist/mixins.js +9 -2
  21. package/dist/mixins.js.map +1 -1
  22. package/dist/photon-loader-lite.js +41 -0
  23. package/dist/photon-loader-lite.js.map +1 -1
  24. package/dist/schedule.d.ts +10 -1
  25. package/dist/schedule.d.ts.map +1 -1
  26. package/dist/schedule.js +20 -10
  27. package/dist/schedule.js.map +1 -1
  28. package/dist/schema-extractor.d.ts +2 -1
  29. package/dist/schema-extractor.d.ts.map +1 -1
  30. package/dist/schema-extractor.js +128 -14
  31. package/dist/schema-extractor.js.map +1 -1
  32. package/dist/types.d.ts +9 -1
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/types.js.map +1 -1
  35. package/package.json +2 -2
  36. package/src/base.ts +80 -2
  37. package/src/description-sanitizer.ts +102 -0
  38. package/src/index.ts +6 -0
  39. package/src/memory.ts +28 -0
  40. package/src/middleware.ts +98 -0
  41. package/src/mixins.ts +14 -2
  42. package/src/photon-loader-lite.ts +38 -0
  43. package/src/schedule.ts +26 -10
  44. package/src/schema-extractor.ts +140 -14
  45. package/src/types.ts +9 -0
package/dist/types.d.ts CHANGED
@@ -8,8 +8,9 @@
8
8
  * - Visualization: chart, chart:<type>, metric, gauge, timeline, dashboard, cart
9
9
  * - Content: json, markdown, yaml, xml, html, mermaid, code, code:<lang>, slides
10
10
  * - Container: panels, tabs, accordion, stack, columns
11
+ * - Declarative: a2ui (A2UI v0.9 JSONL — emits createSurface/updateComponents/updateDataModel)
11
12
  */
12
- export type OutputFormat = 'primitive' | 'table' | 'tree' | 'list' | 'none' | 'json' | 'markdown' | 'yaml' | 'xml' | 'html' | 'mermaid' | 'slides' | 'card' | 'grid' | 'chips' | 'kv' | 'qr' | 'chart' | `chart:${string}` | 'metric' | 'gauge' | 'timeline' | 'dashboard' | 'cart' | 'panels' | 'tabs' | 'accordion' | 'stack' | 'columns' | `code` | `code:${string}`;
13
+ export type OutputFormat = 'primitive' | 'table' | 'tree' | 'list' | 'none' | 'json' | 'markdown' | 'yaml' | 'xml' | 'html' | 'mermaid' | 'slides' | 'card' | 'grid' | 'chips' | 'kv' | 'qr' | 'chart' | `chart:${string}` | 'metric' | 'gauge' | 'timeline' | 'dashboard' | 'cart' | 'panels' | 'tabs' | 'accordion' | 'stack' | 'columns' | 'a2ui' | `code` | `code:${string}`;
13
14
  export interface PhotonTool {
14
15
  name: string;
15
16
  description: string;
@@ -288,6 +289,13 @@ export interface ConstructorParam {
288
289
  defaultValue?: any;
289
290
  /** True if type is string, number, or boolean (inject from env var) */
290
291
  isPrimitive: boolean;
292
+ /**
293
+ * Per-parameter JSDoc description, taken from an inline `/** ... *\/`
294
+ * comment immediately before the parameter, or from a constructor-level
295
+ * `@param <name>` tag when the inline form is absent. Used by the Beam
296
+ * Setup form for field help text.
297
+ */
298
+ description?: string;
291
299
  }
292
300
  /**
293
301
  * Injection type for constructor parameters
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6fH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAY,EAAE,CAAC,GAAe,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAa,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsgBH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAY,EAAE,CAAC,GAAe,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portel/photon-core",
3
- "version": "2.23.0",
3
+ "version": "2.24.0",
4
4
  "description": "Core library for parsing, loading, and managing .photon.ts files - runtime-agnostic foundation for building custom Photon runtimes",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "build": "tsc",
34
34
  "clean": "rm -rf dist",
35
35
  "prepublishOnly": "npm run clean && npm run build",
36
- "test": "npm run build && npx tsx tests/mixin.test.ts && npx tsx tests/channels.test.ts && npx tsx tests/shared-utils.test.ts && npx tsx tests/collections.test.ts && npx tsx tests/audit.test.ts && npx tsx tests/memory.test.ts && npx tsx tests/instance-store.test.ts && npx tsx tests/watcher.test.ts && npx tsx tests/photon-error.test.ts && npx tsx tests/bulkhead.test.ts",
36
+ "test": "npm run build && bash scripts/run-tests.sh",
37
37
  "test:channels": "npx tsx tests/channels.test.ts",
38
38
  "test:mixin": "npm run build && npx tsx tests/mixin.test.ts"
39
39
  },
package/src/base.ts CHANGED
@@ -71,6 +71,16 @@ export class Photon {
71
71
  */
72
72
  _photonNamespace?: string;
73
73
 
74
+ /**
75
+ * PHOTON_DIR this instance was loaded from - set by runtime loader.
76
+ * Pinned so .data/ resolves to the same root regardless of which
77
+ * process (CLI, daemon, worker) reads the photon back later. Without
78
+ * this pin, MemoryProvider falls back to getDefaultContext().baseDir
79
+ * and writes/reads can drift between cwd-derived locations.
80
+ * @internal
81
+ */
82
+ _baseDir?: string;
83
+
74
84
  /**
75
85
  * Absolute path to the .photon.ts/.photon.js source file - set by runtime loader
76
86
  * Used for storage() and assets() path resolution
@@ -78,6 +88,25 @@ export class Photon {
78
88
  */
79
89
  _photonFilePath?: string;
80
90
 
91
+ /**
92
+ * Stat snapshot captured when the current photon instance was loaded.
93
+ * Used by executeTool() to detect out-of-band edits so CLI-direct and
94
+ * lite-loader callers see new code immediately after a file save.
95
+ * See `_photonReloader` for the callback invoked on change.
96
+ * @internal
97
+ */
98
+ _photonSourceStat?: { mtimeMs: number; size: number; ino: number };
99
+
100
+ /**
101
+ * Callback the loader registers so executeTool() can trigger a live
102
+ * reload when `_photonFilePath` has changed since load. The loader is
103
+ * expected to re-evaluate the file, replace the cached module, and
104
+ * update `_photonSourceStat` on success. Missing callback means the
105
+ * gate is a no-op (the original behavior).
106
+ * @internal
107
+ */
108
+ _photonReloader?: () => Promise<void>;
109
+
81
110
  /**
82
111
  * Dynamic photon resolver - injected by runtime loader
83
112
  * Used by this.photon.use() for runtime photon access
@@ -153,7 +182,12 @@ export class Photon {
153
182
  .replace(/([A-Z])/g, '-$1')
154
183
  .toLowerCase()
155
184
  .replace(/^-/, '');
156
- this._memory = new MemoryProvider(name, this._sessionId, this._photonNamespace);
185
+ this._memory = new MemoryProvider(
186
+ name,
187
+ this._sessionId,
188
+ this._photonNamespace,
189
+ this._baseDir
190
+ );
157
191
  }
158
192
  return this._memory;
159
193
  }
@@ -197,7 +231,7 @@ export class Photon {
197
231
  .replace(/([A-Z])/g, '-$1')
198
232
  .toLowerCase()
199
233
  .replace(/^-/, '');
200
- this._schedule = new ScheduleProvider(name);
234
+ this._schedule = new ScheduleProvider(name, this._baseDir);
201
235
  }
202
236
  return this._schedule;
203
237
  }
@@ -624,6 +658,15 @@ export class Photon {
624
658
  * Execute a tool method
625
659
  */
626
660
  async executeTool(toolName: string, parameters: any, options?: { outputHandler?: (data: any) => void }): Promise<any> {
661
+ // Stat-gate: close the edit→dispatch race on non-daemon paths. The
662
+ // daemon has its own equivalent at src/daemon/server.ts; this runs
663
+ // for CLI-direct dispatch and for callers using the lite loader's
664
+ // programmatic photon() API. If the source file has changed since
665
+ // the instance was loaded, hand off to the loader-registered
666
+ // reloader before dispatching so the first call after a save sees
667
+ // the new code.
668
+ await this._statGateIfStale();
669
+
627
670
  const method = (this as any)[toolName];
628
671
 
629
672
  if (!method || typeof method !== 'function') {
@@ -642,6 +685,41 @@ export class Photon {
642
685
  });
643
686
  }
644
687
 
688
+ /**
689
+ * If a reloader is registered and the source file has changed since it
690
+ * was last loaded, invoke the reloader. Silent on missing file or
691
+ * reloader failure — dispatch continues on the stale instance rather
692
+ * than throwing for an observability concern.
693
+ */
694
+ private async _statGateIfStale(): Promise<void> {
695
+ const filePath = this._photonFilePath;
696
+ const reloader = this._photonReloader;
697
+ const cached = this._photonSourceStat;
698
+ if (!filePath || !reloader || !cached) return;
699
+ let current: { mtimeMs: number; size: number; ino: number } | null = null;
700
+ try {
701
+ const s = fs.statSync(filePath);
702
+ current = { mtimeMs: s.mtimeMs, size: s.size, ino: s.ino };
703
+ } catch {
704
+ // Source gone or unreadable — nothing to gate against. Dispatch
705
+ // will surface the missing-photon error through its own path.
706
+ return;
707
+ }
708
+ if (
709
+ current.mtimeMs === cached.mtimeMs &&
710
+ current.size === cached.size &&
711
+ current.ino === cached.ino
712
+ ) {
713
+ return;
714
+ }
715
+ try {
716
+ await reloader();
717
+ } catch {
718
+ // Reloader errors are non-fatal — keep running on the stale
719
+ // instance rather than making dispatch itself fail.
720
+ }
721
+ }
722
+
645
723
  /**
646
724
  * Invoke the onError observability hook with a bounded timeout. Never
647
725
  * suppresses the original error and never throws itself — a throw or
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Tool-description sanitizer.
3
+ *
4
+ * Defends against MCP tool-description poisoning (OWASP MCP #3) by stripping
5
+ * invisible codepoints and redacting embedded prompt-injection markers from
6
+ * JSDoc descriptions before they reach the model.
7
+ *
8
+ * Called by the schema extractor at parse time; any photon loaded via the
9
+ * runtime benefits automatically. Intentionally conservative — it only
10
+ * touches obvious attack patterns. Legitimate documentation does not use
11
+ * zero-width spaces or contain `[[SYSTEM: ...]]` directives.
12
+ */
13
+
14
+ /**
15
+ * Unicode ranges that are invisible to humans but preserved by LLM tokenizers.
16
+ * Stripped unconditionally — no legitimate doc string needs them.
17
+ *
18
+ * U+200B ZERO WIDTH SPACE
19
+ * U+200C ZERO WIDTH NON-JOINER
20
+ * U+200D ZERO WIDTH JOINER
21
+ * U+200E LEFT-TO-RIGHT MARK
22
+ * U+200F RIGHT-TO-LEFT MARK
23
+ * U+202A-E LRE/RLE/PDF/LRO/RLO (bidi override)
24
+ * U+2060 WORD JOINER
25
+ * U+2066-9 LRI/RLI/FSI/PDI (bidi isolate)
26
+ * U+FEFF ZERO WIDTH NO-BREAK SPACE (BOM)
27
+ */
28
+ const INVISIBLE_CHARS = /[\u200B-\u200F\u202A-\u202E\u2060\u2066-\u2069\uFEFF]/g;
29
+
30
+ /**
31
+ * Instruction-bracket patterns commonly used in tool-poisoning payloads.
32
+ * Each match is replaced with `[REDACTED]` and counted as a warning.
33
+ */
34
+ const INSTRUCTION_PATTERNS: Array<{ name: string; pattern: RegExp }> = [
35
+ // Bracketed system directives: [[SYSTEM: ...]], [INST] ... [/INST], <|im_start|>...<|im_end|>
36
+ { name: 'bracketed-system', pattern: /\[{1,2}\s*SYSTEM\s*:[^\]]*\]{1,2}/gi },
37
+ { name: 'llama-inst', pattern: /\[\/?INST\]/gi },
38
+ { name: 'chatml-tag', pattern: /<\|im_(?:start|end|sep)\|>/gi },
39
+ // Verbatim instruction phrases that only appear in jailbreaks, never in docs.
40
+ { name: 'ignore-previous', pattern: /\bignore\s+(?:all\s+|the\s+)?(?:previous|prior|above)\s+instructions?\b/gi },
41
+ { name: 'disregard-previous', pattern: /\bdisregard\s+(?:all\s+|the\s+)?(?:previous|prior|above)\b/gi },
42
+ { name: 'system-prompt-literal', pattern: /\bSYSTEM[_\s-]?PROMPT\b/g },
43
+ ];
44
+
45
+ /** Max length of a cleaned description. Anything longer is an attack surface. */
46
+ export const MAX_DESCRIPTION_LENGTH = 2000;
47
+
48
+ export interface SanitizerWarning {
49
+ /** Label of the rule that fired. */
50
+ rule: string;
51
+ /** Short slice of the matched text for forensics (capped at 80 chars). */
52
+ sample: string;
53
+ }
54
+
55
+ export interface SanitizeResult {
56
+ cleaned: string;
57
+ warnings: SanitizerWarning[];
58
+ /** Whether the string was truncated because it exceeded MAX_DESCRIPTION_LENGTH. */
59
+ truncated: boolean;
60
+ }
61
+
62
+ /**
63
+ * Strip invisible codepoints, redact instruction markers, and cap length.
64
+ * Idempotent: sanitize(sanitize(x).cleaned).cleaned === sanitize(x).cleaned
65
+ * so callers can apply it defensively without risking duplicate `[REDACTED]`
66
+ * tokens.
67
+ */
68
+ export function sanitizeDescription(input: string): SanitizeResult {
69
+ const warnings: SanitizerWarning[] = [];
70
+
71
+ // Step 1: strip invisibles. Counts as one warning if any were present.
72
+ const withoutInvisibles = input.replace(INVISIBLE_CHARS, (match) => {
73
+ warnings.push({ rule: 'invisible-char', sample: codepointSample(match) });
74
+ return '';
75
+ });
76
+
77
+ // Step 2: redact each known instruction pattern.
78
+ let redacted = withoutInvisibles;
79
+ for (const { name, pattern } of INSTRUCTION_PATTERNS) {
80
+ redacted = redacted.replace(pattern, (match) => {
81
+ warnings.push({ rule: name, sample: match.slice(0, 80) });
82
+ return '[REDACTED]';
83
+ });
84
+ }
85
+
86
+ // Step 3: cap length. An attacker-friendly 50KB description is itself a
87
+ // prompt-injection vector via context-window flooding (OWASP MCP #10).
88
+ let truncated = false;
89
+ if (redacted.length > MAX_DESCRIPTION_LENGTH) {
90
+ redacted = redacted.slice(0, MAX_DESCRIPTION_LENGTH) + '…';
91
+ truncated = true;
92
+ }
93
+
94
+ return { cleaned: redacted, warnings, truncated };
95
+ }
96
+
97
+ function codepointSample(s: string): string {
98
+ return Array.from(s)
99
+ .map((c) => 'U+' + c.codePointAt(0)!.toString(16).toUpperCase().padStart(4, '0'))
100
+ .join(',')
101
+ .slice(0, 80);
102
+ }
package/src/index.ts CHANGED
@@ -162,6 +162,12 @@ export { DependencyManager } from './dependency-manager.js';
162
162
 
163
163
  // Schema extraction
164
164
  export { SchemaExtractor, detectCapabilities, type PhotonCapability } from './schema-extractor.js';
165
+ export {
166
+ sanitizeDescription,
167
+ MAX_DESCRIPTION_LENGTH,
168
+ type SanitizerWarning,
169
+ type SanitizeResult,
170
+ } from './description-sanitizer.js';
165
171
 
166
172
  // Path resolution (Photon-specific paths)
167
173
  export {
package/src/memory.ts CHANGED
@@ -294,6 +294,33 @@ function findAndMigrateStrandedMemory(
294
294
  }
295
295
  }
296
296
 
297
+ /**
298
+ * Photons whose loader pinned a baseDir get deterministic paths regardless
299
+ * of which process reads them back. When baseDir is missing, getBase()
300
+ * silently falls back to PHOTON_DIR env or ~/.photon, which means the same
301
+ * photon can write to <repo>/.data/ from a CLI process and read from
302
+ * ~/.photon/.data/ from a daemon worker started in a different cwd. We
303
+ * warn once per photon so this drift is noticeable rather than silent.
304
+ *
305
+ * To suppress in test environments where the fallback is intentional, set
306
+ * PHOTON_MEMORY_NO_BASEDIR_WARN=1.
307
+ */
308
+ const _baseDirFallbackWarned = new Set<string>();
309
+ function warnIfBaseDirMissing(photonId: string, baseDir?: string): void {
310
+ if (baseDir) return;
311
+ if (process.env.PHOTON_MEMORY_NO_BASEDIR_WARN) return;
312
+ if (_baseDirFallbackWarned.has(photonId)) return;
313
+ _baseDirFallbackWarned.add(photonId);
314
+ process.stderr.write(
315
+ `[photon-core] memory.resolveDir for "${photonId}" got no baseDir — ` +
316
+ `falling back to PHOTON_DIR env or ~/.photon. If this photon was ` +
317
+ `loaded with a workingDir, the loader is failing to set ` +
318
+ `instance._baseDir. Symptom: writes from one process land at the ` +
319
+ `loader's baseDir but reads from another process land at the env ` +
320
+ `fallback. See memory-baseDir-resolution-bug for details.\n`
321
+ );
322
+ }
323
+
297
324
  function resolveDir(
298
325
  photonId: string,
299
326
  namespace: string,
@@ -301,6 +328,7 @@ function resolveDir(
301
328
  sessionId?: string,
302
329
  baseDir?: string
303
330
  ): string {
331
+ warnIfBaseDirMissing(photonId, baseDir);
304
332
  switch (scope) {
305
333
  case 'photon': {
306
334
  const newDir = getPhotonMemoryDir(namespace, photonId, baseDir);
package/src/middleware.ts CHANGED
@@ -674,6 +674,102 @@ const bulkheadMiddleware = defineMiddleware<{ maxConcurrent: number }>({
674
674
  },
675
675
  });
676
676
 
677
+ // --- mask (phase 85) ---
678
+ // Post-execution redaction pass. Rewrites named fields in the result with
679
+ // a masked placeholder before handoff to the transport layer. Defense
680
+ // against oversharing and accidental PII exposure (OWASP MCP #10).
681
+ // Runs AFTER execution, BEFORE __meta attachment (phase ≥ 85).
682
+
683
+ function maskValue(value: unknown, keys: string[], placeholder: string): unknown {
684
+ if (value === null || value === undefined) return value;
685
+ if (Array.isArray(value)) {
686
+ return value.map((v) => maskValue(v, keys, placeholder));
687
+ }
688
+ if (typeof value === 'object') {
689
+ const src = value as Record<string, unknown>;
690
+ const out: Record<string, unknown> = {};
691
+ for (const k of Object.keys(src)) {
692
+ if (keys.includes(k)) {
693
+ out[k] = placeholder;
694
+ } else {
695
+ out[k] = maskValue(src[k], keys, placeholder);
696
+ }
697
+ }
698
+ return out;
699
+ }
700
+ return value;
701
+ }
702
+
703
+ const maskMiddleware = defineMiddleware<{ fields: string[]; placeholder: string }>({
704
+ name: 'mask',
705
+ phase: 85,
706
+ parseShorthand(value: string) {
707
+ const fields = value
708
+ .split(/[,\s]+/)
709
+ .map((s) => s.trim())
710
+ .filter(Boolean);
711
+ return { fields, placeholder: '[REDACTED]' };
712
+ },
713
+ parseConfig(raw) {
714
+ const fields = (raw.fields || '')
715
+ .split(/[,\s]+/)
716
+ .map((s) => s.trim())
717
+ .filter(Boolean);
718
+ return { fields, placeholder: raw.placeholder?.trim() || '[REDACTED]' };
719
+ },
720
+ create(config, _state) {
721
+ return async (ctx, next) => {
722
+ const result = await next();
723
+ if (config.fields.length === 0) return result;
724
+ return maskValue(result, config.fields, config.placeholder);
725
+ };
726
+ },
727
+ });
728
+
729
+ // --- maxResponseBytes (phase 88) ---
730
+ // Caps the serialized response size. Hard truncates with a warning marker.
731
+ // Prevents context-window flooding (OWASP MCP #10) — an oversized result
732
+ // is an attack vector on its own even when the data is legitimate.
733
+ // Runs after @mask so the cap applies to the redacted payload.
734
+
735
+ const maxResponseBytesMiddleware = defineMiddleware<{ limit: number }>({
736
+ name: 'maxResponseBytes',
737
+ phase: 88,
738
+ parseShorthand(value: string) {
739
+ return { limit: Math.max(1, parseInt(value.trim(), 10) || 0) };
740
+ },
741
+ parseConfig(raw) {
742
+ const v = raw.limit || raw.bytes || raw.max;
743
+ return { limit: Math.max(1, parseInt(v || '0', 10) || 0) };
744
+ },
745
+ create(config, _state) {
746
+ return async (ctx, next) => {
747
+ const result = await next();
748
+ if (!config.limit || config.limit <= 0) return result;
749
+ let serialized: string;
750
+ try {
751
+ serialized = typeof result === 'string' ? result : JSON.stringify(result);
752
+ } catch {
753
+ return result; // unserializable → leave untouched
754
+ }
755
+ const byteLen = Buffer.byteLength(serialized, 'utf8');
756
+ if (byteLen <= config.limit) return result;
757
+ const truncated = serialized.slice(
758
+ 0,
759
+ Math.max(0, config.limit - 32)
760
+ );
761
+ return {
762
+ truncated: true,
763
+ reason: 'maxResponseBytes',
764
+ limit: config.limit,
765
+ originalBytes: byteLen,
766
+ tool: `${ctx.photon}.${ctx.tool}`,
767
+ preview: truncated,
768
+ };
769
+ };
770
+ },
771
+ });
772
+
677
773
  // ═══════════════════════════════════════════════════════════════════════════════
678
774
  // GLOBAL BUILT-IN REGISTRY
679
775
  // ═══════════════════════════════════════════════════════════════════════════════
@@ -691,6 +787,8 @@ builtinRegistry.register(queuedMiddleware);
691
787
  builtinRegistry.register(lockedMiddleware);
692
788
  builtinRegistry.register(timeoutMiddleware);
693
789
  builtinRegistry.register(retryableMiddleware);
790
+ builtinRegistry.register(maskMiddleware);
791
+ builtinRegistry.register(maxResponseBytesMiddleware);
694
792
 
695
793
  // ═══════════════════════════════════════════════════════════════════════════════
696
794
  // PIPELINE ASSEMBLY
package/src/mixins.ts CHANGED
@@ -58,6 +58,13 @@ export function withPhotonCapabilities<T extends Constructor>(Base: T): T {
58
58
  */
59
59
  _photonName?: string;
60
60
  _photonNamespace?: string;
61
+ /**
62
+ * PHOTON_DIR this instance was loaded from - set by runtime loader.
63
+ * Pinned so memory and other .data/-rooted state resolve to the same
64
+ * root regardless of which process reads back later.
65
+ * @internal
66
+ */
67
+ _baseDir?: string;
61
68
 
62
69
  /**
63
70
  * Session ID for session-scoped memory - set by runtime
@@ -113,7 +120,12 @@ export function withPhotonCapabilities<T extends Constructor>(Base: T): T {
113
120
  .replace(/([A-Z])/g, '-$1')
114
121
  .toLowerCase()
115
122
  .replace(/^-/, '');
116
- this._memory = new MemoryProvider(name, this._sessionId, this._photonNamespace);
123
+ this._memory = new MemoryProvider(
124
+ name,
125
+ this._sessionId,
126
+ this._photonNamespace,
127
+ this._baseDir
128
+ );
117
129
  }
118
130
  return this._memory;
119
131
  }
@@ -128,7 +140,7 @@ export function withPhotonCapabilities<T extends Constructor>(Base: T): T {
128
140
  .replace(/([A-Z])/g, '-$1')
129
141
  .toLowerCase()
130
142
  .replace(/^-/, '');
131
- this._schedule = new ScheduleProvider(name);
143
+ this._schedule = new ScheduleProvider(name, this._baseDir);
132
144
  }
133
145
  return this._schedule;
134
146
  }
@@ -269,6 +269,44 @@ async function loadPhotonInternal(
269
269
  // docs/internals/PHOTON-DIR-AND-NAMESPACE.md §3.
270
270
  instance._photonName = photonName;
271
271
  instance._photonNamespace = options.namespace ?? deriveNamespace(absolutePath, options.baseDir);
272
+ instance._baseDir = options.baseDir;
273
+ instance._photonFilePath = absolutePath;
274
+ // Stat-gate baseline. When executeTool() sees the source file has
275
+ // changed, it fires _photonReloader (registered just below) to swap
276
+ // in the fresh compile before dispatching.
277
+ try {
278
+ const s = fsSync.statSync(absolutePath);
279
+ instance._photonSourceStat = { mtimeMs: s.mtimeMs, size: s.size, ino: s.ino };
280
+ } catch {
281
+ // No stat — skip baselining so the gate is a no-op.
282
+ }
283
+ instance._photonReloader = async () => {
284
+ // Invalidate the cache entry, then re-run the whole load pipeline
285
+ // and copy public surface from the fresh instance onto the existing
286
+ // one. Callers already holding a reference to the proxy see new
287
+ // method behavior on the very next dispatch.
288
+ instanceCache.delete(cacheKey);
289
+ const fresh = (await photon(absolutePath, options)) as Record<string, any>;
290
+ // Refresh stat baseline on success so we don't re-trigger.
291
+ try {
292
+ const s = fsSync.statSync(absolutePath);
293
+ instance._photonSourceStat = { mtimeMs: s.mtimeMs, size: s.size, ino: s.ino };
294
+ } catch {
295
+ // ignore — next call will re-evaluate
296
+ }
297
+ // Rewire every own property from the fresh instance onto the
298
+ // live one. Prototype-level methods are re-looked-up through the
299
+ // instance's class on each dispatch via the proxy's method lookup,
300
+ // so they pick up the new code automatically. Own-property state
301
+ // (collections, explicit fields) gets refreshed here.
302
+ for (const key of Object.keys(fresh)) {
303
+ try {
304
+ (instance as Record<string, any>)[key] = fresh[key];
305
+ } catch {
306
+ // Read-only own property — skip; the proxy path will handle it.
307
+ }
308
+ }
309
+ };
272
310
  if (options.instanceName) {
273
311
  instance.instanceName = options.instanceName;
274
312
  }
package/src/schedule.ts CHANGED
@@ -139,9 +139,9 @@ function resolveCron(schedule: string): string {
139
139
 
140
140
  // ── Storage Helpers ────────────────────────────────────────────────────
141
141
 
142
- function photonScheduleDir(photonId: string, namespace?: string): string {
142
+ function photonScheduleDir(photonId: string, namespace?: string, baseDir?: string): string {
143
143
  const ns = namespace || 'local';
144
- const newDir = getPhotonSchedulesDir(ns, photonId);
144
+ const newDir = getPhotonSchedulesDir(ns, photonId, baseDir);
145
145
  if (!fsSync.existsSync(newDir)) {
146
146
  const legacyDir = getLegacySchedulesDir(photonId);
147
147
  if (fsSync.existsSync(legacyDir)) return legacyDir;
@@ -149,8 +149,8 @@ function photonScheduleDir(photonId: string, namespace?: string): string {
149
149
  return newDir;
150
150
  }
151
151
 
152
- function taskPath(photonId: string, taskId: string): string {
153
- return path.join(photonScheduleDir(photonId), `${taskId}.json`);
152
+ function taskPath(photonId: string, taskId: string, baseDir?: string): string {
153
+ return path.join(photonScheduleDir(photonId, undefined, baseDir), `${taskId}.json`);
154
154
  }
155
155
 
156
156
  async function ensureDir(dir: string): Promise<void> {
@@ -171,9 +171,19 @@ async function ensureDir(dir: string): Promise<void> {
171
171
  */
172
172
  export class ScheduleProvider {
173
173
  private _photonId: string;
174
+ private _baseDir?: string;
174
175
 
175
- constructor(photonId: string) {
176
+ /**
177
+ * @param photonId Photon identifier used as the bucket under .data/
178
+ * @param baseDir PHOTON_DIR the photon was loaded from. Pinned so
179
+ * schedule files stay under this base regardless of which process
180
+ * reads back later — mirrors the fix applied to MemoryProvider.
181
+ * Without it, photonScheduleDir falls through to PHOTON_DIR env or
182
+ * ~/.photon and schedule files drift across daemon restarts.
183
+ */
184
+ constructor(photonId: string, baseDir?: string) {
176
185
  this._photonId = photonId;
186
+ this._baseDir = baseDir;
177
187
  }
178
188
 
179
189
  /**
@@ -222,7 +232,10 @@ export class ScheduleProvider {
222
232
  */
223
233
  async get(taskId: string): Promise<ScheduledTask | null> {
224
234
  try {
225
- const content = await fs.readFile(taskPath(this._photonId, taskId), 'utf-8');
235
+ const content = await fs.readFile(
236
+ taskPath(this._photonId, taskId, this._baseDir),
237
+ 'utf-8'
238
+ );
226
239
  return JSON.parse(content) as ScheduledTask;
227
240
  } catch (err: any) {
228
241
  if (err.code === 'ENOENT') return null;
@@ -242,7 +255,7 @@ export class ScheduleProvider {
242
255
  * List all scheduled tasks, optionally filtered by status
243
256
  */
244
257
  async list(status?: ScheduleStatus): Promise<ScheduledTask[]> {
245
- const dir = photonScheduleDir(this._photonId);
258
+ const dir = photonScheduleDir(this._photonId, undefined, this._baseDir);
246
259
  let files: string[];
247
260
  try {
248
261
  files = await fs.readdir(dir);
@@ -323,7 +336,7 @@ export class ScheduleProvider {
323
336
  */
324
337
  async cancel(taskId: string): Promise<boolean> {
325
338
  try {
326
- await fs.unlink(taskPath(this._photonId, taskId));
339
+ await fs.unlink(taskPath(this._photonId, taskId, this._baseDir));
327
340
  return true;
328
341
  } catch (err: any) {
329
342
  if (err.code === 'ENOENT') return false;
@@ -362,8 +375,11 @@ export class ScheduleProvider {
362
375
 
363
376
  /** @internal */
364
377
  private async _save(task: ScheduledTask): Promise<void> {
365
- const dir = photonScheduleDir(this._photonId);
378
+ const dir = photonScheduleDir(this._photonId, undefined, this._baseDir);
366
379
  await ensureDir(dir);
367
- await fs.writeFile(taskPath(this._photonId, task.id), JSON.stringify(task, null, 2));
380
+ await fs.writeFile(
381
+ taskPath(this._photonId, task.id, this._baseDir),
382
+ JSON.stringify(task, null, 2)
383
+ );
368
384
  }
369
385
  }