@portel/photon-core 2.17.6 → 2.18.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 (71) hide show
  1. package/dist/audit.d.ts +4 -0
  2. package/dist/audit.d.ts.map +1 -1
  3. package/dist/audit.js +107 -36
  4. package/dist/audit.js.map +1 -1
  5. package/dist/base.d.ts +81 -12
  6. package/dist/base.d.ts.map +1 -1
  7. package/dist/base.js +80 -7
  8. package/dist/base.js.map +1 -1
  9. package/dist/compiler.d.ts.map +1 -1
  10. package/dist/compiler.js +9 -1
  11. package/dist/compiler.js.map +1 -1
  12. package/dist/config.d.ts +14 -28
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +48 -46
  15. package/dist/config.js.map +1 -1
  16. package/dist/data-paths.d.ts +115 -0
  17. package/dist/data-paths.d.ts.map +1 -0
  18. package/dist/data-paths.js +243 -0
  19. package/dist/data-paths.js.map +1 -0
  20. package/dist/dependency-manager.d.ts +1 -1
  21. package/dist/dependency-manager.d.ts.map +1 -1
  22. package/dist/dependency-manager.js +13 -5
  23. package/dist/dependency-manager.js.map +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +3 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/instance-store.d.ts +22 -11
  29. package/dist/instance-store.d.ts.map +1 -1
  30. package/dist/instance-store.js +63 -28
  31. package/dist/instance-store.js.map +1 -1
  32. package/dist/memory.d.ts +8 -6
  33. package/dist/memory.d.ts.map +1 -1
  34. package/dist/memory.js +49 -35
  35. package/dist/memory.js.map +1 -1
  36. package/dist/mixins.d.ts.map +1 -1
  37. package/dist/mixins.js +22 -3
  38. package/dist/mixins.js.map +1 -1
  39. package/dist/path-resolver.d.ts +3 -1
  40. package/dist/path-resolver.d.ts.map +1 -1
  41. package/dist/path-resolver.js +49 -2
  42. package/dist/path-resolver.js.map +1 -1
  43. package/dist/photon-loader-lite.d.ts +2 -0
  44. package/dist/photon-loader-lite.d.ts.map +1 -1
  45. package/dist/photon-loader-lite.js +3 -3
  46. package/dist/photon-loader-lite.js.map +1 -1
  47. package/dist/schedule.d.ts.map +1 -1
  48. package/dist/schedule.js +11 -7
  49. package/dist/schedule.js.map +1 -1
  50. package/dist/schema-extractor.js +1 -1
  51. package/dist/schema-extractor.js.map +1 -1
  52. package/dist/stateful.d.ts +2 -1
  53. package/dist/stateful.d.ts.map +1 -1
  54. package/dist/stateful.js +4 -3
  55. package/dist/stateful.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/audit.ts +111 -38
  58. package/src/base.ts +117 -19
  59. package/src/compiler.ts +10 -1
  60. package/src/config.ts +59 -46
  61. package/src/data-paths.ts +289 -0
  62. package/src/dependency-manager.ts +13 -5
  63. package/src/index.ts +4 -0
  64. package/src/instance-store.ts +70 -30
  65. package/src/memory.ts +60 -38
  66. package/src/mixins.ts +24 -3
  67. package/src/path-resolver.ts +52 -2
  68. package/src/photon-loader-lite.ts +5 -3
  69. package/src/schedule.ts +11 -7
  70. package/src/schema-extractor.ts +1 -1
  71. package/src/stateful.ts +5 -2
package/dist/config.d.ts CHANGED
@@ -1,63 +1,49 @@
1
1
  /**
2
2
  * Photon Configuration Utilities
3
3
  *
4
- * Provides standard config storage for photons that implement the configure() convention.
5
- * Config is stored at ~/.photon/{photonName}/config.json
4
+ * Provides standard config storage for photons.
5
+ * Config is stored at .data/{namespace}/{photonName}/config.json
6
6
  *
7
7
  * Usage in a Photon:
8
8
  * ```typescript
9
- * import { loadPhotonConfig, savePhotonConfig, getPhotonConfigPath } from '@portel/photon-core';
9
+ * import { loadPhotonConfig, savePhotonConfig } from '@portel/photon-core';
10
10
  *
11
11
  * export default class MyPhoton extends Photon {
12
12
  * async configure(params: { apiKey: string }) {
13
13
  * savePhotonConfig('my-photon', params);
14
14
  * return { success: true, config: params };
15
15
  * }
16
- *
17
- * async getConfig() {
18
- * return loadPhotonConfig('my-photon');
19
- * }
20
16
  * }
21
17
  * ```
22
18
  */
23
19
  /**
24
- * Get the config directory for photons
25
- * Default: ~/.photon/
20
+ * Get the config file path for a specific photon.
21
+ * Uses new .data/ layout, falls back to legacy path for reads.
26
22
  */
27
- export declare function getPhotonConfigDir(): string;
23
+ export declare function getPhotonConfigPath(photonName: string, namespace?: string): string;
28
24
  /**
29
- * Get the config file path for a specific photon
30
- * @param photonName The photon name (kebab-case)
31
- * @returns Path to config.json for this photon
25
+ * Get the config directory for photons (legacy compat)
26
+ * @deprecated Use getPhotonConfigPath with namespace instead
32
27
  */
33
- export declare function getPhotonConfigPath(photonName: string): string;
28
+ export declare function getPhotonConfigDir(): string;
34
29
  /**
35
30
  * Load configuration for a photon
36
- * @param photonName The photon name (kebab-case)
37
- * @param defaults Default values if config doesn't exist
38
- * @returns The config object or defaults
39
31
  */
40
- export declare function loadPhotonConfig<T extends Record<string, any>>(photonName: string, defaults?: T): T;
32
+ export declare function loadPhotonConfig<T extends Record<string, any>>(photonName: string, defaults?: T, namespace?: string): T;
41
33
  /**
42
- * Save configuration for a photon
43
- * @param photonName The photon name (kebab-case)
44
- * @param config The configuration object to save
34
+ * Save configuration for a photon (always writes to new .data/ path)
45
35
  */
46
- export declare function savePhotonConfig<T extends Record<string, any>>(photonName: string, config: T): void;
36
+ export declare function savePhotonConfig<T extends Record<string, any>>(photonName: string, config: T, namespace?: string): void;
47
37
  /**
48
38
  * Check if a photon has been configured
49
- * @param photonName The photon name (kebab-case)
50
- * @returns true if config file exists
51
39
  */
52
- export declare function hasPhotonConfig(photonName: string): boolean;
40
+ export declare function hasPhotonConfig(photonName: string, namespace?: string): boolean;
53
41
  /**
54
42
  * Delete configuration for a photon
55
- * @param photonName The photon name (kebab-case)
56
43
  */
57
- export declare function deletePhotonConfig(photonName: string): void;
44
+ export declare function deletePhotonConfig(photonName: string, namespace?: string): void;
58
45
  /**
59
46
  * List all configured photons
60
- * @returns Array of photon names that have config
61
47
  */
62
48
  export declare function listConfiguredPhotons(): string[];
63
49
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,CAAC,GACX,CAAC,CAkBH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,GACR,IAAI,CAUN;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAK3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAehD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAWlF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,CAAC,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,CAAC,CAgBH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,EACT,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CA6BhD"}
package/dist/config.js CHANGED
@@ -1,62 +1,59 @@
1
1
  /**
2
2
  * Photon Configuration Utilities
3
3
  *
4
- * Provides standard config storage for photons that implement the configure() convention.
5
- * Config is stored at ~/.photon/{photonName}/config.json
4
+ * Provides standard config storage for photons.
5
+ * Config is stored at .data/{namespace}/{photonName}/config.json
6
6
  *
7
7
  * Usage in a Photon:
8
8
  * ```typescript
9
- * import { loadPhotonConfig, savePhotonConfig, getPhotonConfigPath } from '@portel/photon-core';
9
+ * import { loadPhotonConfig, savePhotonConfig } from '@portel/photon-core';
10
10
  *
11
11
  * export default class MyPhoton extends Photon {
12
12
  * async configure(params: { apiKey: string }) {
13
13
  * savePhotonConfig('my-photon', params);
14
14
  * return { success: true, config: params };
15
15
  * }
16
- *
17
- * async getConfig() {
18
- * return loadPhotonConfig('my-photon');
19
- * }
20
16
  * }
21
17
  * ```
22
18
  */
23
19
  import * as fs from 'fs';
24
20
  import * as path from 'path';
25
- import * as os from 'os';
21
+ import { getPhotonConfigPath as getNewConfigPath, getLegacyPhotonConfigPath, getDataRoot, } from './data-paths.js';
26
22
  /**
27
- * Get the config directory for photons
28
- * Default: ~/.photon/
23
+ * Get the config file path for a specific photon.
24
+ * Uses new .data/ layout, falls back to legacy path for reads.
29
25
  */
30
- export function getPhotonConfigDir() {
31
- return process.env.PHOTON_CONFIG_DIR || path.join(os.homedir(), '.photon');
26
+ export function getPhotonConfigPath(photonName, namespace) {
27
+ const ns = namespace || 'local';
28
+ const newPath = getNewConfigPath(ns, photonName);
29
+ // Fallback: check legacy path for existing config
30
+ if (!fs.existsSync(newPath)) {
31
+ const legacyPath = getLegacyPhotonConfigPath(photonName);
32
+ if (fs.existsSync(legacyPath))
33
+ return legacyPath;
34
+ }
35
+ return newPath;
32
36
  }
33
37
  /**
34
- * Get the config file path for a specific photon
35
- * @param photonName The photon name (kebab-case)
36
- * @returns Path to config.json for this photon
38
+ * Get the config directory for photons (legacy compat)
39
+ * @deprecated Use getPhotonConfigPath with namespace instead
37
40
  */
38
- export function getPhotonConfigPath(photonName) {
39
- const safeName = photonName.replace(/[^a-zA-Z0-9_-]/g, '_');
40
- return path.join(getPhotonConfigDir(), safeName, 'config.json');
41
+ export function getPhotonConfigDir() {
42
+ return process.env.PHOTON_CONFIG_DIR || getDataRoot();
41
43
  }
42
44
  /**
43
45
  * Load configuration for a photon
44
- * @param photonName The photon name (kebab-case)
45
- * @param defaults Default values if config doesn't exist
46
- * @returns The config object or defaults
47
46
  */
48
- export function loadPhotonConfig(photonName, defaults) {
49
- const configPath = getPhotonConfigPath(photonName);
47
+ export function loadPhotonConfig(photonName, defaults, namespace) {
48
+ const configPath = getPhotonConfigPath(photonName, namespace);
50
49
  try {
51
50
  if (fs.existsSync(configPath)) {
52
51
  const content = fs.readFileSync(configPath, 'utf-8');
53
52
  const config = JSON.parse(content);
54
- // Merge with defaults
55
53
  return defaults ? { ...defaults, ...config } : config;
56
54
  }
57
55
  }
58
56
  catch (error) {
59
- // Log but don't throw - return defaults
60
57
  if (process.env.PHOTON_DEBUG) {
61
58
  console.error(`Failed to load config for ${photonName}:`, error);
62
59
  }
@@ -64,14 +61,12 @@ export function loadPhotonConfig(photonName, defaults) {
64
61
  return defaults || {};
65
62
  }
66
63
  /**
67
- * Save configuration for a photon
68
- * @param photonName The photon name (kebab-case)
69
- * @param config The configuration object to save
64
+ * Save configuration for a photon (always writes to new .data/ path)
70
65
  */
71
- export function savePhotonConfig(photonName, config) {
72
- const configPath = getPhotonConfigPath(photonName);
66
+ export function savePhotonConfig(photonName, config, namespace) {
67
+ const ns = namespace || 'local';
68
+ const configPath = getNewConfigPath(ns, photonName);
73
69
  const configDir = path.dirname(configPath);
74
- // Ensure directory exists
75
70
  if (!fs.existsSync(configDir)) {
76
71
  fs.mkdirSync(configDir, { recursive: true });
77
72
  }
@@ -79,39 +74,46 @@ export function savePhotonConfig(photonName, config) {
79
74
  }
80
75
  /**
81
76
  * Check if a photon has been configured
82
- * @param photonName The photon name (kebab-case)
83
- * @returns true if config file exists
84
77
  */
85
- export function hasPhotonConfig(photonName) {
86
- return fs.existsSync(getPhotonConfigPath(photonName));
78
+ export function hasPhotonConfig(photonName, namespace) {
79
+ return fs.existsSync(getPhotonConfigPath(photonName, namespace));
87
80
  }
88
81
  /**
89
82
  * Delete configuration for a photon
90
- * @param photonName The photon name (kebab-case)
91
83
  */
92
- export function deletePhotonConfig(photonName) {
93
- const configPath = getPhotonConfigPath(photonName);
84
+ export function deletePhotonConfig(photonName, namespace) {
85
+ const configPath = getPhotonConfigPath(photonName, namespace);
94
86
  if (fs.existsSync(configPath)) {
95
87
  fs.unlinkSync(configPath);
96
88
  }
97
89
  }
98
90
  /**
99
91
  * List all configured photons
100
- * @returns Array of photon names that have config
101
92
  */
102
93
  export function listConfiguredPhotons() {
103
- const configDir = getPhotonConfigDir();
104
- if (!fs.existsSync(configDir)) {
94
+ const dataRoot = getDataRoot();
95
+ if (!fs.existsSync(dataRoot)) {
105
96
  return [];
106
97
  }
98
+ const results = [];
107
99
  try {
108
- return fs.readdirSync(configDir, { withFileTypes: true })
109
- .filter(entry => entry.isDirectory())
110
- .filter(entry => fs.existsSync(path.join(configDir, entry.name, 'config.json')))
111
- .map(entry => entry.name);
100
+ // Scan namespace directories inside .data/
101
+ const nsDirs = fs.readdirSync(dataRoot, { withFileTypes: true })
102
+ .filter(e => e.isDirectory() && !e.name.startsWith('_') && !e.name.startsWith('.'));
103
+ for (const nsDir of nsDirs) {
104
+ const nsPath = path.join(dataRoot, nsDir.name);
105
+ const photonDirs = fs.readdirSync(nsPath, { withFileTypes: true })
106
+ .filter(e => e.isDirectory());
107
+ for (const pDir of photonDirs) {
108
+ if (fs.existsSync(path.join(nsPath, pDir.name, 'config.json'))) {
109
+ results.push(pDir.name);
110
+ }
111
+ }
112
+ }
112
113
  }
113
114
  catch {
114
- return [];
115
+ // Data root doesn't exist or is unreadable
115
116
  }
117
+ return results;
116
118
  }
117
119
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Central Data Path Resolver
3
+ *
4
+ * Single source of truth for ALL runtime data paths in photon.
5
+ * Everything lives under `.data/` inside the photon base directory.
6
+ *
7
+ * Structure:
8
+ * {baseDir}/.data/
9
+ * # Global
10
+ * daemon.sock / .pid / .log
11
+ * audit.jsonl
12
+ * .metadata.json
13
+ * .cache/
14
+ * _global/ ← global shared memory
15
+ * _sessions/{sessionId}/{ns}/{photon}/ ← session-scoped memory
16
+ * tasks/ ← ephemeral async task state
17
+ *
18
+ * # Per-photon (always namespaced)
19
+ * {namespace}/{photon-name}/
20
+ * state/{instance}/state.json + state.log
21
+ * memory/
22
+ * env.json
23
+ * context.json
24
+ * runs/
25
+ * logs/
26
+ * schedules/
27
+ * config.json
28
+ */
29
+ /** Root of all runtime data: {baseDir}/.data/ */
30
+ export declare function getDataRoot(baseDir?: string): string;
31
+ /** Per-photon data root: .data/{photonName}/ for local, .data/{namespace}/{photonName}/ for marketplace */
32
+ export declare function getPhotonDataDir(namespace: string, photonName: string, baseDir?: string): string;
33
+ /** Instance state file: .data/{ns}/{name}/state/{instance}/state.json */
34
+ export declare function getPhotonStatePath(namespace: string, photonName: string, instance: string, baseDir?: string): string;
35
+ /** Instance event log: .data/{ns}/{name}/state/{instance}/state.log */
36
+ export declare function getPhotonStateLogPath(namespace: string, photonName: string, instance: string, baseDir?: string): string;
37
+ /** Per-photon memory directory: .data/{ns}/{name}/memory/ */
38
+ export declare function getPhotonMemoryDir(namespace: string, photonName: string, baseDir?: string): string;
39
+ /** Per-photon env vars: .data/{ns}/{name}/env.json */
40
+ export declare function getPhotonEnvPath(namespace: string, photonName: string, baseDir?: string): string;
41
+ /** Current instance selector: .data/{ns}/{name}/context.json */
42
+ export declare function getPhotonContextPath(namespace: string, photonName: string, baseDir?: string): string;
43
+ /** Workflow checkpoint runs: .data/{ns}/{name}/runs/ */
44
+ export declare function getPhotonRunsDir(namespace: string, photonName: string, baseDir?: string): string;
45
+ /** Execution audit logs: .data/{ns}/{name}/logs/ */
46
+ export declare function getPhotonLogsDir(namespace: string, photonName: string, baseDir?: string): string;
47
+ /** Schedule definitions: .data/{ns}/{name}/schedules/ */
48
+ export declare function getPhotonSchedulesDir(namespace: string, photonName: string, baseDir?: string): string;
49
+ /** Per-photon config: .data/{ns}/{name}/config.json */
50
+ export declare function getPhotonConfigPath(namespace: string, photonName: string, baseDir?: string): string;
51
+ /** Global shared memory: .data/_global/ */
52
+ export declare function getGlobalMemoryDir(baseDir?: string): string;
53
+ /** Session-scoped memory: .data/_sessions/{sessionId}/{photon}/ or .data/_sessions/{sessionId}/{ns}/{photon}/ */
54
+ export declare function getSessionMemoryDir(sessionId: string, namespace: string, photonName: string, baseDir?: string): string;
55
+ /** Compilation & marketplace cache: .data/.cache/ */
56
+ export declare function getCacheDir(baseDir?: string): string;
57
+ /** Ephemeral async task state: .data/tasks/ */
58
+ export declare function getTasksDir(baseDir?: string): string;
59
+ /** Global audit log: .data/audit.jsonl */
60
+ export declare function getAuditPath(baseDir?: string): string;
61
+ /** Marketplace install metadata: .data/.metadata.json */
62
+ export declare function getMetadataPath(baseDir?: string): string;
63
+ /** Daemon socket: always ~/.photon/.data/daemon.sock (global, one per user) */
64
+ export declare function getDaemonSocketPath(): string;
65
+ /** Daemon PID file: always ~/.photon/.data/daemon.pid */
66
+ export declare function getDaemonPidPath(): string;
67
+ /** Daemon log file: always ~/.photon/.data/daemon.log */
68
+ export declare function getDaemonLogPath(): string;
69
+ /**
70
+ * Detect the namespace for a photon directory by reading git remote origin.
71
+ * Returns the owner/org from the remote URL, or '' if not a git repo.
72
+ *
73
+ * Examples:
74
+ * git@github.com:portel-dev/photons.git → 'portel-dev'
75
+ * https://github.com/arul-kumar/my-photons → 'arul-kumar'
76
+ * (no git remote) → ''
77
+ */
78
+ export declare function detectNamespace(dir: string): string;
79
+ /** Old state path: {baseDir}/state/{photonName}/{instance}.json */
80
+ export declare function getLegacyStatePath(photonName: string, instance: string, baseDir?: string): string;
81
+ /** Old state log: {baseDir}/state/{photonName}/{instance}.log */
82
+ export declare function getLegacyStateLogPath(photonName: string, instance: string, baseDir?: string): string;
83
+ /** Old context path: {baseDir}/context/{photonName}.json */
84
+ export declare function getLegacyContextPath(photonName: string, baseDir?: string): string;
85
+ /** Old env path: {baseDir}/env/{photonName}.json */
86
+ export declare function getLegacyEnvPath(photonName: string, baseDir?: string): string;
87
+ /** Old memory dir: {baseDir}/data/{photonId}/ */
88
+ export declare function getLegacyMemoryDir(photonName: string, baseDir?: string): string;
89
+ /** Old global memory: {baseDir}/data/_global/ */
90
+ export declare function getLegacyGlobalMemoryDir(baseDir?: string): string;
91
+ /** Old session memory: {baseDir}/sessions/{sessionId}/{photonId}/ */
92
+ export declare function getLegacySessionMemoryDir(sessionId: string, photonName: string, baseDir?: string): string;
93
+ /** Old runs dir: ~/.photon/runs/ */
94
+ export declare function getLegacyRunsDir(): string;
95
+ /** Old logs dir: ~/.photon/logs/{photonId}/ */
96
+ export declare function getLegacyLogsDir(photonName: string): string;
97
+ /** Old tasks dir: ~/.photon/tasks/ */
98
+ export declare function getLegacyTasksDir(): string;
99
+ /** Old audit path: ~/.photon/audit.jsonl */
100
+ export declare function getLegacyAuditPath(): string;
101
+ /** Old metadata path: {baseDir}/.metadata.json */
102
+ export declare function getLegacyMetadataPath(baseDir?: string): string;
103
+ /** Old daemon socket: ~/.photon/daemon.sock */
104
+ export declare function getLegacyDaemonSocketPath(): string;
105
+ /** Old daemon PID: ~/.photon/daemon.pid */
106
+ export declare function getLegacyDaemonPidPath(): string;
107
+ /** Old daemon log: ~/.photon/daemon.log */
108
+ export declare function getLegacyDaemonLogPath(): string;
109
+ /** Old cache dir: {baseDir}/.cache/ or {baseDir}/cache/ */
110
+ export declare function getLegacyCacheDir(baseDir?: string): string;
111
+ /** Old schedules dir: ~/.photon/schedules/{photonName}/ */
112
+ export declare function getLegacySchedulesDir(photonName: string): string;
113
+ /** Old per-photon config: ~/.photon/{photonName}/config.json */
114
+ export declare function getLegacyPhotonConfigPath(photonName: string): string;
115
+ //# sourceMappingURL=data-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-paths.d.ts","sourceRoot":"","sources":["../src/data-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Central Data Path Resolver
3
+ *
4
+ * Single source of truth for ALL runtime data paths in photon.
5
+ * Everything lives under `.data/` inside the photon base directory.
6
+ *
7
+ * Structure:
8
+ * {baseDir}/.data/
9
+ * # Global
10
+ * daemon.sock / .pid / .log
11
+ * audit.jsonl
12
+ * .metadata.json
13
+ * .cache/
14
+ * _global/ ← global shared memory
15
+ * _sessions/{sessionId}/{ns}/{photon}/ ← session-scoped memory
16
+ * tasks/ ← ephemeral async task state
17
+ *
18
+ * # Per-photon (always namespaced)
19
+ * {namespace}/{photon-name}/
20
+ * state/{instance}/state.json + state.log
21
+ * memory/
22
+ * env.json
23
+ * context.json
24
+ * runs/
25
+ * logs/
26
+ * schedules/
27
+ * config.json
28
+ */
29
+ import * as path from 'path';
30
+ import * as os from 'os';
31
+ import { execSync } from 'child_process';
32
+ const DEFAULT_BASE = path.join(os.homedir(), '.photon');
33
+ function getBase(baseDir) {
34
+ return baseDir || process.env.PHOTON_DIR || DEFAULT_BASE;
35
+ }
36
+ // ── Root ─────────────────────────────────────────────────────────────────────
37
+ /** Root of all runtime data: {baseDir}/.data/ */
38
+ export function getDataRoot(baseDir) {
39
+ return path.join(getBase(baseDir), '.data');
40
+ }
41
+ // ── Per-Photon ───────────────────────────────────────────────────────────────
42
+ /** Per-photon data root: .data/{photonName}/ for local, .data/{namespace}/{photonName}/ for marketplace */
43
+ export function getPhotonDataDir(namespace, photonName, baseDir) {
44
+ if (!namespace || namespace === 'local') {
45
+ return path.join(getDataRoot(baseDir), photonName);
46
+ }
47
+ return path.join(getDataRoot(baseDir), namespace, photonName);
48
+ }
49
+ /** Instance state file: .data/{ns}/{name}/state/{instance}/state.json */
50
+ export function getPhotonStatePath(namespace, photonName, instance, baseDir) {
51
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'state', instance || 'default', 'state.json');
52
+ }
53
+ /** Instance event log: .data/{ns}/{name}/state/{instance}/state.log */
54
+ export function getPhotonStateLogPath(namespace, photonName, instance, baseDir) {
55
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'state', instance || 'default', 'state.log');
56
+ }
57
+ /** Per-photon memory directory: .data/{ns}/{name}/memory/ */
58
+ export function getPhotonMemoryDir(namespace, photonName, baseDir) {
59
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'memory');
60
+ }
61
+ /** Per-photon env vars: .data/{ns}/{name}/env.json */
62
+ export function getPhotonEnvPath(namespace, photonName, baseDir) {
63
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'env.json');
64
+ }
65
+ /** Current instance selector: .data/{ns}/{name}/context.json */
66
+ export function getPhotonContextPath(namespace, photonName, baseDir) {
67
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'context.json');
68
+ }
69
+ /** Workflow checkpoint runs: .data/{ns}/{name}/runs/ */
70
+ export function getPhotonRunsDir(namespace, photonName, baseDir) {
71
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'runs');
72
+ }
73
+ /** Execution audit logs: .data/{ns}/{name}/logs/ */
74
+ export function getPhotonLogsDir(namespace, photonName, baseDir) {
75
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'logs');
76
+ }
77
+ /** Schedule definitions: .data/{ns}/{name}/schedules/ */
78
+ export function getPhotonSchedulesDir(namespace, photonName, baseDir) {
79
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'schedules');
80
+ }
81
+ /** Per-photon config: .data/{ns}/{name}/config.json */
82
+ export function getPhotonConfigPath(namespace, photonName, baseDir) {
83
+ return path.join(getPhotonDataDir(namespace, photonName, baseDir), 'config.json');
84
+ }
85
+ // ── Global ───────────────────────────────────────────────────────────────────
86
+ /** Global shared memory: .data/_global/ */
87
+ export function getGlobalMemoryDir(baseDir) {
88
+ return path.join(getDataRoot(baseDir), '_global');
89
+ }
90
+ /** Session-scoped memory: .data/_sessions/{sessionId}/{photon}/ or .data/_sessions/{sessionId}/{ns}/{photon}/ */
91
+ export function getSessionMemoryDir(sessionId, namespace, photonName, baseDir) {
92
+ const safeSession = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');
93
+ if (!namespace || namespace === 'local') {
94
+ return path.join(getDataRoot(baseDir), '_sessions', safeSession, photonName);
95
+ }
96
+ return path.join(getDataRoot(baseDir), '_sessions', safeSession, namespace, photonName);
97
+ }
98
+ /** Compilation & marketplace cache: .data/.cache/ */
99
+ export function getCacheDir(baseDir) {
100
+ return path.join(getDataRoot(baseDir), '.cache');
101
+ }
102
+ /** Ephemeral async task state: .data/tasks/ */
103
+ export function getTasksDir(baseDir) {
104
+ return path.join(getDataRoot(baseDir), 'tasks');
105
+ }
106
+ /** Global audit log: .data/audit.jsonl */
107
+ export function getAuditPath(baseDir) {
108
+ return path.join(getDataRoot(baseDir), 'audit.jsonl');
109
+ }
110
+ /** Marketplace install metadata: .data/.metadata.json */
111
+ export function getMetadataPath(baseDir) {
112
+ return path.join(getDataRoot(baseDir), '.metadata.json');
113
+ }
114
+ // ── Daemon (always global ~/.photon/.data/) ──────────────────────────────────
115
+ /** Daemon socket: always ~/.photon/.data/daemon.sock (global, one per user) */
116
+ export function getDaemonSocketPath() {
117
+ if (process.platform === 'win32') {
118
+ return '\\\\.\\pipe\\photon-daemon';
119
+ }
120
+ return path.join(DEFAULT_BASE, '.data', 'daemon.sock');
121
+ }
122
+ /** Daemon PID file: always ~/.photon/.data/daemon.pid */
123
+ export function getDaemonPidPath() {
124
+ return path.join(DEFAULT_BASE, '.data', 'daemon.pid');
125
+ }
126
+ /** Daemon log file: always ~/.photon/.data/daemon.log */
127
+ export function getDaemonLogPath() {
128
+ return path.join(DEFAULT_BASE, '.data', 'daemon.log');
129
+ }
130
+ // ── Namespace Detection ──────────────────────────────────────────────────────
131
+ /**
132
+ * Detect the namespace for a photon directory by reading git remote origin.
133
+ * Returns the owner/org from the remote URL, or '' if not a git repo.
134
+ *
135
+ * Examples:
136
+ * git@github.com:portel-dev/photons.git → 'portel-dev'
137
+ * https://github.com/arul-kumar/my-photons → 'arul-kumar'
138
+ * (no git remote) → ''
139
+ */
140
+ export function detectNamespace(dir) {
141
+ try {
142
+ const remote = execSync('git remote get-url origin', {
143
+ cwd: dir,
144
+ encoding: 'utf-8',
145
+ timeout: 3000,
146
+ stdio: ['pipe', 'pipe', 'pipe'],
147
+ }).trim();
148
+ // SSH: git@github.com:owner/repo.git
149
+ const sshMatch = remote.match(/git@[^:]+:([^/]+)\//);
150
+ if (sshMatch)
151
+ return sshMatch[1];
152
+ // HTTPS: https://github.com/owner/repo[.git]
153
+ const httpsMatch = remote.match(/https?:\/\/[^/]+\/([^/]+)\//);
154
+ if (httpsMatch)
155
+ return httpsMatch[1];
156
+ }
157
+ catch {
158
+ // Not a git repo or no remote — expected
159
+ }
160
+ return '';
161
+ }
162
+ // ── Legacy Path Helpers (for migration fallback) ─────────────────────────────
163
+ /** Old state path: {baseDir}/state/{photonName}/{instance}.json */
164
+ export function getLegacyStatePath(photonName, instance, baseDir) {
165
+ return path.join(getBase(baseDir), 'state', photonName, `${instance || 'default'}.json`);
166
+ }
167
+ /** Old state log: {baseDir}/state/{photonName}/{instance}.log */
168
+ export function getLegacyStateLogPath(photonName, instance, baseDir) {
169
+ return path.join(getBase(baseDir), 'state', photonName, `${instance || 'default'}.log`);
170
+ }
171
+ /** Old context path: {baseDir}/context/{photonName}.json */
172
+ export function getLegacyContextPath(photonName, baseDir) {
173
+ return path.join(getBase(baseDir), 'context', `${photonName}.json`);
174
+ }
175
+ /** Old env path: {baseDir}/env/{photonName}.json */
176
+ export function getLegacyEnvPath(photonName, baseDir) {
177
+ return path.join(getBase(baseDir), 'env', `${photonName}.json`);
178
+ }
179
+ /** Old memory dir: {baseDir}/data/{photonId}/ */
180
+ export function getLegacyMemoryDir(photonName, baseDir) {
181
+ const safeName = photonName.replace(/[^a-zA-Z0-9_-]/g, '_');
182
+ return path.join(getBase(baseDir), 'data', safeName);
183
+ }
184
+ /** Old global memory: {baseDir}/data/_global/ */
185
+ export function getLegacyGlobalMemoryDir(baseDir) {
186
+ return path.join(getBase(baseDir), 'data', '_global');
187
+ }
188
+ /** Old session memory: {baseDir}/sessions/{sessionId}/{photonId}/ */
189
+ export function getLegacySessionMemoryDir(sessionId, photonName, baseDir) {
190
+ const safeName = photonName.replace(/[^a-zA-Z0-9_-]/g, '_');
191
+ const safeSession = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');
192
+ return path.join(getBase(baseDir), 'sessions', safeSession, safeName);
193
+ }
194
+ /** Old runs dir: ~/.photon/runs/ */
195
+ export function getLegacyRunsDir() {
196
+ return path.join(DEFAULT_BASE, 'runs');
197
+ }
198
+ /** Old logs dir: ~/.photon/logs/{photonId}/ */
199
+ export function getLegacyLogsDir(photonName) {
200
+ return path.join(DEFAULT_BASE, 'logs', photonName);
201
+ }
202
+ /** Old tasks dir: ~/.photon/tasks/ */
203
+ export function getLegacyTasksDir() {
204
+ return path.join(DEFAULT_BASE, 'tasks');
205
+ }
206
+ /** Old audit path: ~/.photon/audit.jsonl */
207
+ export function getLegacyAuditPath() {
208
+ return path.join(DEFAULT_BASE, 'audit.jsonl');
209
+ }
210
+ /** Old metadata path: {baseDir}/.metadata.json */
211
+ export function getLegacyMetadataPath(baseDir) {
212
+ return path.join(getBase(baseDir), '.metadata.json');
213
+ }
214
+ /** Old daemon socket: ~/.photon/daemon.sock */
215
+ export function getLegacyDaemonSocketPath() {
216
+ if (process.platform === 'win32') {
217
+ return '\\\\.\\pipe\\photon-daemon';
218
+ }
219
+ return path.join(DEFAULT_BASE, 'daemon.sock');
220
+ }
221
+ /** Old daemon PID: ~/.photon/daemon.pid */
222
+ export function getLegacyDaemonPidPath() {
223
+ return path.join(DEFAULT_BASE, 'daemon.pid');
224
+ }
225
+ /** Old daemon log: ~/.photon/daemon.log */
226
+ export function getLegacyDaemonLogPath() {
227
+ return path.join(DEFAULT_BASE, 'daemon.log');
228
+ }
229
+ /** Old cache dir: {baseDir}/.cache/ or {baseDir}/cache/ */
230
+ export function getLegacyCacheDir(baseDir) {
231
+ return path.join(getBase(baseDir), '.cache');
232
+ }
233
+ /** Old schedules dir: ~/.photon/schedules/{photonName}/ */
234
+ export function getLegacySchedulesDir(photonName) {
235
+ const safeName = photonName.replace(/[^a-zA-Z0-9_-]/g, '_');
236
+ return path.join(DEFAULT_BASE, 'schedules', safeName);
237
+ }
238
+ /** Old per-photon config: ~/.photon/{photonName}/config.json */
239
+ export function getLegacyPhotonConfigPath(photonName) {
240
+ const safeName = photonName.replace(/[^a-zA-Z0-9_-]/g, '_');
241
+ return path.join(DEFAULT_BASE, safeName, 'config.json');
242
+ }
243
+ //# sourceMappingURL=data-paths.js.map