@undefineds.co/xpod 0.3.14 → 0.3.16

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 (76) hide show
  1. package/config/local.json +5 -5
  2. package/config/xpod.json +24 -10
  3. package/dist/cli/commands/auth.d.ts +1 -0
  4. package/dist/cli/commands/auth.js +117 -37
  5. package/dist/cli/commands/auth.js.map +1 -1
  6. package/dist/cli/commands/login.js +16 -23
  7. package/dist/cli/commands/login.js.map +1 -1
  8. package/dist/cli/commands/logs.d.ts +2 -0
  9. package/dist/cli/commands/logs.js +20 -5
  10. package/dist/cli/commands/logs.js.map +1 -1
  11. package/dist/cli/commands/obj.d.ts +44 -0
  12. package/dist/cli/commands/obj.js +1059 -0
  13. package/dist/cli/commands/obj.js.map +1 -0
  14. package/dist/cli/commands/rdf.d.ts +14 -0
  15. package/dist/cli/commands/rdf.js +235 -0
  16. package/dist/cli/commands/rdf.js.map +1 -0
  17. package/dist/cli/commands/resource.d.ts +31 -0
  18. package/dist/cli/commands/resource.js +191 -0
  19. package/dist/cli/commands/resource.js.map +1 -0
  20. package/dist/cli/commands/secret.d.ts +36 -0
  21. package/dist/cli/commands/secret.js +285 -0
  22. package/dist/cli/commands/secret.js.map +1 -0
  23. package/dist/cli/commands/server.d.ts +11 -0
  24. package/dist/cli/commands/server.js +168 -0
  25. package/dist/cli/commands/server.js.map +1 -0
  26. package/dist/cli/commands/start.d.ts +1 -0
  27. package/dist/cli/commands/start.js +5 -0
  28. package/dist/cli/commands/start.js.map +1 -1
  29. package/dist/cli/commands/status.d.ts +1 -0
  30. package/dist/cli/commands/status.js +21 -6
  31. package/dist/cli/commands/status.js.map +1 -1
  32. package/dist/cli/commands/stop.d.ts +3 -0
  33. package/dist/cli/commands/stop.js +40 -6
  34. package/dist/cli/commands/stop.js.map +1 -1
  35. package/dist/cli/index.js +23 -8
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/lib/auth-context.d.ts +24 -0
  38. package/dist/cli/lib/auth-context.js +70 -0
  39. package/dist/cli/lib/auth-context.js.map +1 -0
  40. package/dist/cli/lib/output.d.ts +23 -0
  41. package/dist/cli/lib/output.js +63 -0
  42. package/dist/cli/lib/output.js.map +1 -0
  43. package/dist/cli/lib/resource.d.ts +29 -0
  44. package/dist/cli/lib/resource.js +114 -0
  45. package/dist/cli/lib/resource.js.map +1 -0
  46. package/dist/components/context.jsonld +6 -0
  47. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +11 -10
  48. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +13 -24
  49. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  50. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +4 -4
  51. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +8 -4
  52. package/dist/identity/oidc/AutoDetectOidcHandler.js +10 -6
  53. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  54. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +3 -3
  55. package/dist/storage/accessors/MixDataAccessor.js +3 -0
  56. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  57. package/dist/storage/quint/SqliteQuintStore.d.ts +26 -1
  58. package/dist/storage/quint/SqliteQuintStore.js +551 -318
  59. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  60. package/dist/storage/quint/SqliteQuintStore.jsonld +102 -2
  61. package/dist/storage/quint/schema.d.ts +76 -0
  62. package/dist/storage/quint/schema.js +13 -7
  63. package/dist/storage/quint/schema.js.map +1 -1
  64. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +4 -1
  65. package/dist/storage/rdf/RdfLocalQueryEngine.js +77 -8
  66. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
  67. package/dist/storage/rdf/SolidRdfEngine.d.ts +5 -0
  68. package/dist/storage/rdf/SolidRdfEngine.js +31 -3
  69. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  70. package/dist/storage/rdf/SolidRdfEngine.jsonld +34 -0
  71. package/dist/storage/sparql/ComunicaQuintEngine.js +16 -3
  72. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  73. package/package.json +1 -1
  74. package/dist/cli/commands/config.d.ts +0 -42
  75. package/dist/cli/commands/config.js +0 -289
  76. package/dist/cli/commands/config.js.map +0 -1
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serverCommand = exports.serverConfigCommand = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const os_1 = require("os");
7
+ const start_1 = require("./start");
8
+ const stop_1 = require("./stop");
9
+ const status_1 = require("./status");
10
+ const logs_1 = require("./logs");
11
+ const output_1 = require("../lib/output");
12
+ function configPath() {
13
+ return (0, path_1.join)((0, os_1.homedir)(), '.xpod', 'server-config.json');
14
+ }
15
+ function readConfig() {
16
+ try {
17
+ const path = configPath();
18
+ if (!(0, fs_1.existsSync)(path))
19
+ return {};
20
+ const parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf-8'));
21
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
22
+ ? Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, String(value)]))
23
+ : {};
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ }
29
+ function writeConfig(config) {
30
+ const path = configPath();
31
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
32
+ (0, fs_1.writeFileSync)(path, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
33
+ }
34
+ const healthCommand = {
35
+ command: 'health',
36
+ describe: 'Show xpod server health checks',
37
+ builder: (yargs) => yargs
38
+ .option('port', { alias: 'p', type: 'number', default: 3000, description: 'Gateway port' })
39
+ .option('host', { type: 'string', default: 'localhost', description: 'Gateway host' })
40
+ .option('env', { alias: 'e', type: 'string', description: 'Env file path for runtime context' })
41
+ .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
42
+ handler: async (argv) => {
43
+ const baseUrl = `http://${argv.host}:${argv.port}`;
44
+ try {
45
+ const checks = {
46
+ gateway: 'fail',
47
+ css: 'fail',
48
+ api: 'fail',
49
+ };
50
+ try {
51
+ const gateway = await fetch(`${baseUrl}/service/status`);
52
+ checks.gateway = gateway.ok ? 'pass' : 'fail';
53
+ }
54
+ catch {
55
+ checks.gateway = 'fail';
56
+ }
57
+ try {
58
+ const css = await fetch(`${baseUrl}/`, { method: 'HEAD' });
59
+ checks.css = css.ok ? 'pass' : 'fail';
60
+ }
61
+ catch {
62
+ checks.css = 'fail';
63
+ }
64
+ try {
65
+ const api = await fetch(`${baseUrl}/api/ready`);
66
+ checks.api = api.ok ? 'pass' : 'fail';
67
+ }
68
+ catch {
69
+ checks.api = 'fail';
70
+ }
71
+ const data = {
72
+ schemaVersion: '1.0',
73
+ healthy: Object.values(checks).every((status) => status === 'pass'),
74
+ checks,
75
+ timestamp: new Date().toISOString(),
76
+ };
77
+ if (argv.json) {
78
+ (0, output_1.writeJsonResult)(data);
79
+ return;
80
+ }
81
+ console.log(data.healthy ? 'Healthy' : 'Unhealthy');
82
+ for (const [name, status] of Object.entries(checks)) {
83
+ console.log(` ${name}: ${status}`);
84
+ }
85
+ }
86
+ catch (error) {
87
+ (0, output_1.handleCliError)(error, argv.json === true);
88
+ }
89
+ },
90
+ };
91
+ const configGetCommand = {
92
+ command: 'get <key>',
93
+ describe: 'Get xpod server config value',
94
+ builder: (yargs) => yargs
95
+ .positional('key', { type: 'string', demandOption: true, description: 'Config key' })
96
+ .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
97
+ handler: (argv) => {
98
+ const config = readConfig();
99
+ const value = config[argv.key];
100
+ if (argv.json) {
101
+ (0, output_1.writeJsonResult)({ key: argv.key, value: value ?? null });
102
+ return;
103
+ }
104
+ if (value === undefined) {
105
+ console.log('');
106
+ return;
107
+ }
108
+ console.log(value);
109
+ },
110
+ };
111
+ const configSetCommand = {
112
+ command: 'set <key> <value>',
113
+ describe: 'Set xpod server config value',
114
+ builder: (yargs) => yargs
115
+ .positional('key', { type: 'string', demandOption: true, description: 'Config key' })
116
+ .positional('value', { type: 'string', demandOption: true, description: 'Config value' })
117
+ .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
118
+ handler: (argv) => {
119
+ const config = readConfig();
120
+ config[argv.key] = argv.value;
121
+ writeConfig(config);
122
+ const data = { key: argv.key, value: argv.value, path: configPath() };
123
+ if (argv.json) {
124
+ (0, output_1.writeJsonResult)(data);
125
+ return;
126
+ }
127
+ console.log(`${argv.key}=${argv.value}`);
128
+ },
129
+ };
130
+ const configListCommand = {
131
+ command: 'list',
132
+ describe: 'List xpod server config values',
133
+ builder: (yargs) => yargs.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
134
+ handler: (argv) => {
135
+ const config = readConfig();
136
+ if (argv.json) {
137
+ (0, output_1.writeJsonResult)({ config, path: configPath() });
138
+ return;
139
+ }
140
+ for (const [key, value] of Object.entries(config)) {
141
+ console.log(`${key}=${value}`);
142
+ }
143
+ },
144
+ };
145
+ exports.serverConfigCommand = {
146
+ command: 'config',
147
+ describe: 'Manage xpod server config',
148
+ builder: (yargs) => yargs
149
+ .command(configGetCommand)
150
+ .command(configSetCommand)
151
+ .command(configListCommand)
152
+ .demandCommand(1, 'Please specify a server config subcommand'),
153
+ handler: () => { },
154
+ };
155
+ exports.serverCommand = {
156
+ command: 'server',
157
+ describe: 'Manage the xpod server runtime',
158
+ builder: (yargs) => yargs
159
+ .command(start_1.startCommand)
160
+ .command(stop_1.stopCommand)
161
+ .command(status_1.statusCommand)
162
+ .command(healthCommand)
163
+ .command(logs_1.logsCommand)
164
+ .command(exports.serverConfigCommand)
165
+ .demandCommand(1, 'Please specify a server subcommand'),
166
+ handler: () => { },
167
+ };
168
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/commands/server.ts"],"names":[],"mappings":";;;AACA,2BAAwE;AACxE,+BAAqC;AACrC,2BAA6B;AAC7B,mCAAuC;AACvC,iCAAqC;AACrC,qCAAyC;AACzC,iCAAqC;AACrC,0CAAgE;AAiBhE,SAAS,UAAU;IACjB,OAAO,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAY,CAAC;QAClE,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,EAAE,KAAK,CAAE,EAAE,EAAE,CAAC,CAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAE,CAAC,CAAC;YAC5F,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAA8B;IACjD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAA,kBAAa,EAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,aAAa,GAAsC;IACvD,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,gCAAgC;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;SAC1F,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;SACrF,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;SAC/F,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC7F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAoC;gBAC9C,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,MAAM;gBACX,GAAG,EAAE,MAAM;aACZ,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;gBACzD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3D,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,MAAM,IAAI,GAAG;gBACX,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC;gBACnE,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACpD,KAAK,MAAM,CAAE,IAAI,EAAE,MAAM,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,uBAAc,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAsC;IAC1D,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,8BAA8B;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;SACpF,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC7F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAA,wBAAe,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAsC;IAC1D,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,8BAA8B;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;SACpF,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;SACxF,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC7F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,GAAG,IAAI,CAAC,KAAM,CAAC;QAChC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAsC;IAC3D,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,gCAAgC;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAClH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAA,wBAAe,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF,CAAC;AAEW,QAAA,mBAAmB,GAAsC;IACpE,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,2BAA2B;IACrC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,OAAO,CAAC,gBAAgB,CAAC;SACzB,OAAO,CAAC,iBAAiB,CAAC;SAC1B,aAAa,CAAC,CAAC,EAAE,2CAA2C,CAAC;IAClE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;CAClB,CAAC;AAEW,QAAA,aAAa,GAAsC;IAC9D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,gCAAgC;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,oBAAY,CAAC;SACrB,OAAO,CAAC,kBAAW,CAAC;SACpB,OAAO,CAAC,sBAAa,CAAC;SACtB,OAAO,CAAC,aAAa,CAAC;SACtB,OAAO,CAAC,kBAAW,CAAC;SACpB,OAAO,CAAC,2BAAmB,CAAC;SAC5B,aAAa,CAAC,CAAC,EAAE,oCAAoC,CAAC;IAC3D,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;CAClB,CAAC","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\nimport { startCommand } from './start';\nimport { stopCommand } from './stop';\nimport { statusCommand } from './status';\nimport { logsCommand } from './logs';\nimport { handleCliError, writeJsonResult } from '../lib/output';\n\ninterface ServerArgs {\n json?: boolean;\n}\n\ninterface HealthArgs extends ServerArgs {\n port: number;\n host: string;\n env?: string;\n}\n\ninterface ConfigArgs extends ServerArgs {\n key?: string;\n value?: string;\n}\n\nfunction configPath(): string {\n return join(homedir(), '.xpod', 'server-config.json');\n}\n\nfunction readConfig(): Record<string, string> {\n try {\n const path = configPath();\n if (!existsSync(path)) return {};\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? Object.fromEntries(Object.entries(parsed).map(([ key, value ]) => [ key, String(value) ]))\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(config: Record<string, string>): void {\n const path = configPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`, 'utf-8');\n}\n\nconst healthCommand: CommandModule<object, HealthArgs> = {\n command: 'health',\n describe: 'Show xpod server health checks',\n builder: (yargs) =>\n yargs\n .option('port', { alias: 'p', type: 'number', default: 3000, description: 'Gateway port' })\n .option('host', { type: 'string', default: 'localhost', description: 'Gateway host' })\n .option('env', { alias: 'e', type: 'string', description: 'Env file path for runtime context' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n try {\n const checks: Record<string, 'pass' | 'fail'> = {\n gateway: 'fail',\n css: 'fail',\n api: 'fail',\n };\n\n try {\n const gateway = await fetch(`${baseUrl}/service/status`);\n checks.gateway = gateway.ok ? 'pass' : 'fail';\n } catch {\n checks.gateway = 'fail';\n }\n\n try {\n const css = await fetch(`${baseUrl}/`, { method: 'HEAD' });\n checks.css = css.ok ? 'pass' : 'fail';\n } catch {\n checks.css = 'fail';\n }\n\n try {\n const api = await fetch(`${baseUrl}/api/ready`);\n checks.api = api.ok ? 'pass' : 'fail';\n } catch {\n checks.api = 'fail';\n }\n\n const data = {\n schemaVersion: '1.0',\n healthy: Object.values(checks).every((status) => status === 'pass'),\n checks,\n timestamp: new Date().toISOString(),\n };\n\n if (argv.json) {\n writeJsonResult(data);\n return;\n }\n console.log(data.healthy ? 'Healthy' : 'Unhealthy');\n for (const [ name, status ] of Object.entries(checks)) {\n console.log(` ${name}: ${status}`);\n }\n } catch (error) {\n handleCliError(error, argv.json === true);\n }\n },\n};\n\nconst configGetCommand: CommandModule<object, ConfigArgs> = {\n command: 'get <key>',\n describe: 'Get xpod server config value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n const value = config[argv.key!];\n if (argv.json) {\n writeJsonResult({ key: argv.key, value: value ?? null });\n return;\n }\n if (value === undefined) {\n console.log('');\n return;\n }\n console.log(value);\n },\n};\n\nconst configSetCommand: CommandModule<object, ConfigArgs> = {\n command: 'set <key> <value>',\n describe: 'Set xpod server config value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key' })\n .positional('value', { type: 'string', demandOption: true, description: 'Config value' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n config[argv.key!] = argv.value!;\n writeConfig(config);\n const data = { key: argv.key, value: argv.value, path: configPath() };\n if (argv.json) {\n writeJsonResult(data);\n return;\n }\n console.log(`${argv.key}=${argv.value}`);\n },\n};\n\nconst configListCommand: CommandModule<object, ConfigArgs> = {\n command: 'list',\n describe: 'List xpod server config values',\n builder: (yargs) => yargs.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n if (argv.json) {\n writeJsonResult({ config, path: configPath() });\n return;\n }\n for (const [ key, value ] of Object.entries(config)) {\n console.log(`${key}=${value}`);\n }\n },\n};\n\nexport const serverConfigCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'Manage xpod server config',\n builder: (yargs) =>\n yargs\n .command(configGetCommand)\n .command(configSetCommand)\n .command(configListCommand)\n .demandCommand(1, 'Please specify a server config subcommand'),\n handler: () => {},\n};\n\nexport const serverCommand: CommandModule<object, ServerArgs> = {\n command: 'server',\n describe: 'Manage the xpod server runtime',\n builder: (yargs) =>\n yargs\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(healthCommand)\n .command(logsCommand)\n .command(serverConfigCommand)\n .demandCommand(1, 'Please specify a server subcommand'),\n handler: () => {},\n};\n"]}
@@ -5,6 +5,7 @@ interface StartArgs {
5
5
  env?: string;
6
6
  port: number;
7
7
  host: string;
8
+ foreground?: boolean;
8
9
  }
9
10
  export declare const startCommand: CommandModule<object, StartArgs>;
10
11
  export {};
@@ -67,6 +67,11 @@ exports.startCommand = {
67
67
  type: 'string',
68
68
  description: 'Gateway host',
69
69
  default: 'localhost',
70
+ })
71
+ .option('foreground', {
72
+ type: 'boolean',
73
+ default: true,
74
+ description: 'Run in the foreground',
70
75
  }),
71
76
  handler: async (argv) => {
72
77
  if (argv.env) {
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\nimport { buildApiChildEnv, buildCssArgs, buildCssChildEnv, createCssChildRuntimeConfig } from '../../runtime/css-process';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nconst childJsRuntime = typeof (globalThis as { Bun?: unknown }).Bun !== 'undefined'\n ? (process.env.XPOD_NODE_BINARY ?? 'node')\n : process.execPath;\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1, argv.host);\n const apiPort = await getFreePort(cssPort + 1, argv.host);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:oidcIssuer 显式指定外部 IdP;Cloud API 地址不再隐式当作 issuer。\n const externalOidcIssuer = resolveExternalOidcIssuer(process.env);\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (externalOidcIssuer) {\n console.log(` SP mode: Cloud IdP = ${externalOidcIssuer}`);\n }\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssRuntimeConfig = createCssChildRuntimeConfig({\n configPath,\n runtimeRoot: path.join(process.cwd(), '.xpod/runtime/legacy-css'),\n externalOidcIssuer,\n });\n const cssArgs = buildCssArgs({\n cssBinary,\n configPath: cssRuntimeConfig.configPath,\n cssModuleRoot: PACKAGE_ROOT,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n });\n\n supervisor.register({\n name: 'css',\n command: childJsRuntime,\n args: cssArgs,\n cwd: cssRuntimeConfig.cwd,\n env: buildCssChildEnv(baseUrl, cssPort, externalOidcIssuer),\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: childJsRuntime,\n args: apiArgs,\n env: buildApiChildEnv({\n apiPort,\n mainPort,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n }),\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\nimport { buildApiChildEnv, buildCssArgs, buildCssChildEnv, createCssChildRuntimeConfig } from '../../runtime/css-process';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n foreground?: boolean;\n}\n\nconst childJsRuntime = typeof (globalThis as { Bun?: unknown }).Bun !== 'undefined'\n ? (process.env.XPOD_NODE_BINARY ?? 'node')\n : process.execPath;\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('foreground', {\n type: 'boolean',\n default: true,\n description: 'Run in the foreground',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1, argv.host);\n const apiPort = await getFreePort(cssPort + 1, argv.host);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:oidcIssuer 显式指定外部 IdP;Cloud API 地址不再隐式当作 issuer。\n const externalOidcIssuer = resolveExternalOidcIssuer(process.env);\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (externalOidcIssuer) {\n console.log(` SP mode: Cloud IdP = ${externalOidcIssuer}`);\n }\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssRuntimeConfig = createCssChildRuntimeConfig({\n configPath,\n runtimeRoot: path.join(process.cwd(), '.xpod/runtime/legacy-css'),\n externalOidcIssuer,\n });\n const cssArgs = buildCssArgs({\n cssBinary,\n configPath: cssRuntimeConfig.configPath,\n cssModuleRoot: PACKAGE_ROOT,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n });\n\n supervisor.register({\n name: 'css',\n command: childJsRuntime,\n args: cssArgs,\n cwd: cssRuntimeConfig.cwd,\n env: buildCssChildEnv(baseUrl, cssPort, externalOidcIssuer),\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: childJsRuntime,\n args: apiArgs,\n env: buildApiChildEnv({\n apiPort,\n mainPort,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n }),\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
@@ -3,6 +3,7 @@ interface StatusArgs {
3
3
  port: number;
4
4
  host: string;
5
5
  json: boolean;
6
+ env?: string;
6
7
  }
7
8
  export declare const statusCommand: CommandModule<object, StatusArgs>;
8
9
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.statusCommand = void 0;
4
+ const output_1 = require("../lib/output");
4
5
  exports.statusCommand = {
5
6
  command: 'status',
6
7
  describe: 'Show service status',
@@ -15,6 +16,11 @@ exports.statusCommand = {
15
16
  type: 'string',
16
17
  description: 'Gateway host',
17
18
  default: 'localhost',
19
+ })
20
+ .option('env', {
21
+ alias: 'e',
22
+ type: 'string',
23
+ description: 'Env file path for runtime context',
18
24
  })
19
25
  .option('json', {
20
26
  type: 'boolean',
@@ -26,12 +32,22 @@ exports.statusCommand = {
26
32
  try {
27
33
  const res = await fetch(`${baseUrl}/service/status`);
28
34
  if (!res.ok) {
29
- console.error(`Failed to get status: HTTP ${res.status}`);
30
- process.exit(1);
35
+ throw new output_1.CliCommandError('server_status_failed', `Failed to get status: HTTP ${res.status}`, 1, {
36
+ status: res.status,
37
+ });
31
38
  }
32
39
  const statuses = (await res.json());
33
40
  if (argv.json) {
34
- console.log(JSON.stringify(statuses, null, 2));
41
+ const running = statuses.some((svc) => svc.status === 'running');
42
+ const ready = statuses.length > 0 && statuses.every((svc) => svc.status === 'running');
43
+ (0, output_1.writeJsonResult)({
44
+ schemaVersion: '1.0',
45
+ running,
46
+ ready,
47
+ baseUrl: `${baseUrl}/`,
48
+ port: argv.port,
49
+ services: statuses,
50
+ });
35
51
  return;
36
52
  }
37
53
  if (statuses.length === 0) {
@@ -55,9 +71,8 @@ exports.statusCommand = {
55
71
  console.log(`${icon} ${svc.name.padEnd(8)} ${svc.status}${pid}${uptime}${restarts}`);
56
72
  }
57
73
  }
58
- catch {
59
- console.error(`Cannot connect to xpod at ${baseUrl}. Is it running?`);
60
- process.exit(1);
74
+ catch (error) {
75
+ (0, output_1.handleCliError)(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);
61
76
  }
62
77
  },
63
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\n\ninterface StatusArgs {\n port: number;\n host: string;\n json: boolean;\n}\n\nexport const statusCommand: CommandModule<object, StatusArgs> = {\n command: 'status',\n describe: 'Show service status',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('json', {\n type: 'boolean',\n description: 'Output as JSON',\n default: false,\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n console.error(`Failed to get status: HTTP ${res.status}`);\n process.exit(1);\n }\n\n const statuses = (await res.json()) as Array<{\n name: string;\n status: string;\n pid?: number;\n uptime?: number;\n restartCount: number;\n lastExitCode?: number;\n }>;\n\n if (argv.json) {\n console.log(JSON.stringify(statuses, null, 2));\n return;\n }\n\n if (statuses.length === 0) {\n console.log('No services registered.');\n return;\n }\n\n const statusIcon = (s: string): string => {\n switch (s) {\n case 'running': return '●';\n case 'stopped': return '○';\n case 'starting': return '◌';\n case 'crashed': return '✗';\n default: return '?';\n }\n };\n\n for (const svc of statuses) {\n const icon = statusIcon(svc.status);\n const uptime = svc.uptime != null ? ` uptime=${formatUptime(svc.uptime)}` : '';\n const pid = svc.pid != null ? ` pid=${svc.pid}` : '';\n const restarts = svc.restartCount > 0 ? ` restarts=${svc.restartCount}` : '';\n console.log(`${icon} ${svc.name.padEnd(8)} ${svc.status}${pid}${uptime}${restarts}`);\n }\n } catch {\n console.error(`Cannot connect to xpod at ${baseUrl}. Is it running?`);\n process.exit(1);\n }\n },\n};\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h${m % 60}m`;\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { CliCommandError, handleCliError, writeJsonResult } from '../lib/output';\n\ninterface StatusArgs {\n port: number;\n host: string;\n json: boolean;\n env?: string;\n}\n\nexport const statusCommand: CommandModule<object, StatusArgs> = {\n command: 'status',\n describe: 'Show service status',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Env file path for runtime context',\n })\n .option('json', {\n type: 'boolean',\n description: 'Output as JSON',\n default: false,\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n throw new CliCommandError('server_status_failed', `Failed to get status: HTTP ${res.status}`, 1, {\n status: res.status,\n });\n }\n\n const statuses = (await res.json()) as Array<{\n name: string;\n status: string;\n pid?: number;\n uptime?: number;\n restartCount: number;\n lastExitCode?: number;\n }>;\n\n if (argv.json) {\n const running = statuses.some((svc) => svc.status === 'running');\n const ready = statuses.length > 0 && statuses.every((svc) => svc.status === 'running');\n writeJsonResult({\n schemaVersion: '1.0',\n running,\n ready,\n baseUrl: `${baseUrl}/`,\n port: argv.port,\n services: statuses,\n });\n return;\n }\n\n if (statuses.length === 0) {\n console.log('No services registered.');\n return;\n }\n\n const statusIcon = (s: string): string => {\n switch (s) {\n case 'running': return '●';\n case 'stopped': return '○';\n case 'starting': return '◌';\n case 'crashed': return '✗';\n default: return '?';\n }\n };\n\n for (const svc of statuses) {\n const icon = statusIcon(svc.status);\n const uptime = svc.uptime != null ? ` uptime=${formatUptime(svc.uptime)}` : '';\n const pid = svc.pid != null ? ` pid=${svc.pid}` : '';\n const restarts = svc.restartCount > 0 ? ` restarts=${svc.restartCount}` : '';\n console.log(`${icon} ${svc.name.padEnd(8)} ${svc.status}${pid}${uptime}${restarts}`);\n }\n } catch (error) {\n handleCliError(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);\n }\n },\n};\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h${m % 60}m`;\n}\n"]}
@@ -2,6 +2,9 @@ import type { CommandModule } from 'yargs';
2
2
  interface StopArgs {
3
3
  port: number;
4
4
  host: string;
5
+ env?: string;
6
+ timeout: number;
7
+ json: boolean;
5
8
  }
6
9
  export declare const stopCommand: CommandModule<object, StopArgs>;
7
10
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.stopCommand = void 0;
4
+ const output_1 = require("../lib/output");
4
5
  exports.stopCommand = {
5
6
  command: 'stop',
6
7
  describe: 'Stop xpod services',
@@ -15,28 +16,62 @@ exports.stopCommand = {
15
16
  type: 'string',
16
17
  description: 'Gateway host',
17
18
  default: 'localhost',
19
+ })
20
+ .option('env', {
21
+ alias: 'e',
22
+ type: 'string',
23
+ description: 'Env file path for runtime context',
24
+ })
25
+ .option('timeout', {
26
+ type: 'number',
27
+ default: 10000,
28
+ description: 'Graceful stop timeout in milliseconds',
29
+ })
30
+ .option('json', {
31
+ type: 'boolean',
32
+ default: false,
33
+ description: 'Output JSON envelope',
18
34
  }),
19
35
  handler: async (argv) => {
20
36
  const baseUrl = `http://${argv.host}:${argv.port}`;
21
- console.log(`Stopping xpod at ${baseUrl}...`);
37
+ if (!argv.json) {
38
+ console.log(`Stopping xpod at ${baseUrl}...`);
39
+ }
22
40
  try {
23
41
  const res = await fetch(`${baseUrl}/service/status`);
24
42
  if (!res.ok) {
25
- console.error('Service not reachable or already stopped.');
26
- process.exit(1);
43
+ throw new output_1.CliCommandError('server_not_reachable', 'Service not reachable or already stopped.', 1, {
44
+ status: res.status,
45
+ });
27
46
  }
28
47
  const statuses = (await res.json());
29
48
  const running = statuses.filter((s) => s.status === 'running');
30
49
  if (running.length === 0) {
50
+ if (argv.json) {
51
+ (0, output_1.writeJsonResult)({ running: false, stopped: false, services: statuses }, 'not_running');
52
+ return;
53
+ }
31
54
  console.log('No running services found.');
32
55
  return;
33
56
  }
34
57
  // Send SIGTERM to the gateway process via the internal stop endpoint
35
58
  const stopRes = await fetch(`${baseUrl}/service/stop`, { method: 'POST' });
36
59
  if (stopRes.ok) {
60
+ if (argv.json) {
61
+ (0, output_1.writeJsonResult)({ running: true, stopped: true, services: running });
62
+ return;
63
+ }
37
64
  console.log('Stop signal sent.');
38
65
  }
39
66
  else {
67
+ if (argv.json) {
68
+ (0, output_1.writeJson)((0, output_1.fail)('stop_signal_failed', 'Could not send stop signal via API.', [], {
69
+ running: true,
70
+ stopped: false,
71
+ services: running,
72
+ }));
73
+ return;
74
+ }
40
75
  // Fallback: print PIDs for manual kill
41
76
  console.log('Could not send stop signal via API. Running services:');
42
77
  for (const s of running) {
@@ -45,9 +80,8 @@ exports.stopCommand = {
45
80
  console.log('\nTo stop manually, kill the gateway process.');
46
81
  }
47
82
  }
48
- catch {
49
- console.error(`Cannot connect to xpod at ${baseUrl}. Is it running?`);
50
- process.exit(1);
83
+ catch (error) {
84
+ (0, output_1.handleCliError)(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);
51
85
  }
52
86
  },
53
87
  };
@@ -1 +1 @@
1
- {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":";;;AAOa,QAAA,WAAW,GAAoC;IAC1D,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,oBAAoB;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,IAAI;KACd,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,WAAW;KACrB,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0D,CAAC;YAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,qEAAqE;YACrE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3E,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;gBACrE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,IAAI,SAAS,GAAG,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,kBAAkB,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { CommandModule } from 'yargs';\n\ninterface StopArgs {\n port: number;\n host: string;\n}\n\nexport const stopCommand: CommandModule<object, StopArgs> = {\n command: 'stop',\n describe: 'Stop xpod services',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n console.log(`Stopping xpod at ${baseUrl}...`);\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n console.error('Service not reachable or already stopped.');\n process.exit(1);\n }\n\n const statuses = (await res.json()) as Array<{ name: string; status: string; pid?: number }>;\n const running = statuses.filter((s) => s.status === 'running');\n\n if (running.length === 0) {\n console.log('No running services found.');\n return;\n }\n\n // Send SIGTERM to the gateway process via the internal stop endpoint\n const stopRes = await fetch(`${baseUrl}/service/stop`, { method: 'POST' });\n if (stopRes.ok) {\n console.log('Stop signal sent.');\n } else {\n // Fallback: print PIDs for manual kill\n console.log('Could not send stop signal via API. Running services:');\n for (const s of running) {\n console.log(` ${s.name} (pid: ${s.pid ?? 'unknown'})`);\n }\n console.log('\\nTo stop manually, kill the gateway process.');\n }\n } catch {\n console.error(`Cannot connect to xpod at ${baseUrl}. Is it running?`);\n process.exit(1);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { CliCommandError, fail, handleCliError, writeJson, writeJsonResult } from '../lib/output';\n\ninterface StopArgs {\n port: number;\n host: string;\n env?: string;\n timeout: number;\n json: boolean;\n}\n\nexport const stopCommand: CommandModule<object, StopArgs> = {\n command: 'stop',\n describe: 'Stop xpod services',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Env file path for runtime context',\n })\n .option('timeout', {\n type: 'number',\n default: 10000,\n description: 'Graceful stop timeout in milliseconds',\n })\n .option('json', {\n type: 'boolean',\n default: false,\n description: 'Output JSON envelope',\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n if (!argv.json) {\n console.log(`Stopping xpod at ${baseUrl}...`);\n }\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n throw new CliCommandError('server_not_reachable', 'Service not reachable or already stopped.', 1, {\n status: res.status,\n });\n }\n\n const statuses = (await res.json()) as Array<{ name: string; status: string; pid?: number }>;\n const running = statuses.filter((s) => s.status === 'running');\n\n if (running.length === 0) {\n if (argv.json) {\n writeJsonResult({ running: false, stopped: false, services: statuses }, 'not_running');\n return;\n }\n console.log('No running services found.');\n return;\n }\n\n // Send SIGTERM to the gateway process via the internal stop endpoint\n const stopRes = await fetch(`${baseUrl}/service/stop`, { method: 'POST' });\n if (stopRes.ok) {\n if (argv.json) {\n writeJsonResult({ running: true, stopped: true, services: running });\n return;\n }\n console.log('Stop signal sent.');\n } else {\n if (argv.json) {\n writeJson(fail('stop_signal_failed', 'Could not send stop signal via API.', [], {\n running: true,\n stopped: false,\n services: running,\n }));\n return;\n }\n // Fallback: print PIDs for manual kill\n console.log('Could not send stop signal via API. Running services:');\n for (const s of running) {\n console.log(` ${s.name} (pid: ${s.pid ?? 'unknown'})`);\n }\n console.log('\\nTo stop manually, kill the gateway process.');\n }\n } catch (error) {\n handleCliError(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);\n }\n },\n};\n"]}
package/dist/cli/index.js CHANGED
@@ -32,8 +32,9 @@ const yargs_1 = __importDefault(require("yargs"));
32
32
  const helpers_1 = require("yargs/helpers");
33
33
  // Known subcommands
34
34
  const KNOWN_COMMANDS = [
35
- 'start', 'stop', 'status', 'logs',
36
- 'auth', 'login', 'config', 'import', 'pod',
35
+ 'get', 'put', 'patch', 'delete', 'head', 'list',
36
+ 'rdf', 'obj', 'secret', 'server', 'start', 'stop', 'status', 'logs',
37
+ 'auth', 'login', 'import', 'pod',
37
38
  'account', 'backup', 'restore', 'doctor',
38
39
  ];
39
40
  function createRootParser() {
@@ -45,14 +46,18 @@ function createRootParser() {
45
46
  .version();
46
47
  }
47
48
  async function createCommandParser() {
48
- const [{ startCommand }, { stopCommand }, { statusCommand }, { logsCommand }, { authCommand }, { loginCommandModule }, { configCommand }, { importCommand }, { podCommand }, { accountCommand }, { backupCommand, restoreCommand }, { doctorCommand },] = await Promise.all([
49
+ const [{ startCommand }, { stopCommand }, { statusCommand }, { logsCommand }, { serverCommand }, { getCommand, putCommand, patchCommand, deleteCommand, headCommand, listCommand }, { rdfCommand }, { objCommand }, { secretCommand }, { authCommand }, { loginCommandModule }, { importCommand }, { podCommand }, { accountCommand }, { backupCommand, restoreCommand }, { doctorCommand },] = await Promise.all([
49
50
  Promise.resolve().then(() => __importStar(require('./commands/start'))),
50
51
  Promise.resolve().then(() => __importStar(require('./commands/stop'))),
51
52
  Promise.resolve().then(() => __importStar(require('./commands/status'))),
52
53
  Promise.resolve().then(() => __importStar(require('./commands/logs'))),
54
+ Promise.resolve().then(() => __importStar(require('./commands/server'))),
55
+ Promise.resolve().then(() => __importStar(require('./commands/resource'))),
56
+ Promise.resolve().then(() => __importStar(require('./commands/rdf'))),
57
+ Promise.resolve().then(() => __importStar(require('./commands/obj'))),
58
+ Promise.resolve().then(() => __importStar(require('./commands/secret'))),
53
59
  Promise.resolve().then(() => __importStar(require('./commands/auth'))),
54
60
  Promise.resolve().then(() => __importStar(require('./commands/login'))),
55
- Promise.resolve().then(() => __importStar(require('./commands/config'))),
56
61
  Promise.resolve().then(() => __importStar(require('./commands/import'))),
57
62
  Promise.resolve().then(() => __importStar(require('./commands/pod'))),
58
63
  Promise.resolve().then(() => __importStar(require('./commands/account'))),
@@ -64,9 +69,18 @@ async function createCommandParser() {
64
69
  .command(stopCommand)
65
70
  .command(statusCommand)
66
71
  .command(logsCommand)
72
+ .command(serverCommand)
73
+ .command(getCommand)
74
+ .command(putCommand)
75
+ .command(patchCommand)
76
+ .command(deleteCommand)
77
+ .command(headCommand)
78
+ .command(listCommand)
79
+ .command(rdfCommand)
80
+ .command(objCommand)
81
+ .command(secretCommand)
67
82
  .command(authCommand)
68
83
  .command(loginCommandModule)
69
- .command(configCommand)
70
84
  .command(importCommand)
71
85
  .command(podCommand)
72
86
  .command(accountCommand)
@@ -79,10 +93,11 @@ async function createCommandParser() {
79
93
  }
80
94
  async function main() {
81
95
  const argv = process.argv.slice(2);
82
- const wantsRootHelp = argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';
83
- const wantsVersion = argv.includes('--version') || argv.includes('-v');
96
+ const wantsRootHelp = argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h';
97
+ const wantsVersion = argv[0] === '--version' || argv[0] === '-v';
84
98
  if (wantsRootHelp || wantsVersion) {
85
- createRootParser().parse();
99
+ const parser = wantsRootHelp ? await createCommandParser() : createRootParser();
100
+ parser.parse(wantsVersion ? ['--version'] : ['--help']);
86
101
  return;
87
102
  }
88
103
  (await createCommandParser())
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport '../runtime/configure-drizzle-solid';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\n// Known subcommands\nconst KNOWN_COMMANDS = [\n 'start', 'stop', 'status', 'logs',\n 'auth', 'login', 'config', 'import', 'pod',\n 'account', 'backup', 'restore', 'doctor',\n];\n\nfunction createRootParser() {\n return yargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .epilog(`Commands: ${KNOWN_COMMANDS.join(', ')}`)\n .help()\n .version();\n}\n\nasync function createCommandParser() {\n const [\n { startCommand },\n { stopCommand },\n { statusCommand },\n { logsCommand },\n { authCommand },\n { loginCommandModule },\n { configCommand },\n { importCommand },\n { podCommand },\n { accountCommand },\n { backupCommand, restoreCommand },\n { doctorCommand },\n ] = await Promise.all([\n import('./commands/start'),\n import('./commands/stop'),\n import('./commands/status'),\n import('./commands/logs'),\n import('./commands/auth'),\n import('./commands/login'),\n import('./commands/config'),\n import('./commands/import'),\n import('./commands/pod'),\n import('./commands/account'),\n import('./commands/backup'),\n import('./commands/doctor'),\n ]);\n\n return createRootParser()\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(loginCommandModule)\n .command(configCommand)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .strict()\n .help()\n .version();\n}\n\nasync function main() {\n const argv = process.argv.slice(2);\n const wantsRootHelp = argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';\n const wantsVersion = argv.includes('--version') || argv.includes('-v');\n\n if (wantsRootHelp || wantsVersion) {\n createRootParser().parse();\n return;\n }\n\n (await createCommandParser())\n .demandCommand(1, 'Please specify an operations command')\n .parse();\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport '../runtime/configure-drizzle-solid';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\n// Known subcommands\nconst KNOWN_COMMANDS = [\n 'get', 'put', 'patch', 'delete', 'head', 'list',\n 'rdf', 'obj', 'secret', 'server', 'start', 'stop', 'status', 'logs',\n 'auth', 'login', 'import', 'pod',\n 'account', 'backup', 'restore', 'doctor',\n];\n\nfunction createRootParser() {\n return yargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .epilog(`Commands: ${KNOWN_COMMANDS.join(', ')}`)\n .help()\n .version();\n}\n\nasync function createCommandParser() {\n const [\n { startCommand },\n { stopCommand },\n { statusCommand },\n { logsCommand },\n { serverCommand },\n { getCommand, putCommand, patchCommand, deleteCommand, headCommand, listCommand },\n { rdfCommand },\n { objCommand },\n { secretCommand },\n { authCommand },\n { loginCommandModule },\n { importCommand },\n { podCommand },\n { accountCommand },\n { backupCommand, restoreCommand },\n { doctorCommand },\n ] = await Promise.all([\n import('./commands/start'),\n import('./commands/stop'),\n import('./commands/status'),\n import('./commands/logs'),\n import('./commands/server'),\n import('./commands/resource'),\n import('./commands/rdf'),\n import('./commands/obj'),\n import('./commands/secret'),\n import('./commands/auth'),\n import('./commands/login'),\n import('./commands/import'),\n import('./commands/pod'),\n import('./commands/account'),\n import('./commands/backup'),\n import('./commands/doctor'),\n ]);\n\n return createRootParser()\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(serverCommand)\n .command(getCommand)\n .command(putCommand)\n .command(patchCommand)\n .command(deleteCommand)\n .command(headCommand)\n .command(listCommand)\n .command(rdfCommand)\n .command(objCommand)\n .command(secretCommand)\n .command(authCommand)\n .command(loginCommandModule)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .strict()\n .help()\n .version();\n}\n\nasync function main() {\n const argv = process.argv.slice(2);\n const wantsRootHelp = argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h';\n const wantsVersion = argv[0] === '--version' || argv[0] === '-v';\n\n if (wantsRootHelp || wantsVersion) {\n const parser = wantsRootHelp ? await createCommandParser() : createRootParser();\n parser.parse(wantsVersion ? [ '--version' ] : [ '--help' ]);\n return;\n }\n\n (await createCommandParser())\n .demandCommand(1, 'Please specify an operations command')\n .parse();\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
@@ -0,0 +1,24 @@
1
+ import { type StoredCredentials } from './credentials-store';
2
+ export interface CliAuthContext {
3
+ baseUrl: string;
4
+ webId: string;
5
+ podRoot: string;
6
+ baseIri: string;
7
+ accessToken: string;
8
+ credentials: StoredCredentials;
9
+ }
10
+ export interface AuthStatus {
11
+ authenticated: boolean;
12
+ authType?: string;
13
+ baseUrl?: string;
14
+ webId?: string;
15
+ podRoot?: string;
16
+ }
17
+ export declare function normalizeBaseUrl(url: string): string;
18
+ export declare function resolvePodRootFromWebId(webId: string): string;
19
+ export declare function getStoredAuthStatus(urlOverride?: string): AuthStatus;
20
+ export declare function requireAuthContext(options?: {
21
+ url?: string;
22
+ json?: boolean;
23
+ }): Promise<CliAuthContext>;
24
+ export declare function authFetch(context: CliAuthContext, url: string, init?: RequestInit): Promise<Response>;