@shadanai/openme 0.1.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 (147) hide show
  1. package/bin/openme.js +2 -0
  2. package/dist/agents/agent.d.ts +10 -0
  3. package/dist/agents/agent.js +2 -0
  4. package/dist/agents/agent.js.map +1 -0
  5. package/dist/agents/happy.d.ts +15 -0
  6. package/dist/agents/happy.js +43 -0
  7. package/dist/agents/happy.js.map +1 -0
  8. package/dist/agents/openclaw.d.ts +16 -0
  9. package/dist/agents/openclaw.js +55 -0
  10. package/dist/agents/openclaw.js.map +1 -0
  11. package/dist/agents/proxy.d.ts +15 -0
  12. package/dist/agents/proxy.js +36 -0
  13. package/dist/agents/proxy.js.map +1 -0
  14. package/dist/cli/cmd-agent.d.ts +1 -0
  15. package/dist/cli/cmd-agent.js +73 -0
  16. package/dist/cli/cmd-agent.js.map +1 -0
  17. package/dist/cli/cmd-datasource.d.ts +1 -0
  18. package/dist/cli/cmd-datasource.js +78 -0
  19. package/dist/cli/cmd-datasource.js.map +1 -0
  20. package/dist/cli/cmd-init.d.ts +7 -0
  21. package/dist/cli/cmd-init.js +26 -0
  22. package/dist/cli/cmd-init.js.map +1 -0
  23. package/dist/cli/cmd-install.d.ts +5 -0
  24. package/dist/cli/cmd-install.js +22 -0
  25. package/dist/cli/cmd-install.js.map +1 -0
  26. package/dist/cli/cmd-start.d.ts +5 -0
  27. package/dist/cli/cmd-start.js +136 -0
  28. package/dist/cli/cmd-start.js.map +1 -0
  29. package/dist/cli/cmd-status.d.ts +1 -0
  30. package/dist/cli/cmd-status.js +26 -0
  31. package/dist/cli/cmd-status.js.map +1 -0
  32. package/dist/cli/cmd-stop.d.ts +1 -0
  33. package/dist/cli/cmd-stop.js +17 -0
  34. package/dist/cli/cmd-stop.js.map +1 -0
  35. package/dist/cli/cmd-workspace.d.ts +1 -0
  36. package/dist/cli/cmd-workspace.js +32 -0
  37. package/dist/cli/cmd-workspace.js.map +1 -0
  38. package/dist/cli/index.d.ts +1 -0
  39. package/dist/cli/index.js +46 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/core/config-sync.d.ts +6 -0
  42. package/dist/core/config-sync.js +41 -0
  43. package/dist/core/config-sync.js.map +1 -0
  44. package/dist/core/config.d.ts +96 -0
  45. package/dist/core/config.js +91 -0
  46. package/dist/core/config.js.map +1 -0
  47. package/dist/core/node-id.d.ts +1 -0
  48. package/dist/core/node-id.js +5 -0
  49. package/dist/core/node-id.js.map +1 -0
  50. package/dist/core/register.d.ts +19 -0
  51. package/dist/core/register.js +31 -0
  52. package/dist/core/register.js.map +1 -0
  53. package/dist/data/connectors/baidupan.d.ts +20 -0
  54. package/dist/data/connectors/baidupan.js +69 -0
  55. package/dist/data/connectors/baidupan.js.map +1 -0
  56. package/dist/data/connectors/connector.d.ts +12 -0
  57. package/dist/data/connectors/connector.js +2 -0
  58. package/dist/data/connectors/connector.js.map +1 -0
  59. package/dist/data/connectors/dingtalk.d.ts +18 -0
  60. package/dist/data/connectors/dingtalk.js +81 -0
  61. package/dist/data/connectors/dingtalk.js.map +1 -0
  62. package/dist/data/connectors/email.d.ts +18 -0
  63. package/dist/data/connectors/email.js +191 -0
  64. package/dist/data/connectors/email.js.map +1 -0
  65. package/dist/data/connectors/feishu.d.ts +18 -0
  66. package/dist/data/connectors/feishu.js +78 -0
  67. package/dist/data/connectors/feishu.js.map +1 -0
  68. package/dist/data/connectors/github.d.ts +10 -0
  69. package/dist/data/connectors/github.js +36 -0
  70. package/dist/data/connectors/github.js.map +1 -0
  71. package/dist/data/connectors/index.d.ts +3 -0
  72. package/dist/data/connectors/index.js +23 -0
  73. package/dist/data/connectors/index.js.map +1 -0
  74. package/dist/data/connectors/local-fs.d.ts +20 -0
  75. package/dist/data/connectors/local-fs.js +57 -0
  76. package/dist/data/connectors/local-fs.js.map +1 -0
  77. package/dist/data/connectors/notion.d.ts +10 -0
  78. package/dist/data/connectors/notion.js +46 -0
  79. package/dist/data/connectors/notion.js.map +1 -0
  80. package/dist/data/connectors/wecom.d.ts +18 -0
  81. package/dist/data/connectors/wecom.js +74 -0
  82. package/dist/data/connectors/wecom.js.map +1 -0
  83. package/dist/data/keys/store.d.ts +16 -0
  84. package/dist/data/keys/store.js +106 -0
  85. package/dist/data/keys/store.js.map +1 -0
  86. package/dist/data/profile/builder.d.ts +10 -0
  87. package/dist/data/profile/builder.js +48 -0
  88. package/dist/data/profile/builder.js.map +1 -0
  89. package/dist/data/skills/generator.d.ts +3 -0
  90. package/dist/data/skills/generator.js +72 -0
  91. package/dist/data/skills/generator.js.map +1 -0
  92. package/dist/data/sync/scheduler.d.ts +12 -0
  93. package/dist/data/sync/scheduler.js +51 -0
  94. package/dist/data/sync/scheduler.js.map +1 -0
  95. package/dist/deps/detector.d.ts +8 -0
  96. package/dist/deps/detector.js +19 -0
  97. package/dist/deps/detector.js.map +1 -0
  98. package/dist/deps/installer.d.ts +1 -0
  99. package/dist/deps/installer.js +38 -0
  100. package/dist/deps/installer.js.map +1 -0
  101. package/dist/deps/platform.d.ts +4 -0
  102. package/dist/deps/platform.js +24 -0
  103. package/dist/deps/platform.js.map +1 -0
  104. package/dist/health/monitor.d.ts +2 -0
  105. package/dist/health/monitor.js +18 -0
  106. package/dist/health/monitor.js.map +1 -0
  107. package/dist/proxy/auth.d.ts +7 -0
  108. package/dist/proxy/auth.js +22 -0
  109. package/dist/proxy/auth.js.map +1 -0
  110. package/dist/proxy/routes-agent.d.ts +3 -0
  111. package/dist/proxy/routes-agent.js +51 -0
  112. package/dist/proxy/routes-agent.js.map +1 -0
  113. package/dist/proxy/routes-config.d.ts +2 -0
  114. package/dist/proxy/routes-config.js +51 -0
  115. package/dist/proxy/routes-config.js.map +1 -0
  116. package/dist/proxy/routes-datasource.d.ts +2 -0
  117. package/dist/proxy/routes-datasource.js +30 -0
  118. package/dist/proxy/routes-datasource.js.map +1 -0
  119. package/dist/proxy/routes-keys.d.ts +7 -0
  120. package/dist/proxy/routes-keys.js +44 -0
  121. package/dist/proxy/routes-keys.js.map +1 -0
  122. package/dist/proxy/routes-profile.d.ts +2 -0
  123. package/dist/proxy/routes-profile.js +29 -0
  124. package/dist/proxy/routes-profile.js.map +1 -0
  125. package/dist/proxy/routes-status.d.ts +2 -0
  126. package/dist/proxy/routes-status.js +9 -0
  127. package/dist/proxy/routes-status.js.map +1 -0
  128. package/dist/proxy/routes-ttyd.d.ts +3 -0
  129. package/dist/proxy/routes-ttyd.js +41 -0
  130. package/dist/proxy/routes-ttyd.js.map +1 -0
  131. package/dist/proxy/routes-workspace.d.ts +2 -0
  132. package/dist/proxy/routes-workspace.js +77 -0
  133. package/dist/proxy/routes-workspace.js.map +1 -0
  134. package/dist/proxy/server.d.ts +22 -0
  135. package/dist/proxy/server.js +130 -0
  136. package/dist/proxy/server.js.map +1 -0
  137. package/dist/proxy/ttyd-manager.d.ts +19 -0
  138. package/dist/proxy/ttyd-manager.js +68 -0
  139. package/dist/proxy/ttyd-manager.js.map +1 -0
  140. package/dist/proxy/utils.d.ts +3 -0
  141. package/dist/proxy/utils.js +13 -0
  142. package/dist/proxy/utils.js.map +1 -0
  143. package/dist/proxy/ws-proxy.d.ts +6 -0
  144. package/dist/proxy/ws-proxy.js +30 -0
  145. package/dist/proxy/ws-proxy.js.map +1 -0
  146. package/package.json +40 -0
  147. package/ui/index.html +631 -0
@@ -0,0 +1,26 @@
1
+ import { loadConfig } from '../core/config.js';
2
+ import { HappyAgent } from '../agents/happy.js';
3
+ import { OpenClawAgent } from '../agents/openclaw.js';
4
+ export async function cmdStatus() {
5
+ const config = loadConfig();
6
+ console.log(`[openme] Node: ${config.node.name} (${config.node.id})`);
7
+ console.log(`[openme] Mode: ${config.node.mode}`);
8
+ console.log(`[openme] Server: ${config.controlPlane.url}`);
9
+ console.log(`[openme] Proxy: :${config.proxy.port}`);
10
+ console.log('');
11
+ const agents = [];
12
+ if (config.agents.happy.enabled)
13
+ agents.push(new HappyAgent(config.agents.happy));
14
+ if (config.agents.openclaw.enabled)
15
+ agents.push(new OpenClawAgent(config.agents.openclaw));
16
+ for (const agent of agents) {
17
+ const h = await agent.health();
18
+ const status = h.ok ? '✓ running' : '✗ stopped';
19
+ const pid = h.pid ? ` (pid: ${h.pid})` : '';
20
+ console.log(` ${agent.name}: ${status}${pid}`);
21
+ }
22
+ if (agents.length === 0) {
23
+ console.log(' No agents enabled.');
24
+ }
25
+ }
26
+ //# sourceMappingURL=cmd-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-status.js","sourceRoot":"","sources":["../../src/cli/cmd-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE3F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function cmdStop(): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import { loadConfig } from '../core/config.js';
2
+ import { HappyAgent } from '../agents/happy.js';
3
+ import { OpenClawAgent } from '../agents/openclaw.js';
4
+ export async function cmdStop() {
5
+ const config = loadConfig();
6
+ console.log('[openme] Stopping agents...');
7
+ if (config.agents.happy.enabled) {
8
+ await new HappyAgent(config.agents.happy).stop().catch(() => { });
9
+ console.log('[openme] happy daemon stopped');
10
+ }
11
+ if (config.agents.openclaw.enabled) {
12
+ await new OpenClawAgent(config.agents.openclaw).stop().catch(() => { });
13
+ console.log('[openme] openclaw gateway stopped');
14
+ }
15
+ console.log('[openme] All agents stopped.');
16
+ }
17
+ //# sourceMappingURL=cmd-stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-stop.js","sourceRoot":"","sources":["../../src/cli/cmd-stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function cmdWorkspace(sub: string): Promise<void>;
@@ -0,0 +1,32 @@
1
+ import { loadConfig, resolveWorkspaceDir } from '../core/config.js';
2
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export async function cmdWorkspace(sub) {
5
+ const config = loadConfig();
6
+ const wsDir = resolveWorkspaceDir(config);
7
+ switch (sub) {
8
+ case 'status': {
9
+ console.log(`[openme] Workspace: ${wsDir}`);
10
+ if (!existsSync(wsDir)) {
11
+ console.log(' Not initialized. Run "openme start" first.');
12
+ return;
13
+ }
14
+ for (const item of readdirSync(wsDir, { withFileTypes: true })) {
15
+ console.log(` ${item.isDirectory() ? '📁' : '📄'} ${item.name}`);
16
+ }
17
+ break;
18
+ }
19
+ case 'profile': {
20
+ const profilePath = join(wsDir, 'USER.md');
21
+ if (!existsSync(profilePath)) {
22
+ console.log('[openme] No profile yet. Run "openme start" to generate.');
23
+ return;
24
+ }
25
+ console.log(readFileSync(profilePath, 'utf-8'));
26
+ break;
27
+ }
28
+ default:
29
+ console.error(`Unknown workspace command: ${sub}\nUsage: openme workspace <status|profile>`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=cmd-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-workspace.js","sourceRoot":"","sources":["../../src/cli/cmd-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE1C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChG,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAClH,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAChD,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,4CAA4C,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ import { Command } from 'commander';
2
+ import { cmdInit } from './cmd-init.js';
3
+ import { cmdInstall } from './cmd-install.js';
4
+ import { cmdStart } from './cmd-start.js';
5
+ import { cmdStop } from './cmd-stop.js';
6
+ import { cmdStatus } from './cmd-status.js';
7
+ import { cmdDatasource } from './cmd-datasource.js';
8
+ import { cmdWorkspace } from './cmd-workspace.js';
9
+ import { cmdAgent } from './cmd-agent.js';
10
+ const program = new Command();
11
+ program
12
+ .name('openme')
13
+ .description('OpenMe — Personal AI Data Runtime')
14
+ .version('0.1.0');
15
+ program.command('install')
16
+ .description('Detect and install external dependencies (ttyd)')
17
+ .option('--check', 'Only check, do not install')
18
+ .action(cmdInstall);
19
+ program.command('init')
20
+ .description('Initialize OpenMe configuration')
21
+ .option('-n, --name <name>', 'Node name')
22
+ .option('-m, --mode <mode>', 'Node mode: device | edge | cloud', 'device')
23
+ .option('-u, --url <url>', 'Happy server URL')
24
+ .action(cmdInit);
25
+ program.command('start')
26
+ .description('Start all enabled agents')
27
+ .option('-d, --daemon', 'Run in background daemon mode')
28
+ .action(cmdStart);
29
+ program.command('stop')
30
+ .description('Stop all agents')
31
+ .action(cmdStop);
32
+ program.command('status')
33
+ .description('Show agent status')
34
+ .action(cmdStatus);
35
+ program.command('datasource <sub> [args...]')
36
+ .description('Manage data sources (list|add|remove|sync)')
37
+ .action(cmdDatasource);
38
+ program.command('workspace <sub>')
39
+ .description('Workspace operations (status|profile)')
40
+ .option('--refresh', 'Refresh profile')
41
+ .action(cmdWorkspace);
42
+ program.command('agent <sub> [args...]')
43
+ .description('Agent management (list|restart|stop|start)')
44
+ .action(cmdAgent);
45
+ program.parse();
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;KACvB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,SAAS,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;KACpB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC;KACxC,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,EAAE,QAAQ,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KAC7C,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;KACrB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC;KACvD,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;KACpB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;KACtB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,SAAS,CAAC,CAAC;AAErB,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC;KAC1C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;KAC/B,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACtC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;KACrC,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { OpenMeConfig } from './config.js';
2
+ /**
3
+ * Generate ~/.openclaw/openclaw.json from openme config.
4
+ * Forces workspaceOnly=true and ttyd.enabled=false.
5
+ */
6
+ export declare function syncOpenClawConfig(config: OpenMeConfig): void;
@@ -0,0 +1,41 @@
1
+ import { writeFileSync, mkdirSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { resolveWorkspaceDir } from './config.js';
5
+ const OPENCLAW_CONFIG_DIR = join(homedir(), '.openclaw');
6
+ const OPENCLAW_CONFIG_FILE = join(OPENCLAW_CONFIG_DIR, 'openclaw.json');
7
+ /**
8
+ * Generate ~/.openclaw/openclaw.json from openme config.
9
+ * Forces workspaceOnly=true and ttyd.enabled=false.
10
+ */
11
+ export function syncOpenClawConfig(config) {
12
+ const oc = config.agents.openclaw;
13
+ const workspaceDir = resolveWorkspaceDir(config);
14
+ // Read existing config to preserve openclaw-managed fields
15
+ let existing = {};
16
+ try {
17
+ existing = JSON.parse(readFileSync(OPENCLAW_CONFIG_FILE, 'utf-8'));
18
+ }
19
+ catch { }
20
+ const openclawConfig = {
21
+ ...existing,
22
+ tools: {
23
+ ...existing.tools,
24
+ ...oc.config.tools,
25
+ fs: { ...oc.config.tools?.fs, workspaceOnly: true },
26
+ },
27
+ gateway: { ...existing.gateway, mode: 'local' },
28
+ agents: {
29
+ ...existing.agents,
30
+ defaults: {
31
+ ...(existing.agents?.defaults),
32
+ workspace: workspaceDir,
33
+ ...(oc.config.agent?.model ? { model: { primary: oc.config.agent.model } } : {}),
34
+ },
35
+ },
36
+ };
37
+ mkdirSync(OPENCLAW_CONFIG_DIR, { recursive: true });
38
+ writeFileSync(OPENCLAW_CONFIG_FILE, JSON.stringify(openclawConfig, null, 2));
39
+ console.log(`[openme] Synced openclaw config → ${OPENCLAW_CONFIG_FILE}`);
40
+ }
41
+ //# sourceMappingURL=config-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-sync.js","sourceRoot":"","sources":["../../src/core/config-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAgB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACzD,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;IAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEjD,2DAA2D;IAC3D,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEpF,MAAM,cAAc,GAA4B;QAC9C,GAAG,QAAQ;QACX,KAAK,EAAE;YACL,GAAI,QAAQ,CAAC,KAAa;YAC1B,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK;YAClB,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;SACpD;QACD,OAAO,EAAE,EAAE,GAAK,QAAQ,CAAC,OAAgB,EAAE,IAAI,EAAE,OAAO,EAAE;QAC1D,MAAM,EAAE;YACN,GAAI,QAAQ,CAAC,MAAc;YAC3B,QAAQ,EAAE;gBACR,GAAG,CAAE,QAAQ,CAAC,MAAc,EAAE,QAAQ,CAAC;gBACvC,SAAS,EAAE,YAAY;gBACvB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF;SACF;KACF,CAAC;IAEF,SAAS,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,qCAAqC,oBAAoB,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,96 @@
1
+ export interface DataSourceConfig {
2
+ enabled: boolean;
3
+ credentials: string;
4
+ syncInterval?: string;
5
+ syncTo: string;
6
+ imap?: {
7
+ host: string;
8
+ port: number;
9
+ };
10
+ folders?: string[];
11
+ exportFormat?: string;
12
+ remotePath?: string;
13
+ }
14
+ export interface ProfileConfig {
15
+ autoUpdate: boolean;
16
+ updateInterval: string;
17
+ injectTo: string;
18
+ }
19
+ export interface WorkspaceConfig {
20
+ dir: string;
21
+ enforceRestriction: boolean;
22
+ }
23
+ export interface HappyAgentConfig {
24
+ enabled: boolean;
25
+ env?: Record<string, string>;
26
+ }
27
+ export interface OpenClawAgentConfig {
28
+ enabled: boolean;
29
+ port: number;
30
+ bind: 'loopback' | 'lan';
31
+ config: {
32
+ agent?: {
33
+ model?: string;
34
+ };
35
+ tools?: {
36
+ fs?: {
37
+ workspaceOnly?: boolean;
38
+ };
39
+ };
40
+ ttyd?: {
41
+ enabled?: boolean;
42
+ };
43
+ channels?: Record<string, unknown>;
44
+ };
45
+ }
46
+ export interface TtydPreset {
47
+ name: string;
48
+ cmd: string;
49
+ }
50
+ export interface ProxyConfig {
51
+ port: number;
52
+ auth: {
53
+ token: string;
54
+ };
55
+ ttyd: {
56
+ defaultShell: string;
57
+ presets: TtydPreset[];
58
+ maxSessions: number;
59
+ };
60
+ }
61
+ export interface OpenMeConfig {
62
+ node: {
63
+ id: string;
64
+ name: string;
65
+ mode: 'device' | 'edge' | 'cloud';
66
+ };
67
+ controlPlane: {
68
+ url: string;
69
+ token?: string;
70
+ };
71
+ deps: {
72
+ openclaw: {
73
+ version: string;
74
+ };
75
+ ttyd: {
76
+ version: string;
77
+ };
78
+ };
79
+ dataSources: Record<string, DataSourceConfig>;
80
+ profile: ProfileConfig;
81
+ workspace: WorkspaceConfig;
82
+ agents: {
83
+ happy: HappyAgentConfig;
84
+ openclaw: OpenClawAgentConfig;
85
+ };
86
+ proxy: ProxyConfig;
87
+ }
88
+ export declare const CONFIG_DIR: string;
89
+ export declare const CONFIG_FILE: string;
90
+ export declare const CREDENTIALS_DIR: string;
91
+ export declare const WORKSPACE_DIR: string;
92
+ export declare function resolveWorkspaceDir(config: OpenMeConfig): string;
93
+ export declare function loadConfig(): OpenMeConfig;
94
+ export declare function saveConfig(config: OpenMeConfig): void;
95
+ export declare function initConfig(overrides?: Partial<Pick<OpenMeConfig, 'node' | 'controlPlane'>>): OpenMeConfig;
96
+ export declare function configExists(): boolean;
@@ -0,0 +1,91 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { homedir, hostname } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { generateNodeId } from './node-id.js';
5
+ export const CONFIG_DIR = join(homedir(), '.openme');
6
+ export const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
7
+ export const CREDENTIALS_DIR = join(CONFIG_DIR, 'credentials');
8
+ export const WORKSPACE_DIR = join(homedir(), '.openme', 'workspace');
9
+ function defaultConfig() {
10
+ return {
11
+ node: {
12
+ id: generateNodeId(),
13
+ name: hostname(),
14
+ mode: 'device',
15
+ },
16
+ controlPlane: {
17
+ url: process.env.HAPPY_SERVER_URL || 'https://happy.shadanai.com',
18
+ },
19
+ deps: {
20
+ openclaw: { version: 'latest' },
21
+ ttyd: { version: 'latest' },
22
+ },
23
+ dataSources: {},
24
+ profile: {
25
+ autoUpdate: true,
26
+ updateInterval: '24h',
27
+ injectTo: 'USER.md',
28
+ },
29
+ workspace: {
30
+ dir: '~/.openme/workspace',
31
+ enforceRestriction: true,
32
+ },
33
+ agents: {
34
+ happy: { enabled: true, env: {} },
35
+ openclaw: {
36
+ enabled: true,
37
+ port: 18789,
38
+ bind: 'loopback',
39
+ config: {
40
+ agent: { model: 'zhipu/glm-5' },
41
+ tools: { fs: { workspaceOnly: true } },
42
+ ttyd: { enabled: false },
43
+ channels: {},
44
+ },
45
+ },
46
+ },
47
+ proxy: {
48
+ port: 18800,
49
+ auth: { token: `openme-${generateNodeId().slice(0, 8)}` },
50
+ ttyd: {
51
+ defaultShell: 'bash',
52
+ presets: [
53
+ { name: 'Kiro', cmd: 'kiro-cli chat' },
54
+ { name: 'Claude Code', cmd: 'claude' },
55
+ { name: 'Bash', cmd: 'bash' },
56
+ ],
57
+ maxSessions: 4,
58
+ },
59
+ },
60
+ };
61
+ }
62
+ export function resolveWorkspaceDir(config) {
63
+ return config.workspace.dir.replace(/^~/, homedir());
64
+ }
65
+ export function loadConfig() {
66
+ if (!existsSync(CONFIG_FILE)) {
67
+ throw new Error(`Config not found. Run "openme init" first.`);
68
+ }
69
+ return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
70
+ }
71
+ export function saveConfig(config) {
72
+ mkdirSync(CONFIG_DIR, { recursive: true });
73
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
74
+ }
75
+ export function initConfig(overrides) {
76
+ const config = defaultConfig();
77
+ if (overrides?.node) {
78
+ const { id, ...rest } = overrides.node;
79
+ Object.assign(config.node, rest);
80
+ if (id)
81
+ config.node.id = id;
82
+ }
83
+ if (overrides?.controlPlane)
84
+ Object.assign(config.controlPlane, overrides.controlPlane);
85
+ saveConfig(config);
86
+ return config;
87
+ }
88
+ export function configExists() {
89
+ return existsSync(CONFIG_FILE);
90
+ }
91
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function generateNodeId(): string;
@@ -0,0 +1,5 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export function generateNodeId() {
3
+ return randomUUID();
4
+ }
5
+ //# sourceMappingURL=node-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-id.js","sourceRoot":"","sources":["../../src/core/node-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { OpenMeConfig } from './config.js';
2
+ export interface NodeInfo {
3
+ nodeId: string;
4
+ nodeName: string;
5
+ nodeMode: 'device' | 'edge' | 'cloud';
6
+ online: boolean;
7
+ agents: {
8
+ happy?: {
9
+ connected: boolean;
10
+ };
11
+ openclaw?: {
12
+ url: string;
13
+ };
14
+ };
15
+ }
16
+ /**
17
+ * Build node info payload. URL points to proxy port (18800), not openclaw directly.
18
+ */
19
+ export declare function buildNodeInfo(config: OpenMeConfig, openclawHealthy: boolean): NodeInfo;
@@ -0,0 +1,31 @@
1
+ import { networkInterfaces } from 'node:os';
2
+ /**
3
+ * Build node info payload. URL points to proxy port (18800), not openclaw directly.
4
+ */
5
+ export function buildNodeInfo(config, openclawHealthy) {
6
+ const localIp = getLocalIp();
7
+ const proxyPort = config.proxy.port;
8
+ const bind = config.agents.openclaw.bind;
9
+ const host = bind === 'lan' ? localIp : '127.0.0.1';
10
+ return {
11
+ nodeId: config.node.id,
12
+ nodeName: config.node.name,
13
+ nodeMode: config.node.mode,
14
+ online: true,
15
+ agents: {
16
+ happy: { connected: config.agents.happy.enabled },
17
+ openclaw: openclawHealthy ? { url: `http://${host}:${proxyPort}` } : undefined,
18
+ },
19
+ };
20
+ }
21
+ function getLocalIp() {
22
+ const nets = networkInterfaces();
23
+ for (const name of Object.keys(nets)) {
24
+ for (const net of nets[name]) {
25
+ if (net.family === 'IPv4' && !net.internal)
26
+ return net.address;
27
+ }
28
+ }
29
+ return '127.0.0.1';
30
+ }
31
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/core/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAa5C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,eAAwB;IAC1E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAEpD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;QACtB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QAC1B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QAC1B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE;YACN,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;SAC/E;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAE,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Connector, SyncResult } from './connector.js';
2
+ /**
3
+ * Baidu Pan connector.
4
+ * Uses Open API: https://pan.baidu.com/union/doc/
5
+ *
6
+ * Credentials: { accessToken, remotePath? }
7
+ * accessToken: OAuth2 access token from Baidu Pan
8
+ * remotePath: remote directory to sync (default "/")
9
+ */
10
+ export declare class BaiduPanConnector implements Connector {
11
+ readonly type = "baidupan";
12
+ private token;
13
+ private remotePath;
14
+ connect(credentials: {
15
+ accessToken: string;
16
+ remotePath?: string;
17
+ }): Promise<void>;
18
+ sync(targetDir: string): Promise<SyncResult>;
19
+ disconnect(): Promise<void>;
20
+ }
@@ -0,0 +1,69 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Baidu Pan connector.
5
+ * Uses Open API: https://pan.baidu.com/union/doc/
6
+ *
7
+ * Credentials: { accessToken, remotePath? }
8
+ * accessToken: OAuth2 access token from Baidu Pan
9
+ * remotePath: remote directory to sync (default "/")
10
+ */
11
+ export class BaiduPanConnector {
12
+ type = 'baidupan';
13
+ token = '';
14
+ remotePath = '/';
15
+ async connect(credentials) {
16
+ this.token = credentials.accessToken;
17
+ this.remotePath = credentials.remotePath || '/';
18
+ }
19
+ async sync(targetDir) {
20
+ mkdirSync(targetDir, { recursive: true });
21
+ const result = { added: 0, updated: 0, deleted: 0, errors: [] };
22
+ if (!this.token) {
23
+ result.errors.push('Not connected');
24
+ return result;
25
+ }
26
+ try {
27
+ // List files in remote path
28
+ const dir = encodeURIComponent(this.remotePath);
29
+ const res = await fetch(`https://pan.baidu.com/rest/2.0/xpan/file?method=list&dir=${dir}&limit=100&access_token=${this.token}`);
30
+ const data = await res.json();
31
+ if (data.errno !== 0) {
32
+ result.errors.push(`Baidu Pan API error: errno=${data.errno}`);
33
+ return result;
34
+ }
35
+ const files = data.list || [];
36
+ const indexLines = ['# Baidu Pan Files', '', `> Path: ${this.remotePath}`, ''];
37
+ for (const file of files) {
38
+ const isDir = file.isdir === 1;
39
+ const name = file.server_filename || file.path.split('/').pop();
40
+ const size = file.size ? `${(file.size / 1024).toFixed(1)} KB` : 'N/A';
41
+ const modified = file.server_mtime ? new Date(file.server_mtime * 1000).toISOString() : 'N/A';
42
+ indexLines.push(`- ${isDir ? '📁' : '📄'} **${name}** — ${size} — ${modified}`);
43
+ // For text-like files, try to get content (small files only)
44
+ if (!isDir && file.size < 100_000 && /\.(txt|md|json|csv|log)$/i.test(name)) {
45
+ try {
46
+ const dlRes = await fetch(`https://pan.baidu.com/rest/2.0/xpan/file?method=download&path=${encodeURIComponent(file.path)}&access_token=${this.token}`, { redirect: 'follow' });
47
+ if (dlRes.ok) {
48
+ const content = await dlRes.text();
49
+ const safeName = name.replace(/[^a-zA-Z0-9\u4e00-\u9fff._-]/g, '_');
50
+ writeFileSync(join(targetDir, safeName), content);
51
+ result.added++;
52
+ }
53
+ }
54
+ catch { }
55
+ }
56
+ }
57
+ writeFileSync(join(targetDir, 'INDEX.md'), indexLines.join('\n'));
58
+ result.added++;
59
+ }
60
+ catch (err) {
61
+ result.errors.push(err.message);
62
+ }
63
+ return result;
64
+ }
65
+ async disconnect() {
66
+ this.token = '';
67
+ }
68
+ }
69
+ //# sourceMappingURL=baidupan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baidupan.js","sourceRoot":"","sources":["../../../src/data/connectors/baidupan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SyncResult {
2
+ added: number;
3
+ updated: number;
4
+ deleted: number;
5
+ errors: string[];
6
+ }
7
+ export interface Connector {
8
+ readonly type: string;
9
+ connect(credentials: any): Promise<void>;
10
+ sync(targetDir: string): Promise<SyncResult>;
11
+ disconnect(): Promise<void>;
12
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/data/connectors/connector.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { Connector, SyncResult } from './connector.js';
2
+ /**
3
+ * DingTalk connector.
4
+ * Uses Open API: https://open.dingtalk.com/document/orgapp/obtain-the-access_token-of-an-internal-app
5
+ *
6
+ * Credentials: { appKey, appSecret }
7
+ */
8
+ export declare class DingTalkConnector implements Connector {
9
+ readonly type = "dingtalk";
10
+ private token;
11
+ connect(credentials: {
12
+ appKey: string;
13
+ appSecret: string;
14
+ }): Promise<void>;
15
+ sync(targetDir: string): Promise<SyncResult>;
16
+ disconnect(): Promise<void>;
17
+ private api;
18
+ }