@xopcai/xopc 0.0.83 → 0.0.84

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 (79) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +3 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agents-CrpYTHJS.js → agents-tR-nNP04.js} +1 -1
  6. package/dist/gateway/static/root/assets/{apps-page-1mcKh5Rh.js → apps-page-BDw6SP-d.js} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-zd6QNKPx.js → channels-settings-DEFd-jj1.js} +1 -1
  8. package/dist/gateway/static/root/assets/{channels-status-swr-uRAuhiUo.js → channels-status-swr-DI5FHdGe.js} +1 -1
  9. package/dist/gateway/static/root/assets/{cron-api-O2Q_ruV6.js → cron-api-BSqY8LwW.js} +1 -1
  10. package/dist/gateway/static/root/assets/{cron-page-By09AQD-.js → cron-page-D7lVDjcR.js} +1 -1
  11. package/dist/gateway/static/root/assets/{dist-BpQxde0t.js → dist-CqNMNhJM.js} +1 -1
  12. package/dist/gateway/static/root/assets/{extension-debug-page-CY27wj_p.js → extension-debug-page-gf2L0kY_.js} +1 -1
  13. package/dist/gateway/static/root/assets/{extension-page-C-Ed5ZmP.js → extension-page-CQo2Xsmg.js} +1 -1
  14. package/dist/gateway/static/root/assets/{extension-settings-page-raLux7E7.js → extension-settings-page-CZf0WoZg.js} +1 -1
  15. package/dist/gateway/static/root/assets/{field-primitives-fa_hiQcX.js → field-primitives-DTtlp-l8.js} +1 -1
  16. package/dist/gateway/static/root/assets/{heartbeat-config-api-BVl5VHvL.js → heartbeat-config-api-B0drdQEJ.js} +1 -1
  17. package/dist/gateway/static/root/assets/{index-Y-iqo-gL.js → index-0Gt3TG4j.js} +3 -3
  18. package/dist/gateway/static/root/assets/{logs-page-BdH2n7ZW.js → logs-page-DMuORLfC.js} +1 -1
  19. package/dist/gateway/static/root/assets/{sessions-page-Vpchzdp-.js → sessions-page-_UO8g6NN.js} +1 -1
  20. package/dist/gateway/static/root/assets/{settings-form-section-Kk1yAGBl.js → settings-form-section-DkmHkknc.js} +1 -1
  21. package/dist/gateway/static/root/assets/{settings-page-KBm0u6Dz.js → settings-page-Cz8FoW_A.js} +1 -1
  22. package/dist/gateway/static/root/assets/{skills-page-BjeXXaOn.js → skills-page-HrUOxF7H.js} +1 -1
  23. package/dist/gateway/static/root/assets/{utils-DpTxN4AF.js → utils-BFwcR6pL.js} +1 -1
  24. package/dist/gateway/static/root/assets/{voice-api-key-field-CwO8Cf01.js → voice-api-key-field-JF8-aqc5.js} +1 -1
  25. package/dist/gateway/static/root/index.html +1 -1
  26. package/dist/package.js +1 -1
  27. package/dist/src/cli/command-catalog.js +110 -8
  28. package/dist/src/cli/command-catalog.js.map +1 -1
  29. package/dist/src/cli/command-loaders.js +2 -0
  30. package/dist/src/cli/command-loaders.js.map +1 -1
  31. package/dist/src/cli/command-manifest.js +9 -1
  32. package/dist/src/cli/command-manifest.js.map +1 -1
  33. package/dist/src/cli/commands/config.js +70 -19
  34. package/dist/src/cli/commands/config.js.map +1 -1
  35. package/dist/src/cli/commands/cron-cli.d.ts +2 -0
  36. package/dist/src/cli/commands/cron-cli.js +15 -0
  37. package/dist/src/cli/commands/cron-cli.js.map +1 -0
  38. package/dist/src/cli/commands/cron.d.ts +4 -1
  39. package/dist/src/cli/commands/cron.js +76 -41
  40. package/dist/src/cli/commands/cron.js.map +1 -1
  41. package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
  42. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  43. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  44. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
  45. package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
  46. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  47. package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
  48. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
  49. package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
  50. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
  51. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  52. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
  53. package/dist/src/cli/commands/doctor/checks/workspace-status.js +3 -3
  54. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  55. package/dist/src/cli/commands/gateway/index.d.ts +1 -1
  56. package/dist/src/cli/commands/gateway/index.js +2 -2
  57. package/dist/src/cli/commands/gateway/service.d.ts +4 -0
  58. package/dist/src/cli/commands/gateway/service.js +17 -2
  59. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  60. package/dist/src/cli/commands/gateway/subcommands.js +1 -4
  61. package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
  62. package/dist/src/cli/commands/init.js +27 -0
  63. package/dist/src/cli/commands/init.js.map +1 -1
  64. package/dist/src/cli/commands/models.d.ts +4 -1
  65. package/dist/src/cli/commands/models.js +86 -74
  66. package/dist/src/cli/commands/models.js.map +1 -1
  67. package/dist/src/cli/commands/onboard.js +2 -0
  68. package/dist/src/cli/commands/onboard.js.map +1 -1
  69. package/dist/src/cli/commands/profile.d.ts +3 -5
  70. package/dist/src/cli/commands/profile.js +31 -31
  71. package/dist/src/cli/commands/profile.js.map +1 -1
  72. package/dist/src/cli/commands/setup.js +6 -1
  73. package/dist/src/cli/commands/setup.js.map +1 -1
  74. package/dist/src/cli/gateway-run-argv.js +15 -5
  75. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  76. package/dist/src/gateway/heartbeat/service.js +1 -1
  77. package/dist/src/gateway/service.js +1 -1
  78. package/dist/src/heartbeat/index.js +1 -1
  79. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createLogger } from '../../utils/logger.js';\nimport {\n listProfiles,\n createProfile,\n deleteProfile,\n getCurrentProfile,\n resolveProfileStateDir,\n} from '../../config/profile.js';\nimport { colors } from '../utils/colors.js';\nimport Table from 'cli-table3';\n\nconst log = createLogger('ProfileCommands');\n\n// ============================================\n// Profile List Command\n// ============================================\n\nexport function createProfileListCommand(): Command {\n return new Command('profile:list')\n .description('List all profiles')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const profiles = await listProfiles();\n\n if (options.json) {\n console.log(JSON.stringify(profiles, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n console.log('No profiles found. Create one with: xopc profile:create <name>');\n return;\n }\n\n const table = new Table({\n head: ['Name', 'Status', 'Agents', 'Created', 'Directory'].map((h) =>\n colors.cyan(h)\n ),\n colWidths: [15, 10, 8, 20, 40],\n });\n\n for (const profile of profiles) {\n const status = profile.isActive\n ? colors.green('active')\n : colors.gray('inactive');\n\n table.push([\n profile.name === 'default' ? colors.yellow(profile.name) : profile.name,\n status,\n profile.agentCount.toString(),\n profile.createdAt ? new Date(profile.createdAt).toLocaleDateString() : '-',\n profile.stateDir,\n ]);\n }\n\n console.log(table.toString());\n console.log(`\\nCurrent: ${getCurrentProfile()}`);\n } catch (error) {\n log.error({ error }, 'Failed to list profiles');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Create Command\n// ============================================\n\nexport function createProfileCreateCommand(): Command {\n return new Command('profile:create')\n .description('Create a new profile')\n .argument('<name>', 'Profile name (letters, numbers, hyphens, underscores)')\n .action(async (name) => {\n try {\n const profile = await createProfile(name);\n\n console.log(colors.green('✓'), `Created profile \"${profile.name}\"`);\n console.log(`\\n Directory: ${profile.stateDir}`);\n console.log(`\\nTo use this profile:`);\n console.log(` export XOPC_PROFILE=${profile.name}`);\n console.log(`\\nOr add to your shell profile:`);\n console.log(` echo 'export XOPC_PROFILE=${profile.name}' >> ~/.bashrc`);\n } catch (error) {\n log.error({ error }, 'Failed to create profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Delete Command\n// ============================================\n\nexport function createProfileDeleteCommand(): Command {\n return new Command('profile:delete')\n .description('Delete a profile')\n .argument('<name>', 'Profile name')\n .option('-f, --force', 'Force delete even if active')\n .action(async (name, options) => {\n try {\n await deleteProfile(name, { force: options.force });\n\n console.log(colors.green('✓'), `Deleted profile \"${name}\"`);\n } catch (error) {\n log.error({ error }, 'Failed to delete profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Profile Switch Command\n// ============================================\n\nexport function createProfileSwitchCommand(): Command {\n return new Command('profile:switch')\n .description('Get shell command to switch to a profile')\n .argument('<name>', 'Profile name')\n .action(async (name) => {\n try {\n const stateDir = resolveProfileStateDir(name);\n\n // Check if profile exists\n const profiles = await listProfiles();\n const exists = profiles.some((p) => p.name === name);\n\n if (!exists) {\n console.error(colors.red('Error:'), `Profile \"${name}\" not found`);\n console.log(`\\nCreate it with: xopc profile:create ${name}`);\n process.exit(1);\n }\n\n console.log(colors.cyan('Run this command to switch to this profile:'));\n console.log();\n console.log(` export XOPC_PROFILE=${name}`);\n console.log();\n console.log('Or add to your shell profile:');\n console.log(` echo 'export XOPC_PROFILE=${name}' >> ~/.bashrc`);\n console.log();\n console.log(`State directory: ${stateDir}`);\n } catch (error) {\n log.error({ error }, 'Failed to switch profile');\n console.error(\n colors.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n}\n\n// ============================================\n// Register All Commands\n// ============================================\n\nexport function registerProfileCommands(program: Command): void {\n program.addCommand(createProfileListCommand());\n program.addCommand(createProfileCreateCommand());\n program.addCommand(createProfileDeleteCommand());\n program.addCommand(createProfileSwitchCommand());\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"profile.js","names":[],"sources":["../../../../src/cli/commands/profile.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Table from 'cli-table3';\n\nimport { createLogger } from '../../utils/logger.js';\nimport {\n createProfile,\n deleteProfile,\n getCurrentProfile,\n getSwitchCommand,\n listProfiles,\n resolveProfileStateDir,\n} from '../../config/profile.js';\nimport { formatExamples, register, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ProfileCommands');\n\nfunction createProfileCommand(_ctx: CLIContext): Command {\n const cmd = new Command('profile')\n .description('Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc profile list',\n 'xopc profile create staging',\n 'xopc profile switch staging',\n 'xopc profile delete staging --force',\n ]),\n );\n\n cmd\n .command('list')\n .description('List all profiles')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const profiles = await listProfiles();\n\n if (options.json) {\n console.log(JSON.stringify(profiles, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n console.log('No profiles found. Create one with: xopc profile create <name>');\n return;\n }\n\n const table = new Table({\n head: ['Name', 'Status', 'Agents', 'Created', 'Directory'].map((h) => colors.cyan(h)),\n colWidths: [15, 10, 8, 20, 40],\n });\n\n for (const profile of profiles) {\n const status = profile.isActive ? colors.green('active') : colors.gray('inactive');\n table.push([\n profile.name === 'default' ? colors.yellow(profile.name) : profile.name,\n status,\n profile.agentCount.toString(),\n profile.createdAt ? new Date(profile.createdAt).toLocaleDateString() : '-',\n profile.stateDir,\n ]);\n }\n\n console.log(table.toString());\n console.log(`\\nCurrent: ${getCurrentProfile()}`);\n } catch (error) {\n log.error({ error }, 'Failed to list profiles');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('create')\n .description('Create a new profile')\n .argument('<name>', 'Profile name (letters, numbers, hyphens, underscores)')\n .action(async (name) => {\n try {\n const profile = await createProfile(name);\n\n console.log(colors.green('✓'), `Created profile \"${profile.name}\"`);\n console.log(`\\n Directory: ${profile.stateDir}`);\n console.log('\\nTo use this profile:');\n console.log(` ${getSwitchCommand(profile.name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to create profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('delete')\n .description('Delete a profile')\n .argument('<name>', 'Profile name')\n .option('-f, --force', 'Force delete even if active')\n .action(async (name, options) => {\n try {\n await deleteProfile(name, { force: options.force });\n console.log(colors.green('✓'), `Deleted profile \"${name}\"`);\n } catch (error) {\n log.error({ error }, 'Failed to delete profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n cmd\n .command('switch')\n .description('Print shell command to switch to a profile')\n .argument('<name>', 'Profile name')\n .action(async (name) => {\n try {\n const profiles = await listProfiles();\n const exists = profiles.some((p) => p.name === name);\n\n if (!exists) {\n console.error(colors.red('Error:'), `Profile \"${name}\" not found`);\n console.log(`\\nCreate it with: xopc profile create ${name}`);\n process.exit(1);\n }\n\n console.log(colors.cyan('Run this command to switch to this profile:'));\n console.log();\n console.log(` ${getSwitchCommand(name)}`);\n console.log();\n console.log(`State directory: ${resolveProfileStateDir(name)}`);\n } catch (error) {\n log.error({ error }, 'Failed to switch profile');\n console.error(colors.red('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nregister({\n id: 'profile',\n name: 'profile',\n description: 'Manage xopc state profiles (~/.xopc vs ~/.xopc-<name>)',\n factory: createProfileCommand,\n metadata: {\n category: 'setup',\n examples: ['xopc profile list', 'xopc profile create staging'],\n },\n});\n\nexport { createProfileCommand };\n"],"mappings":"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"}
@@ -5,7 +5,11 @@ import { getWorkspaceStatus } from "../utils/workspace.js";
5
5
  import { Command } from "commander";
6
6
  //#region src/cli/commands/setup.ts
7
7
  function createSetupCommand(ctx) {
8
- return new Command("setup").description("Initialize config file and workspace directory").addHelpText("after", formatExamples(["xopc setup # Create config + workspace", "xopc setup --workspace /path # Custom workspace path"])).option("--workspace <path>", "Workspace directory path", ctx.workspacePath).action(async (options) => {
8
+ return new Command("setup").description("Initialize config file and workspace directory").addHelpText("after", formatExamples([
9
+ "xopc setup # Create config + workspace",
10
+ "xopc setup --workspace /path # Custom workspace path",
11
+ "xopc init # Full state dirs + agent profile seeds"
12
+ ])).option("--workspace <path>", "Workspace directory path", ctx.workspacePath).action(async (options) => {
9
13
  const workspacePath = options.workspace || ctx.workspacePath;
10
14
  const configPath = ctx.configPath;
11
15
  console.log("🔧 xopc Setup\n");
@@ -29,6 +33,7 @@ function createSetupCommand(ctx) {
29
33
  console.log(" Config:", configPath);
30
34
  console.log(" Workspace:", workspacePath);
31
35
  console.log("\n🚀 Next Steps:");
36
+ console.log(" xopc init # Full Agent OS dirs (optional, beyond setup)");
32
37
  console.log(" xopc onboard # Run full setup wizard");
33
38
  console.log(" xopc onboard --model # Configure model only");
34
39
  console.log(" xopc onboard --channels # Configure channels only");
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","names":[],"sources":["../../../../src/cli/commands/setup.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { getWorkspaceStatus } from '../utils/workspace.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\n\nfunction createSetupCommand(ctx: CLIContext): Command {\n const cmd = new Command('setup')\n .description('Initialize config file and workspace directory')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc setup # Create config + workspace',\n 'xopc setup --workspace /path # Custom workspace path',\n ])\n )\n .option('--workspace <path>', 'Workspace directory path', ctx.workspacePath)\n .action(async (options) => {\n const workspacePath = options.workspace || ctx.workspacePath;\n const configPath = ctx.configPath;\n\n console.log('🔧 xopc Setup\\n');\n console.log('═'.repeat(40));\n\n // Check current status\n const status = getWorkspaceStatus(configPath, workspacePath);\n\n console.log('\\n📊 Current Status:');\n console.log(` Config: ${status.configExists ? '✅ exists' : '❌ not found'}`);\n console.log(` Workspace: ${status.workspaceSetup ? '✅ setup' : '❌ not found'}`);\n\n const result = await initWorkspace({ configPath, workspacePath });\n\n if (result.configCreated) {\n console.log('\\n📝 Created config file.');\n } else {\n console.log('\\n📝 Config already present (verified).');\n }\n\n if (result.workspaceCreated) {\n console.log('\\n📁 Created workspace + memory/.');\n } else {\n console.log('\\n📁 Workspace already present (verified).');\n }\n\n seedMainAgentProfileMarkdown(result.config);\n\n console.log('\\n' + '═'.repeat(40));\n console.log('\\n✅ Setup complete!\\n');\n\n console.log('📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n console.log('\\n🚀 Next Steps:');\n console.log(' xopc onboard # Run full setup wizard');\n console.log(' xopc onboard --model # Configure model only');\n console.log(' xopc onboard --channels # Configure channels only');\n });\n\n return cmd;\n}\n\nregister({\n id: 'setup',\n name: 'setup',\n description: 'Initialize config file and workspace directory',\n factory: createSetupCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc setup',\n 'xopc setup --workspace ~/.my-workspace',\n ],\n },\n});\n"],"mappings":";;;;;;AAMA,SAAS,mBAAmB,KAA0B;AAsDpD,QArDY,IAAI,QAAQ,QAAQ,CAC7B,YAAY,iDAAiD,CAC7D,YACC,SACA,eAAe,CACb,6DACA,wDACD,CAAC,CACH,CACA,OAAO,sBAAsB,4BAA4B,IAAI,cAAc,CAC3E,OAAO,OAAO,YAAY;EACzB,MAAM,gBAAgB,QAAQ,aAAa,IAAI;EAC/C,MAAM,aAAa,IAAI;AAEvB,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;EAG3B,MAAM,SAAS,mBAAmB,YAAY,cAAc;AAE5D,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,cAAc,OAAO,eAAe,aAAa,gBAAgB;AAC7E,UAAQ,IAAI,iBAAiB,OAAO,iBAAiB,YAAY,gBAAgB;EAEjF,MAAM,SAAS,MAAM,cAAc;GAAE;GAAY;GAAe,CAAC;AAEjE,MAAI,OAAO,cACT,SAAQ,IAAI,4BAA4B;MAExC,SAAQ,IAAI,0CAA0C;AAGxD,MAAI,OAAO,iBACT,SAAQ,IAAI,oCAAoC;MAEhD,SAAQ,IAAI,6CAA6C;AAG3D,+BAA6B,OAAO,OAAO;AAE3C,UAAQ,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;AAClC,UAAQ,IAAI,wBAAwB;AAEpC,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,cAAc,WAAW;AACrC,UAAQ,IAAI,iBAAiB,cAAc;AAE3C,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,uDAAuD;AACnE,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,wDAAwD;GAG9D;;AAGZ,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU,CACR,cACA,yCACD;EACF;CACF,CAAC"}
1
+ {"version":3,"file":"setup.js","names":[],"sources":["../../../../src/cli/commands/setup.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\nimport { getWorkspaceStatus } from '../utils/workspace.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\n\nfunction createSetupCommand(ctx: CLIContext): Command {\n const cmd = new Command('setup')\n .description('Initialize config file and workspace directory')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc setup # Create config + workspace',\n 'xopc setup --workspace /path # Custom workspace path',\n 'xopc init # Full state dirs + agent profile seeds',\n ])\n )\n .option('--workspace <path>', 'Workspace directory path', ctx.workspacePath)\n .action(async (options) => {\n const workspacePath = options.workspace || ctx.workspacePath;\n const configPath = ctx.configPath;\n\n console.log('🔧 xopc Setup\\n');\n console.log('═'.repeat(40));\n\n // Check current status\n const status = getWorkspaceStatus(configPath, workspacePath);\n\n console.log('\\n📊 Current Status:');\n console.log(` Config: ${status.configExists ? '✅ exists' : '❌ not found'}`);\n console.log(` Workspace: ${status.workspaceSetup ? '✅ setup' : '❌ not found'}`);\n\n const result = await initWorkspace({ configPath, workspacePath });\n\n if (result.configCreated) {\n console.log('\\n📝 Created config file.');\n } else {\n console.log('\\n📝 Config already present (verified).');\n }\n\n if (result.workspaceCreated) {\n console.log('\\n📁 Created workspace + memory/.');\n } else {\n console.log('\\n📁 Workspace already present (verified).');\n }\n\n seedMainAgentProfileMarkdown(result.config);\n\n console.log('\\n' + '═'.repeat(40));\n console.log('\\n✅ Setup complete!\\n');\n\n console.log('📁 Files:');\n console.log(' Config:', configPath);\n console.log(' Workspace:', workspacePath);\n\n console.log('\\n🚀 Next Steps:');\n console.log(' xopc init # Full Agent OS dirs (optional, beyond setup)');\n console.log(' xopc onboard # Run full setup wizard');\n console.log(' xopc onboard --model # Configure model only');\n console.log(' xopc onboard --channels # Configure channels only');\n });\n\n return cmd;\n}\n\nregister({\n id: 'setup',\n name: 'setup',\n description: 'Initialize config file and workspace directory',\n factory: createSetupCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc setup',\n 'xopc setup --workspace ~/.my-workspace',\n ],\n },\n});\n"],"mappings":";;;;;;AAMA,SAAS,mBAAmB,KAA0B;AAwDpD,QAvDY,IAAI,QAAQ,QAAQ,CAC7B,YAAY,iDAAiD,CAC7D,YACC,SACA,eAAe;EACb;EACA;EACA;EACD,CAAC,CACH,CACA,OAAO,sBAAsB,4BAA4B,IAAI,cAAc,CAC3E,OAAO,OAAO,YAAY;EACzB,MAAM,gBAAgB,QAAQ,aAAa,IAAI;EAC/C,MAAM,aAAa,IAAI;AAEvB,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;EAG3B,MAAM,SAAS,mBAAmB,YAAY,cAAc;AAE5D,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,cAAc,OAAO,eAAe,aAAa,gBAAgB;AAC7E,UAAQ,IAAI,iBAAiB,OAAO,iBAAiB,YAAY,gBAAgB;EAEjF,MAAM,SAAS,MAAM,cAAc;GAAE;GAAY;GAAe,CAAC;AAEjE,MAAI,OAAO,cACT,SAAQ,IAAI,4BAA4B;MAExC,SAAQ,IAAI,0CAA0C;AAGxD,MAAI,OAAO,iBACT,SAAQ,IAAI,oCAAoC;MAEhD,SAAQ,IAAI,6CAA6C;AAG3D,+BAA6B,OAAO,OAAO;AAE3C,UAAQ,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;AAClC,UAAQ,IAAI,wBAAwB;AAEpC,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,cAAc,WAAW;AACrC,UAAQ,IAAI,iBAAiB,cAAc;AAE3C,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,6EAA6E;AACzF,UAAQ,IAAI,uDAAuD;AACnE,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,wDAAwD;GAG9D;;AAGZ,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU;EACR,UAAU;EACV,UAAU,CACR,cACA,yCACD;EACF;CACF,CAAC"}
@@ -21,10 +21,7 @@ const GATEWAY_SUBCOMMANDS = new Set([
21
21
  "stop",
22
22
  "restart",
23
23
  "logs",
24
- "install",
25
- "uninstall",
26
- "start",
27
- "service-status",
24
+ "service",
28
25
  "ssh-tunnel"
29
26
  ]);
30
27
  function isValueToken(token) {
@@ -73,13 +70,26 @@ function resolveGatewayCatalogCommandPath(argv) {
73
70
  continue;
74
71
  }
75
72
  if (arg.startsWith("-")) continue;
73
+ if (arg === "service") {
74
+ for (let nestedIndex = index + 1; nestedIndex < args.length; nestedIndex += 1) {
75
+ const nested = args[nestedIndex];
76
+ if (!nested || nested === "--") break;
77
+ if (nested.startsWith("-")) continue;
78
+ return [
79
+ "gateway",
80
+ "service",
81
+ nested
82
+ ];
83
+ }
84
+ return ["gateway", "service"];
85
+ }
76
86
  return ["gateway", arg];
77
87
  }
78
88
  return sawGateway ? ["gateway"] : null;
79
89
  }
80
90
  function resolveGatewaySubcommandName(argv) {
81
91
  const path = resolveGatewayCatalogCommandPath(argv);
82
- return path && path.length === 2 ? path[1] : void 0;
92
+ return path && path.length >= 2 ? path[1] : void 0;
83
93
  }
84
94
  function isGatewayRunFastPathArgv(argv) {
85
95
  if (process.env.XOPC_DISABLE_GATEWAY_RUN_FAST_PATH === "1") return false;
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-run-argv.js","names":[],"sources":["../../../src/cli/gateway-run-argv.ts"],"sourcesContent":["import { resolveCliArgvInvocation } from './argv-invocation.js';\n\nconst GATEWAY_RUN_VALUE_FLAGS = new Set([\n '--port',\n '--bind',\n '--token',\n '--tailscale',\n]);\n\nconst GATEWAY_RUN_BOOLEAN_FLAGS = new Set([\n '--tailscale-reset-on-exit',\n '--force',\n '--no-hot-reload',\n '--foreground',\n]);\n\nconst GATEWAY_SUBCOMMANDS = new Set([\n 'token',\n 'status',\n 'health',\n 'call',\n 'probe',\n 'stop',\n 'restart',\n 'logs',\n 'install',\n 'uninstall',\n 'start',\n 'service-status',\n 'ssh-tunnel',\n]);\n\nfunction isValueToken(token: string | undefined): boolean {\n return typeof token === 'string' && token.length > 0 && !token.startsWith('-');\n}\n\nexport function consumeGatewayRunOptionToken(args: ReadonlyArray<string>, index: number): number {\n const arg = args[index];\n if (!arg || arg === '--' || !arg.startsWith('-')) {\n return 0;\n }\n const equalsIndex = arg.indexOf('=');\n const flag = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);\n if (GATEWAY_RUN_BOOLEAN_FLAGS.has(flag)) {\n return equalsIndex === -1 ? 1 : 0;\n }\n if (!GATEWAY_RUN_VALUE_FLAGS.has(flag)) {\n return 0;\n }\n if (equalsIndex !== -1) {\n return arg.slice(equalsIndex + 1).trim() ? 1 : 0;\n }\n return isValueToken(args[index + 1]) ? 2 : 0;\n}\n\nexport function consumeGatewayFastPathRootOptionToken(\n args: ReadonlyArray<string>,\n index: number,\n): number {\n const arg = args[index];\n if (!arg || arg === '--') {\n return 0;\n }\n if (arg.startsWith('--config=')) {\n return arg.slice('--config='.length).trim() ? 1 : 0;\n }\n if (arg === '--config') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg.startsWith('--workspace=')) {\n return arg.slice('--workspace='.length).trim() ? 1 : 0;\n }\n if (arg === '--workspace') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg === '--verbose' || arg === '-v') {\n return 1;\n }\n return 0;\n}\n\nexport function resolveGatewayCatalogCommandPath(argv: string[]): string[] | null {\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n break;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n if (arg !== 'gateway') {\n return null;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return ['gateway', arg];\n }\n\n return sawGateway ? ['gateway'] : null;\n}\n\nexport function resolveGatewaySubcommandName(argv: string[]): string | undefined {\n const path = resolveGatewayCatalogCommandPath(argv);\n return path && path.length === 2 ? path[1] : undefined;\n}\n\nexport function isGatewayRunFastPathArgv(argv: string[]): boolean {\n if (process.env.XOPC_DISABLE_GATEWAY_RUN_FAST_PATH === '1') {\n return false;\n }\n\n const invocation = resolveCliArgvInvocation(argv);\n if (invocation.hasHelpOrVersion) {\n return false;\n }\n\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n return false;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg !== 'gateway') {\n return false;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return false;\n }\n\n return sawGateway;\n}\n\nexport function isKnownGatewaySubcommand(name: string): boolean {\n return GATEWAY_SUBCOMMANDS.has(name);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"gateway-run-argv.js","names":[],"sources":["../../../src/cli/gateway-run-argv.ts"],"sourcesContent":["import { resolveCliArgvInvocation } from './argv-invocation.js';\n\nconst GATEWAY_RUN_VALUE_FLAGS = new Set([\n '--port',\n '--bind',\n '--token',\n '--tailscale',\n]);\n\nconst GATEWAY_RUN_BOOLEAN_FLAGS = new Set([\n '--tailscale-reset-on-exit',\n '--force',\n '--no-hot-reload',\n '--foreground',\n]);\n\nconst GATEWAY_SUBCOMMANDS = new Set([\n 'token',\n 'status',\n 'health',\n 'call',\n 'probe',\n 'stop',\n 'restart',\n 'logs',\n 'service',\n 'ssh-tunnel',\n]);\n\nfunction isValueToken(token: string | undefined): boolean {\n return typeof token === 'string' && token.length > 0 && !token.startsWith('-');\n}\n\nexport function consumeGatewayRunOptionToken(args: ReadonlyArray<string>, index: number): number {\n const arg = args[index];\n if (!arg || arg === '--' || !arg.startsWith('-')) {\n return 0;\n }\n const equalsIndex = arg.indexOf('=');\n const flag = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);\n if (GATEWAY_RUN_BOOLEAN_FLAGS.has(flag)) {\n return equalsIndex === -1 ? 1 : 0;\n }\n if (!GATEWAY_RUN_VALUE_FLAGS.has(flag)) {\n return 0;\n }\n if (equalsIndex !== -1) {\n return arg.slice(equalsIndex + 1).trim() ? 1 : 0;\n }\n return isValueToken(args[index + 1]) ? 2 : 0;\n}\n\nexport function consumeGatewayFastPathRootOptionToken(\n args: ReadonlyArray<string>,\n index: number,\n): number {\n const arg = args[index];\n if (!arg || arg === '--') {\n return 0;\n }\n if (arg.startsWith('--config=')) {\n return arg.slice('--config='.length).trim() ? 1 : 0;\n }\n if (arg === '--config') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg.startsWith('--workspace=')) {\n return arg.slice('--workspace='.length).trim() ? 1 : 0;\n }\n if (arg === '--workspace') {\n return isValueToken(args[index + 1]) ? 2 : 0;\n }\n if (arg === '--verbose' || arg === '-v') {\n return 1;\n }\n return 0;\n}\n\nexport function resolveGatewayCatalogCommandPath(argv: string[]): string[] | null {\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n break;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n if (arg !== 'gateway') {\n return null;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n if (arg === 'service') {\n for (let nestedIndex = index + 1; nestedIndex < args.length; nestedIndex += 1) {\n const nested = args[nestedIndex];\n if (!nested || nested === '--') {\n break;\n }\n if (nested.startsWith('-')) {\n continue;\n }\n return ['gateway', 'service', nested];\n }\n return ['gateway', 'service'];\n }\n return ['gateway', arg];\n }\n\n return sawGateway ? ['gateway'] : null;\n}\n\nexport function resolveGatewaySubcommandName(argv: string[]): string | undefined {\n const path = resolveGatewayCatalogCommandPath(argv);\n return path && path.length >= 2 ? path[1] : undefined;\n}\n\nexport function isGatewayRunFastPathArgv(argv: string[]): boolean {\n if (process.env.XOPC_DISABLE_GATEWAY_RUN_FAST_PATH === '1') {\n return false;\n }\n\n const invocation = resolveCliArgvInvocation(argv);\n if (invocation.hasHelpOrVersion) {\n return false;\n }\n\n const args = argv.slice(2).filter((arg) => arg !== '--');\n let sawGateway = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg === '--') {\n return false;\n }\n if (!sawGateway) {\n const consumed = consumeGatewayFastPathRootOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg !== 'gateway') {\n return false;\n }\n sawGateway = true;\n continue;\n }\n\n const consumed = consumeGatewayRunOptionToken(args, index);\n if (consumed > 0) {\n index += consumed - 1;\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return false;\n }\n\n return sawGateway;\n}\n\nexport function isKnownGatewaySubcommand(name: string): boolean {\n return GATEWAY_SUBCOMMANDS.has(name);\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
4
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
4
5
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
5
6
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
6
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
7
7
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
8
8
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
9
9
  import { readFile } from "fs/promises";
@@ -26,9 +26,9 @@ import "../infra/bus/index.js";
26
26
  import { AgentService } from "../agent/service.js";
27
27
  import { ChannelManager } from "../channels/manager.js";
28
28
  import "../config/index.js";
29
+ import { resolveEffectiveGatewayPort } from "./host.js";
29
30
  import { CronService } from "../cron/service.js";
30
31
  import "../cron/index.js";
31
- import { resolveEffectiveGatewayPort } from "./host.js";
32
32
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
33
33
  import { HeartbeatService, heartbeatRunnerConfigFromConfig } from "./heartbeat/service.js";
34
34
  import "./heartbeat/index.js";
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
2
+ import { appendCronEventLines } from "./event-prompt.js";
2
3
  import { isWithinActiveHours } from "./active-hours.js";
3
4
  import { isHeartbeatContentEmpty } from "./content-check.js";
4
- import { appendCronEventLines } from "./event-prompt.js";
5
5
  import { createHeartbeatWake } from "./wake.js";
6
6
  export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.83",
3
+ "version": "0.0.84",
4
4
  "description": "The OPC workstation that grows with you: AI assistant for One Person Companies — CLI, gateway, multi-channel (Telegram/WeChat), 20+ LLM providers via pi-ai, extensions and skills.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",