@portel/photon 1.16.1 → 1.17.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 (120) hide show
  1. package/dist/auto-ui/beam/external-mcp.d.ts.map +1 -1
  2. package/dist/auto-ui/beam/routes/api-browse.d.ts.map +1 -1
  3. package/dist/auto-ui/beam/routes/api-browse.js +28 -7
  4. package/dist/auto-ui/beam/routes/api-browse.js.map +1 -1
  5. package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
  6. package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
  7. package/dist/auto-ui/beam/types.d.ts.map +1 -1
  8. package/dist/auto-ui/beam.d.ts.map +1 -1
  9. package/dist/auto-ui/beam.js +35 -42
  10. package/dist/auto-ui/beam.js.map +1 -1
  11. package/dist/auto-ui/bridge/index.d.ts.map +1 -1
  12. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  13. package/dist/auto-ui/bridge/renderers.js +202 -13
  14. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  15. package/dist/auto-ui/components/checklist.d.ts +13 -0
  16. package/dist/auto-ui/components/checklist.d.ts.map +1 -0
  17. package/dist/auto-ui/components/checklist.js +48 -0
  18. package/dist/auto-ui/components/checklist.js.map +1 -0
  19. package/dist/auto-ui/photon-host.d.ts +0 -1
  20. package/dist/auto-ui/photon-host.d.ts.map +1 -1
  21. package/dist/auto-ui/photon-host.js +0 -3
  22. package/dist/auto-ui/photon-host.js.map +1 -1
  23. package/dist/auto-ui/platform-compat.js.map +1 -1
  24. package/dist/auto-ui/playground-html.js +1 -1
  25. package/dist/auto-ui/playground-html.js.map +1 -1
  26. package/dist/auto-ui/registry.d.ts.map +1 -1
  27. package/dist/auto-ui/registry.js +2 -0
  28. package/dist/auto-ui/registry.js.map +1 -1
  29. package/dist/auto-ui/rendering/template-engine.d.ts.map +1 -1
  30. package/dist/auto-ui/rendering/template-engine.js +0 -3
  31. package/dist/auto-ui/rendering/template-engine.js.map +1 -1
  32. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  33. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  34. package/dist/auto-ui/types.d.ts +1 -1
  35. package/dist/auto-ui/types.d.ts.map +1 -1
  36. package/dist/auto-ui/types.js.map +1 -1
  37. package/dist/beam-form.bundle.js +131 -0
  38. package/dist/beam-form.bundle.js.map +2 -2
  39. package/dist/beam.bundle.js +3988 -84
  40. package/dist/beam.bundle.js.map +4 -4
  41. package/dist/cli/commands/config.js +2 -2
  42. package/dist/cli/commands/config.js.map +1 -1
  43. package/dist/cli/commands/daemon.js +4 -4
  44. package/dist/cli/commands/daemon.js.map +1 -1
  45. package/dist/cli/commands/init.d.ts.map +1 -1
  46. package/dist/cli/commands/init.js +0 -1
  47. package/dist/cli/commands/init.js.map +1 -1
  48. package/dist/cli/commands/mcp.d.ts.map +1 -1
  49. package/dist/cli/commands/mcp.js.map +1 -1
  50. package/dist/cli/commands/package.d.ts.map +1 -1
  51. package/dist/cli/commands/package.js +10 -3
  52. package/dist/cli/commands/package.js.map +1 -1
  53. package/dist/cli/commands/run.d.ts.map +1 -1
  54. package/dist/cli/commands/run.js.map +1 -1
  55. package/dist/cli/commands/update.d.ts.map +1 -1
  56. package/dist/cli/commands/update.js +1 -2
  57. package/dist/cli/commands/update.js.map +1 -1
  58. package/dist/daemon/client.d.ts.map +1 -1
  59. package/dist/daemon/client.js +0 -2
  60. package/dist/daemon/client.js.map +1 -1
  61. package/dist/daemon/server.js +321 -22
  62. package/dist/daemon/server.js.map +1 -1
  63. package/dist/loader.d.ts +0 -2
  64. package/dist/loader.d.ts.map +1 -1
  65. package/dist/loader.js +15 -21
  66. package/dist/loader.js.map +1 -1
  67. package/dist/marketplace-manager.d.ts +14 -0
  68. package/dist/marketplace-manager.d.ts.map +1 -1
  69. package/dist/marketplace-manager.js +146 -26
  70. package/dist/marketplace-manager.js.map +1 -1
  71. package/dist/namespace-migration.d.ts.map +1 -1
  72. package/dist/namespace-migration.js +0 -12
  73. package/dist/namespace-migration.js.map +1 -1
  74. package/dist/path-resolver.js.map +1 -1
  75. package/dist/photon-cli-runner.d.ts.map +1 -1
  76. package/dist/photon-cli-runner.js +18 -24
  77. package/dist/photon-cli-runner.js.map +1 -1
  78. package/dist/photon-doc-extractor.d.ts.map +1 -1
  79. package/dist/photon-doc-extractor.js +0 -1
  80. package/dist/photon-doc-extractor.js.map +1 -1
  81. package/dist/photons/maker.photon.d.ts +0 -1
  82. package/dist/photons/maker.photon.d.ts.map +1 -1
  83. package/dist/photons/maker.photon.js +1 -4
  84. package/dist/photons/maker.photon.js.map +1 -1
  85. package/dist/photons/maker.photon.ts +1 -5
  86. package/dist/photons/marketplace.photon.d.ts +1 -2
  87. package/dist/photons/marketplace.photon.d.ts.map +1 -1
  88. package/dist/photons/marketplace.photon.js +2 -3
  89. package/dist/photons/marketplace.photon.js.map +1 -1
  90. package/dist/photons/marketplace.photon.ts +2 -5
  91. package/dist/serv/auth/oauth.d.ts.map +1 -1
  92. package/dist/serv/auth/oauth.js.map +1 -1
  93. package/dist/serv/local.d.ts.map +1 -1
  94. package/dist/serv/local.js +1 -1
  95. package/dist/serv/local.js.map +1 -1
  96. package/dist/serv/middleware/auth.d.ts.map +1 -1
  97. package/dist/serv/middleware/auth.js.map +1 -1
  98. package/dist/serv/runtime/oauth-context.d.ts +0 -1
  99. package/dist/serv/runtime/oauth-context.d.ts.map +1 -1
  100. package/dist/serv/runtime/oauth-context.js +0 -2
  101. package/dist/serv/runtime/oauth-context.js.map +1 -1
  102. package/dist/serv/vault/token-vault.d.ts +0 -1
  103. package/dist/serv/vault/token-vault.d.ts.map +1 -1
  104. package/dist/serv/vault/token-vault.js +0 -2
  105. package/dist/serv/vault/token-vault.js.map +1 -1
  106. package/dist/server.d.ts.map +1 -1
  107. package/dist/server.js +4 -4
  108. package/dist/server.js.map +1 -1
  109. package/dist/shared/io.d.ts +33 -0
  110. package/dist/shared/io.d.ts.map +1 -0
  111. package/dist/shared/io.js +88 -0
  112. package/dist/shared/io.js.map +1 -0
  113. package/dist/tasks/store.d.ts.map +1 -1
  114. package/dist/tasks/store.js +7 -6
  115. package/dist/tasks/store.js.map +1 -1
  116. package/dist/template-manager.d.ts +0 -1
  117. package/dist/template-manager.d.ts.map +1 -1
  118. package/dist/template-manager.js +0 -2
  119. package/dist/template-manager.js.map +1 -1
  120. package/package.json +2 -1
package/dist/loader.js CHANGED
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import * as fs from 'fs/promises';
7
7
  import { realpathSync, existsSync, mkdirSync, symlinkSync, readFileSync } from 'fs';
8
+ import { readText, readJSON, writeText, writeJSON } from './shared/io.js';
8
9
  import { createRequire } from 'module';
9
10
  import * as path from 'path';
10
11
  import { pathToFileURL } from 'url';
@@ -185,8 +186,6 @@ export class PhotonLoader {
185
186
  mcpClients = new Map();
186
187
  /** In-flight MCP client creation promises — dedup concurrent creates for the same dep */
187
188
  mcpClientPromises = new Map();
188
- /** SDK factory for MCP connections */
189
- sdkFactory;
190
189
  /** Cached MCP config from ~/.photon/config.json */
191
190
  mcpConfig;
192
191
  /** Inflight config load promise (dedup concurrent calls) */
@@ -309,7 +308,7 @@ export class PhotonLoader {
309
308
  : crypto.createHash('sha256').update(content).digest('hex').slice(0, 12);
310
309
  const safeLabel = this.sanitizeCacheLabel(label);
311
310
  const cachePath = path.join(cacheDir, `${safeLabel}.${hash}.photon.ts`);
312
- await fs.writeFile(cachePath, content, 'utf-8');
311
+ await writeText(cachePath, content);
313
312
  return cachePath;
314
313
  }
315
314
  async runCommand(command, args, cwd) {
@@ -357,8 +356,7 @@ export class PhotonLoader {
357
356
  }
358
357
  async readDependencyMetadata(cacheKey) {
359
358
  try {
360
- const data = await fs.readFile(this.getDependencyMetadataPath(cacheKey), 'utf-8');
361
- return JSON.parse(data);
359
+ return await readJSON(this.getDependencyMetadataPath(cacheKey));
362
360
  }
363
361
  catch (error) {
364
362
  this.logger.debug('Failed to read dependency metadata', { error });
@@ -390,12 +388,12 @@ export class PhotonLoader {
390
388
  async writeDependencyMetadata(cacheKey, hash, dependencies, photonPath, photonCoreVersion) {
391
389
  const metadataPath = this.getDependencyMetadataPath(cacheKey);
392
390
  await fs.mkdir(path.dirname(metadataPath), { recursive: true });
393
- await fs.writeFile(metadataPath, JSON.stringify({
391
+ await writeJSON(metadataPath, {
394
392
  hash,
395
393
  dependencies,
396
394
  photonPath: photonPath ? path.resolve(photonPath) : undefined,
397
395
  photonCoreVersion,
398
- }, null, 2), 'utf-8');
396
+ });
399
397
  }
400
398
  async ensureDependenciesWithHash(cacheKey, mcpName, dependencies, sourceHash, photonPath) {
401
399
  const metadata = await this.readDependencyMetadata(cacheKey);
@@ -521,7 +519,7 @@ export class PhotonLoader {
521
519
  let mcpName = '';
522
520
  let cacheKey = null;
523
521
  if (absolutePath.endsWith('.ts')) {
524
- tsContent = await fs.readFile(absolutePath, 'utf-8');
522
+ tsContent = await readText(absolutePath);
525
523
  // Check runtime version compatibility
526
524
  const requiredRuntime = parseRuntimeRequirement(tsContent);
527
525
  if (requiredRuntime) {
@@ -818,7 +816,7 @@ export class PhotonLoader {
818
816
  const instName = file.replace('.json', '');
819
817
  const statePath = path.join(stateDir, file);
820
818
  try {
821
- const snapshot = JSON.parse(await fs.readFile(statePath, 'utf-8'));
819
+ const snapshot = await readJSON(statePath);
822
820
  const stat = await fs.stat(statePath);
823
821
  yield {
824
822
  name: instName,
@@ -1267,7 +1265,7 @@ export class PhotonLoader {
1267
1265
  const absolutePath = path.resolve(filePath);
1268
1266
  if (absolutePath.endsWith('.ts')) {
1269
1267
  // Clear the compiled cache
1270
- const tsContent = await fs.readFile(absolutePath, 'utf-8');
1268
+ const tsContent = await readText(absolutePath);
1271
1269
  const hash = crypto.createHash('sha256').update(tsContent).digest('hex').slice(0, 16);
1272
1270
  const mcpName = path.basename(absolutePath, '.ts').replace('.photon', '');
1273
1271
  const cacheKey = this.getCacheKey(mcpName, absolutePath);
@@ -1401,8 +1399,7 @@ export class PhotonLoader {
1401
1399
  // First, try loading from manual schema override file
1402
1400
  const schemaJsonPath = sourceFilePath.replace(/\.ts$/, '.schema.json');
1403
1401
  try {
1404
- const schemaContent = await fs.readFile(schemaJsonPath, 'utf-8');
1405
- const schemas = JSON.parse(schemaContent);
1402
+ const schemas = await readJSON(schemaJsonPath);
1406
1403
  // Process tools
1407
1404
  if (schemas.tools) {
1408
1405
  for (const schema of schemas.tools) {
@@ -1458,7 +1455,7 @@ export class PhotonLoader {
1458
1455
  jsonError.code === 'ENOENT';
1459
1456
  if (isNotFound) {
1460
1457
  const extractor = new SchemaExtractor();
1461
- const source = sourceContent || (await fs.readFile(sourceFilePath, 'utf-8'));
1458
+ const source = sourceContent || (await readText(sourceFilePath));
1462
1459
  const metadata = extractor.extractAllFromSource(source);
1463
1460
  // Filter by method names that exist in the class
1464
1461
  tools = metadata.tools.filter((t) => methodNames.includes(t.name));
@@ -1526,8 +1523,7 @@ export class PhotonLoader {
1526
1523
  async loadSettings(photonName, instanceName) {
1527
1524
  const settingsPath = this.getSettingsPath(photonName, instanceName);
1528
1525
  try {
1529
- const data = await fs.readFile(settingsPath, 'utf-8');
1530
- return JSON.parse(data);
1526
+ return await readJSON(settingsPath);
1531
1527
  }
1532
1528
  catch {
1533
1529
  return {};
@@ -1540,7 +1536,7 @@ export class PhotonLoader {
1540
1536
  const settingsPath = this.getSettingsPath(photonName, instanceName);
1541
1537
  const dir = path.dirname(settingsPath);
1542
1538
  await fs.mkdir(dir, { recursive: true });
1543
- await fs.writeFile(settingsPath, JSON.stringify(values, null, 2));
1539
+ await writeJSON(settingsPath, values);
1544
1540
  }
1545
1541
  /**
1546
1542
  * Inject settings into a photon instance:
@@ -1704,7 +1700,7 @@ export class PhotonLoader {
1704
1700
  */
1705
1701
  async extractConstructorParams(filePath) {
1706
1702
  try {
1707
- const source = await fs.readFile(filePath, 'utf-8');
1703
+ const source = await readText(filePath);
1708
1704
  const extractor = new SchemaExtractor();
1709
1705
  return extractor.extractConstructorParams(source);
1710
1706
  }
@@ -1831,7 +1827,7 @@ export class PhotonLoader {
1831
1827
  const stateKey = injection.stateKey;
1832
1828
  const stateFile = getInstanceStatePath(mcpName, instanceName, this.baseDir, photonPath);
1833
1829
  try {
1834
- const snapshot = JSON.parse(await fs.readFile(stateFile, 'utf-8'));
1830
+ const snapshot = await readJSON(stateFile);
1835
1831
  if (stateKey in snapshot) {
1836
1832
  values.push(snapshot[stateKey]);
1837
1833
  this.log(` ✅ Restored state: ${stateKey} (from ${stateFile})`);
@@ -2316,7 +2312,7 @@ export class PhotonLoader {
2316
2312
  const packageJsonPath = path.join(cacheDir, 'package.json');
2317
2313
  if (!(await this.pathExists(packageJsonPath))) {
2318
2314
  const pkgName = `photon-npm-${this.sanitizeCacheLabel(packageSpec)}`;
2319
- await fs.writeFile(packageJsonPath, JSON.stringify({ name: pkgName, version: PHOTON_VERSION }, null, 2), 'utf-8');
2315
+ await writeJSON(packageJsonPath, { name: pkgName, version: PHOTON_VERSION });
2320
2316
  }
2321
2317
  const packageRoot = this.getPackageInstallPath(cacheDir, packageName);
2322
2318
  if (await this.pathExists(packageRoot)) {
@@ -2591,9 +2587,7 @@ Run: photon mcp ${mcpName} --config
2591
2587
  // so we must emit events here where ALL tool executions are guaranteed to pass through
2592
2588
  if (mcp.instance && typeof mcp.instance.emit === 'function') {
2593
2589
  try {
2594
- // Check if this is a @stateful photon by looking for emit method and @stateful tag
2595
2590
  const photonName = mcp.name;
2596
- const hasStatefulTag = mcp.tools.some((t) => t.name === toolName); // Assume @stateful if loaded
2597
2591
  // Attach __meta to result if it's an object and doesn't already have it
2598
2592
  if (result && typeof result === 'object' && !Array.isArray(result) && !result.__meta) {
2599
2593
  const timestamp = new Date().toISOString();