shennian 0.2.6 → 0.2.8

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 (85) hide show
  1. package/dist/bin/shennian.d.ts +2 -0
  2. package/dist/bin/shennian.js +2 -0
  3. package/dist/src/agents/adapter.d.ts +35 -0
  4. package/dist/src/agents/adapter.js +19 -0
  5. package/dist/src/agents/claude.d.ts +25 -0
  6. package/dist/src/agents/claude.js +234 -0
  7. package/dist/src/agents/codex.d.ts +52 -0
  8. package/dist/src/agents/codex.js +829 -0
  9. package/dist/src/agents/command-spec.d.ts +36 -0
  10. package/dist/src/agents/command-spec.js +303 -0
  11. package/dist/src/agents/cursor.d.ts +22 -0
  12. package/dist/src/agents/cursor.js +248 -0
  13. package/dist/src/agents/custom.d.ts +30 -0
  14. package/dist/src/agents/custom.js +210 -0
  15. package/dist/src/agents/detect.d.ts +9 -0
  16. package/dist/src/agents/detect.js +46 -0
  17. package/dist/src/agents/gemini.d.ts +17 -0
  18. package/dist/src/agents/gemini.js +172 -0
  19. package/dist/src/agents/model-registry/cache.d.ts +4 -0
  20. package/dist/src/agents/model-registry/cache.js +37 -0
  21. package/dist/src/agents/model-registry/discovery.d.ts +4 -0
  22. package/dist/src/agents/model-registry/discovery.js +166 -0
  23. package/dist/src/agents/model-registry/parsers.d.ts +11 -0
  24. package/dist/src/agents/model-registry/parsers.js +349 -0
  25. package/dist/src/agents/model-registry/runner.d.ts +6 -0
  26. package/dist/src/agents/model-registry/runner.js +29 -0
  27. package/dist/src/agents/model-registry/service.d.ts +6 -0
  28. package/dist/src/agents/model-registry/service.js +71 -0
  29. package/dist/src/agents/model-registry/types.d.ts +30 -0
  30. package/dist/src/agents/model-registry/types.js +8 -0
  31. package/dist/src/agents/model-registry.d.ts +13 -0
  32. package/dist/src/agents/model-registry.js +15 -0
  33. package/dist/src/agents/openclaw.d.ts +20 -0
  34. package/dist/src/agents/openclaw.js +273 -0
  35. package/dist/src/agents/pi.d.ts +51 -0
  36. package/dist/src/agents/pi.js +793 -0
  37. package/dist/src/commands/agent.d.ts +2 -0
  38. package/dist/src/commands/agent.js +131 -0
  39. package/dist/src/commands/daemon.d.ts +35 -0
  40. package/dist/src/commands/daemon.js +612 -0
  41. package/dist/src/commands/pair-qr.d.ts +4 -0
  42. package/dist/src/commands/pair-qr.js +6 -0
  43. package/dist/src/commands/pair.d.ts +8 -0
  44. package/dist/src/commands/pair.js +162 -0
  45. package/dist/src/commands/upgrade.d.ts +5 -0
  46. package/dist/src/commands/upgrade.js +145 -0
  47. package/dist/src/config/index.d.ts +32 -0
  48. package/dist/src/config/index.js +31 -0
  49. package/dist/src/fs/handler.d.ts +26 -0
  50. package/dist/src/fs/handler.js +130 -0
  51. package/dist/src/fs/security.d.ts +2 -0
  52. package/dist/src/fs/security.js +32 -0
  53. package/dist/src/index.d.ts +1 -0
  54. package/dist/src/index.js +277 -0
  55. package/dist/src/log-reporter.d.ts +18 -0
  56. package/dist/src/log-reporter.js +16 -0
  57. package/dist/src/native-fusion/parsers.d.ts +12 -0
  58. package/dist/src/native-fusion/parsers.js +687 -0
  59. package/dist/src/native-fusion/service.d.ts +25 -0
  60. package/dist/src/native-fusion/service.js +176 -0
  61. package/dist/src/native-fusion/state.d.ts +3 -0
  62. package/dist/src/native-fusion/state.js +22 -0
  63. package/dist/src/native-fusion/types.d.ts +24 -0
  64. package/dist/src/native-fusion/types.js +1 -0
  65. package/dist/src/region.d.ts +15 -0
  66. package/dist/src/region.js +99 -0
  67. package/dist/src/relay/client.d.ts +62 -0
  68. package/dist/src/relay/client.js +311 -0
  69. package/dist/src/session/handlers/agents.d.ts +4 -0
  70. package/dist/src/session/handlers/agents.js +55 -0
  71. package/dist/src/session/handlers/chat.d.ts +4 -0
  72. package/dist/src/session/handlers/chat.js +326 -0
  73. package/dist/src/session/handlers/control.d.ts +5 -0
  74. package/dist/src/session/handlers/control.js +57 -0
  75. package/dist/src/session/handlers/fs.d.ts +10 -0
  76. package/dist/src/session/handlers/fs.js +256 -0
  77. package/dist/src/session/manager.d.ts +28 -0
  78. package/dist/src/session/manager.js +174 -0
  79. package/dist/src/session/store.d.ts +7 -0
  80. package/dist/src/session/store.js +46 -0
  81. package/dist/src/session/types.d.ts +35 -0
  82. package/dist/src/session/types.js +4 -0
  83. package/dist/src/upgrade/engine.d.ts +65 -0
  84. package/dist/src/upgrade/engine.js +239 -0
  85. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAgentCommand(program: Command): void;
@@ -0,0 +1,131 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig, saveConfig } from '../config/index.js';
3
+ import { spawnCommandString } from '../agents/command-spec.js';
4
+ function getCapsModels(caps) {
5
+ if (caps.models?.length)
6
+ return caps.models;
7
+ if (caps.model)
8
+ return [caps.model];
9
+ return [];
10
+ }
11
+ /**
12
+ * Runs `<command> /caps` and returns the parsed caps JSON.
13
+ */
14
+ async function probeCaps(command) {
15
+ return new Promise((resolve, reject) => {
16
+ const proc = spawnCommandString(command, ['/caps'], { stdio: ['ignore', 'pipe', 'pipe'] });
17
+ let stdout = '';
18
+ let stderr = '';
19
+ proc.stdout?.on('data', (d) => { stdout += d.toString(); });
20
+ proc.stderr?.on('data', (d) => { stderr += d.toString(); });
21
+ proc.on('error', (err) => reject(new Error(`Failed to run command: ${err.message}`)));
22
+ proc.on('close', (_code) => {
23
+ const line = stdout.trim().split('\n').find((l) => l.trim().startsWith('{'));
24
+ if (!line) {
25
+ reject(new Error(`Command did not output valid caps JSON.\nstdout: ${stdout.trim()}\nstderr: ${stderr.trim()}`));
26
+ return;
27
+ }
28
+ try {
29
+ const caps = JSON.parse(line);
30
+ if (!caps.name || !caps.mode) {
31
+ reject(new Error('Caps JSON must contain "name" and "mode" fields'));
32
+ return;
33
+ }
34
+ if (getCapsModels(caps).length === 0) {
35
+ reject(new Error('Caps JSON must contain either "model" or a non-empty "models" array'));
36
+ return;
37
+ }
38
+ if (caps.mode !== 'spawn' && caps.mode !== 'stdio') {
39
+ reject(new Error(`Caps "mode" must be "spawn" or "stdio", got: ${caps.mode}`));
40
+ return;
41
+ }
42
+ resolve(caps);
43
+ }
44
+ catch {
45
+ reject(new Error(`Failed to parse caps JSON: ${line}`));
46
+ }
47
+ });
48
+ setTimeout(() => {
49
+ proc.kill('SIGTERM');
50
+ reject(new Error('Timed out waiting for caps response (5s)'));
51
+ }, 5000);
52
+ });
53
+ }
54
+ export function registerAgentCommand(program) {
55
+ const agent = program
56
+ .command('agent')
57
+ .description('Manage custom agents');
58
+ // ── add ──────────────────────────────────────────────────────────────────
59
+ agent
60
+ .command('add <name>')
61
+ .description('Register a custom agent')
62
+ .requiredOption('--command <cmd>', 'Command to run the agent (e.g. "python /path/agent.py")')
63
+ .action(async (name, opts) => {
64
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
65
+ console.error(chalk.red('✗ Agent name must contain only letters, numbers, hyphens, and underscores'));
66
+ process.exit(1);
67
+ }
68
+ console.log(chalk.gray(`Probing caps: ${opts.command} /caps ...`));
69
+ let caps;
70
+ try {
71
+ caps = await probeCaps(opts.command);
72
+ }
73
+ catch (err) {
74
+ console.error(chalk.red(`✗ ${err instanceof Error ? err.message : String(err)}`));
75
+ process.exit(1);
76
+ }
77
+ const config = loadConfig();
78
+ config.customAgents = config.customAgents ?? {};
79
+ config.customAgents[name] = { command: opts.command, caps };
80
+ saveConfig(config);
81
+ console.log(chalk.green(`✓ Agent "${name}" registered`));
82
+ console.log(chalk.gray(` Name: ${caps.name}`));
83
+ console.log(chalk.gray(` Models: ${getCapsModels(caps).join(', ')}`));
84
+ console.log(chalk.gray(` Mode: ${caps.mode}`));
85
+ if (caps.version)
86
+ console.log(chalk.gray(` Version: ${caps.version}`));
87
+ console.log();
88
+ console.log(chalk.yellow(` The agent will appear as "custom:${name}" in the Shennian app.`));
89
+ console.log(chalk.yellow(' Refresh Agents in the app to hot-reload this daemon, or restart the daemon as a fallback.'));
90
+ });
91
+ // ── list ─────────────────────────────────────────────────────────────────
92
+ agent
93
+ .command('list')
94
+ .description('List registered custom agents')
95
+ .action(() => {
96
+ const config = loadConfig();
97
+ const entries = Object.entries(config.customAgents ?? {});
98
+ if (entries.length === 0) {
99
+ console.log(chalk.gray('No custom agents registered.'));
100
+ console.log(chalk.gray('Add one with: shennian agent add <name> --command "<cmd>"'));
101
+ return;
102
+ }
103
+ console.log(chalk.bold('\nCustom agents:\n'));
104
+ for (const [name, entry] of entries) {
105
+ const models = entry.caps.models?.length
106
+ ? entry.caps.models.join(', ')
107
+ : entry.caps.model ?? '(none)';
108
+ console.log(` ${chalk.cyan(name)}`);
109
+ console.log(` ${chalk.gray('display:')} ${entry.caps.name}`);
110
+ console.log(` ${chalk.gray('models:')} ${models}`);
111
+ console.log(` ${chalk.gray('mode:')} ${entry.caps.mode}`);
112
+ console.log(` ${chalk.gray('command:')} ${entry.command}`);
113
+ console.log();
114
+ }
115
+ });
116
+ // ── remove ────────────────────────────────────────────────────────────────
117
+ agent
118
+ .command('remove <name>')
119
+ .description('Unregister a custom agent')
120
+ .action((name) => {
121
+ const config = loadConfig();
122
+ if (!config.customAgents?.[name]) {
123
+ console.error(chalk.red(`✗ No agent named "${name}"`));
124
+ process.exit(1);
125
+ }
126
+ delete config.customAgents[name];
127
+ saveConfig(config);
128
+ console.log(chalk.green(`✓ Agent "${name}" removed`));
129
+ console.log(chalk.yellow(' Refresh Agents in the app to hot-reload this daemon, or restart the daemon as a fallback.'));
130
+ });
131
+ }
@@ -0,0 +1,35 @@
1
+ import type { Command } from 'commander';
2
+ type ServiceLaunchMode = 'direct' | 'global-shim' | 'npx';
3
+ export type ServiceLaunchSpec = {
4
+ command: string;
5
+ args: string[];
6
+ mode: ServiceLaunchMode;
7
+ };
8
+ export declare function isEphemeralCliPath(candidate: string): boolean;
9
+ export declare function resolveServiceLaunchSpec(input: {
10
+ nodeExec: string;
11
+ scriptPath: string;
12
+ shennianCommandPath?: string | null;
13
+ npxPath?: string | null;
14
+ }): ServiceLaunchSpec;
15
+ export declare function buildWindowsLauncherCommand(spec: ServiceLaunchSpec, logFile: string): string;
16
+ export declare function buildWindowsStartupVbs(cmdPath: string): string;
17
+ export declare function buildWindowsScheduledTaskXml(input: {
18
+ userId: string;
19
+ command: string;
20
+ arguments: string[];
21
+ }): string;
22
+ export declare function captureEnvForService(): Record<string, string>;
23
+ /**
24
+ * Save current env vars so the daemon can load them at startup.
25
+ * This is critical for launchd/systemd which start with minimal env.
26
+ */
27
+ export declare function saveEnvSnapshot(): void;
28
+ export declare function startDaemonProcess(): void;
29
+ /**
30
+ * Install the platform-native auto-start service.
31
+ * Returns true if the service was immediately started (so caller can skip startDaemonProcess).
32
+ */
33
+ export declare function installService(): boolean;
34
+ export declare function registerDaemonCommand(program: Command): void;
35
+ export {};