@proletariat/cli 0.3.110 → 0.3.112
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.
- package/dist/commands/gateway/connect.d.ts +33 -0
- package/dist/commands/gateway/connect.js +130 -0
- package/dist/commands/gateway/connect.js.map +1 -0
- package/dist/commands/gateway/disconnect.d.ts +21 -0
- package/dist/commands/gateway/disconnect.js +69 -0
- package/dist/commands/gateway/disconnect.js.map +1 -0
- package/dist/commands/gateway/start.d.ts +23 -0
- package/dist/commands/gateway/start.js +133 -0
- package/dist/commands/gateway/start.js.map +1 -0
- package/dist/commands/gateway/status.d.ts +16 -0
- package/dist/commands/gateway/status.js +76 -0
- package/dist/commands/gateway/status.js.map +1 -0
- package/dist/commands/gateway/test.d.ts +22 -0
- package/dist/commands/gateway/test.js +83 -0
- package/dist/commands/gateway/test.js.map +1 -0
- package/dist/commands/orchestrator/attach.d.ts +2 -0
- package/dist/commands/orchestrator/attach.js +80 -118
- package/dist/commands/orchestrator/attach.js.map +1 -1
- package/dist/commands/orchestrator/start.js +21 -0
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/orchestrator/status.d.ts +3 -0
- package/dist/commands/orchestrator/status.js +104 -130
- package/dist/commands/orchestrator/status.js.map +1 -1
- package/dist/commands/orchestrator/stop.d.ts +2 -0
- package/dist/commands/orchestrator/stop.js +105 -107
- package/dist/commands/orchestrator/stop.js.map +1 -1
- package/dist/commands/reconcile.d.ts +29 -0
- package/dist/commands/reconcile.js +140 -0
- package/dist/commands/reconcile.js.map +1 -0
- package/dist/commands/session/attach.d.ts +2 -6
- package/dist/commands/session/attach.js +68 -97
- package/dist/commands/session/attach.js.map +1 -1
- package/dist/commands/session/list.d.ts +4 -1
- package/dist/commands/session/list.js +160 -326
- package/dist/commands/session/list.js.map +1 -1
- package/dist/commands/work/ship.js +131 -61
- package/dist/commands/work/ship.js.map +1 -1
- package/dist/commands/work/start.js +104 -49
- package/dist/commands/work/start.js.map +1 -1
- package/dist/lib/execution/session-utils.d.ts +4 -1
- package/dist/lib/execution/session-utils.js +3 -0
- package/dist/lib/execution/session-utils.js.map +1 -1
- package/dist/lib/gateway/channel-factory.d.ts +13 -0
- package/dist/lib/gateway/channel-factory.js +37 -0
- package/dist/lib/gateway/channel-factory.js.map +1 -0
- package/dist/lib/gateway/channels/telegram.d.ts +115 -0
- package/dist/lib/gateway/channels/telegram.js +215 -0
- package/dist/lib/gateway/channels/telegram.js.map +1 -0
- package/dist/lib/gateway/router.d.ts +84 -0
- package/dist/lib/gateway/router.js +140 -0
- package/dist/lib/gateway/router.js.map +1 -0
- package/dist/lib/gateway/session-poker.d.ts +35 -0
- package/dist/lib/gateway/session-poker.js +85 -0
- package/dist/lib/gateway/session-poker.js.map +1 -0
- package/dist/lib/gateway/types.d.ts +124 -0
- package/dist/lib/gateway/types.js +17 -0
- package/dist/lib/gateway/types.js.map +1 -0
- package/dist/lib/machine-db-mirror.d.ts +64 -0
- package/dist/lib/machine-db-mirror.js +82 -0
- package/dist/lib/machine-db-mirror.js.map +1 -0
- package/dist/lib/machine-db.d.ts +98 -0
- package/dist/lib/machine-db.js +152 -0
- package/dist/lib/machine-db.js.map +1 -1
- package/dist/lib/orchestrate/prompt-chain.d.ts +19 -4
- package/dist/lib/orchestrate/prompt-chain.js +19 -4
- package/dist/lib/orchestrate/prompt-chain.js.map +1 -1
- package/dist/lib/pr/index.d.ts +34 -2
- package/dist/lib/pr/index.js +95 -4
- package/dist/lib/pr/index.js.map +1 -1
- package/dist/lib/reconcile/core.d.ts +62 -0
- package/dist/lib/reconcile/core.js +137 -0
- package/dist/lib/reconcile/core.js.map +1 -0
- package/dist/lib/reconcile/index.d.ts +54 -0
- package/dist/lib/reconcile/index.js +377 -0
- package/dist/lib/reconcile/index.js.map +1 -0
- package/dist/lib/reconcile/types.d.ts +133 -0
- package/dist/lib/reconcile/types.js +16 -0
- package/dist/lib/reconcile/types.js.map +1 -0
- package/dist/lib/session/renderer.d.ts +121 -0
- package/dist/lib/session/renderer.js +547 -0
- package/dist/lib/session/renderer.js.map +1 -0
- package/dist/lib/update-check.d.ts +64 -7
- package/dist/lib/update-check.js +164 -20
- package/dist/lib/update-check.js.map +1 -1
- package/oclif.manifest.json +1203 -750
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway connect — Register a messaging channel (PRLT-1255)
|
|
3
|
+
*
|
|
4
|
+
* MVP: only the telegram channel type is implemented. The command stores
|
|
5
|
+
* the bot token + allowlist in machine.db so `prlt gateway start` can
|
|
6
|
+
* bring the adapter up later.
|
|
7
|
+
*
|
|
8
|
+
* Examples:
|
|
9
|
+
* prlt gateway connect telegram --token 123:abc --allow 111 --allow 222
|
|
10
|
+
* prlt gateway connect telegram --token 123:abc --allow 111,222
|
|
11
|
+
*/
|
|
12
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
13
|
+
export default class GatewayConnect extends PromptCommand {
|
|
14
|
+
static description: string;
|
|
15
|
+
static examples: string[];
|
|
16
|
+
static args: {
|
|
17
|
+
type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
18
|
+
};
|
|
19
|
+
static flags: {
|
|
20
|
+
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
21
|
+
token: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
22
|
+
allow: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
23
|
+
'poll-interval-ms': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
24
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
26
|
+
};
|
|
27
|
+
run(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Accept `--allow 111 --allow 222` and `--allow 111,222` equally. Blank
|
|
31
|
+
* entries are stripped so users can't accidentally register an empty id.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseAllowlist(raw: string[] | undefined): string[];
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway connect — Register a messaging channel (PRLT-1255)
|
|
3
|
+
*
|
|
4
|
+
* MVP: only the telegram channel type is implemented. The command stores
|
|
5
|
+
* the bot token + allowlist in machine.db so `prlt gateway start` can
|
|
6
|
+
* bring the adapter up later.
|
|
7
|
+
*
|
|
8
|
+
* Examples:
|
|
9
|
+
* prlt gateway connect telegram --token 123:abc --allow 111 --allow 222
|
|
10
|
+
* prlt gateway connect telegram --token 123:abc --allow 111,222
|
|
11
|
+
*/
|
|
12
|
+
import { Args, Flags } from '@oclif/core';
|
|
13
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
14
|
+
import { machineOutputFlags } from '../../lib/pmo/index.js';
|
|
15
|
+
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
16
|
+
import { styles } from '../../lib/styles.js';
|
|
17
|
+
import { MachineDB } from '../../lib/machine-db.js';
|
|
18
|
+
const SUPPORTED_CHANNEL_TYPES = ['telegram'];
|
|
19
|
+
export default class GatewayConnect extends PromptCommand {
|
|
20
|
+
static description = 'Register a messaging channel (Telegram) with the gateway';
|
|
21
|
+
static examples = [
|
|
22
|
+
'<%= config.bin %> gateway connect telegram --token 123:abc --allow 111 --allow 222',
|
|
23
|
+
'<%= config.bin %> gateway connect telegram --token 123:abc --allow 111,222 --name my-bot',
|
|
24
|
+
];
|
|
25
|
+
static args = {
|
|
26
|
+
type: Args.string({
|
|
27
|
+
description: 'Channel type',
|
|
28
|
+
required: true,
|
|
29
|
+
options: [...SUPPORTED_CHANNEL_TYPES],
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
static flags = {
|
|
33
|
+
...machineOutputFlags,
|
|
34
|
+
name: Flags.string({
|
|
35
|
+
description: 'Channel name (primary key). Defaults to the channel type.',
|
|
36
|
+
}),
|
|
37
|
+
token: Flags.string({
|
|
38
|
+
description: 'Telegram bot token from @BotFather',
|
|
39
|
+
}),
|
|
40
|
+
allow: Flags.string({
|
|
41
|
+
description: 'Telegram user id(s) allowed to message agents (repeatable, or comma-separated)',
|
|
42
|
+
multiple: true,
|
|
43
|
+
}),
|
|
44
|
+
'poll-interval-ms': Flags.integer({
|
|
45
|
+
description: 'Delay between getUpdates polls (0 uses Telegram long-poll)',
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
async run() {
|
|
49
|
+
const { args, flags } = await this.parse(GatewayConnect);
|
|
50
|
+
const jsonMode = shouldOutputJson(flags);
|
|
51
|
+
const channelType = args.type;
|
|
52
|
+
const channelName = flags.name || channelType;
|
|
53
|
+
if (channelType === 'telegram') {
|
|
54
|
+
if (!flags.token) {
|
|
55
|
+
if (jsonMode) {
|
|
56
|
+
outputErrorAsJson('MISSING_TOKEN', 'Telegram requires --token', createMetadata('gateway connect', flags));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.log(styles.error('Telegram requires --token'));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const allowlist = parseAllowlist(flags.allow);
|
|
63
|
+
if (allowlist.length === 0) {
|
|
64
|
+
if (jsonMode) {
|
|
65
|
+
outputErrorAsJson('MISSING_ALLOWLIST', 'Telegram requires --allow <user-id> (at least one)', createMetadata('gateway connect', flags));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.log(styles.error('Telegram requires --allow <user-id> (at least one)'));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const config = {
|
|
72
|
+
token: flags.token,
|
|
73
|
+
allowlist,
|
|
74
|
+
...(flags['poll-interval-ms'] !== undefined ? { pollIntervalMs: flags['poll-interval-ms'] } : {}),
|
|
75
|
+
};
|
|
76
|
+
const db = new MachineDB();
|
|
77
|
+
try {
|
|
78
|
+
db.upsertMessagingChannel({
|
|
79
|
+
name: channelName,
|
|
80
|
+
type: 'telegram',
|
|
81
|
+
configJson: JSON.stringify(config),
|
|
82
|
+
active: true,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
db.close();
|
|
87
|
+
}
|
|
88
|
+
if (jsonMode) {
|
|
89
|
+
outputSuccessAsJson({
|
|
90
|
+
channel: {
|
|
91
|
+
name: channelName,
|
|
92
|
+
type: 'telegram',
|
|
93
|
+
allowlist,
|
|
94
|
+
active: true,
|
|
95
|
+
},
|
|
96
|
+
}, createMetadata('gateway connect', flags));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.log(styles.success(`Connected telegram channel "${channelName}"`));
|
|
100
|
+
this.log(styles.muted(` Allowlist: ${allowlist.join(', ')}`));
|
|
101
|
+
this.log(styles.muted(` Start the gateway with: prlt gateway start`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Unreachable under current oclif `options` constraint, but we keep
|
|
105
|
+
// it so future channel types slot in cleanly.
|
|
106
|
+
if (jsonMode) {
|
|
107
|
+
outputErrorAsJson('UNSUPPORTED_CHANNEL', `Channel type "${channelType}" is not implemented yet`, createMetadata('gateway connect', flags));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.log(styles.error(`Channel type "${channelType}" is not implemented yet`));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Accept `--allow 111 --allow 222` and `--allow 111,222` equally. Blank
|
|
115
|
+
* entries are stripped so users can't accidentally register an empty id.
|
|
116
|
+
*/
|
|
117
|
+
export function parseAllowlist(raw) {
|
|
118
|
+
if (!raw)
|
|
119
|
+
return [];
|
|
120
|
+
const out = [];
|
|
121
|
+
for (const entry of raw) {
|
|
122
|
+
for (const piece of entry.split(',')) {
|
|
123
|
+
const trimmed = piece.trim();
|
|
124
|
+
if (trimmed)
|
|
125
|
+
out.push(trimmed);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/gateway/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway disconnect — Remove or deactivate a messaging channel.
|
|
3
|
+
*
|
|
4
|
+
* By default, this deletes the channel registration outright. Pass
|
|
5
|
+
* --deactivate to keep the row around (and its stored credentials) but
|
|
6
|
+
* mark it inactive so `prlt gateway start` skips it.
|
|
7
|
+
*/
|
|
8
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
9
|
+
export default class GatewayDisconnect extends PromptCommand {
|
|
10
|
+
static description: string;
|
|
11
|
+
static examples: string[];
|
|
12
|
+
static args: {
|
|
13
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
14
|
+
};
|
|
15
|
+
static flags: {
|
|
16
|
+
deactivate: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
};
|
|
20
|
+
run(): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway disconnect — Remove or deactivate a messaging channel.
|
|
3
|
+
*
|
|
4
|
+
* By default, this deletes the channel registration outright. Pass
|
|
5
|
+
* --deactivate to keep the row around (and its stored credentials) but
|
|
6
|
+
* mark it inactive so `prlt gateway start` skips it.
|
|
7
|
+
*/
|
|
8
|
+
import { Args, Flags } from '@oclif/core';
|
|
9
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
10
|
+
import { machineOutputFlags } from '../../lib/pmo/index.js';
|
|
11
|
+
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
12
|
+
import { styles } from '../../lib/styles.js';
|
|
13
|
+
import { MachineDB } from '../../lib/machine-db.js';
|
|
14
|
+
export default class GatewayDisconnect extends PromptCommand {
|
|
15
|
+
static description = 'Disconnect a registered messaging channel';
|
|
16
|
+
static examples = [
|
|
17
|
+
'<%= config.bin %> gateway disconnect telegram',
|
|
18
|
+
'<%= config.bin %> gateway disconnect telegram --deactivate',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
name: Args.string({
|
|
22
|
+
description: 'Channel name (as registered with `gateway connect`)',
|
|
23
|
+
required: true,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static flags = {
|
|
27
|
+
...machineOutputFlags,
|
|
28
|
+
deactivate: Flags.boolean({
|
|
29
|
+
description: 'Mark the channel inactive instead of deleting it',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
const { args, flags } = await this.parse(GatewayDisconnect);
|
|
35
|
+
const jsonMode = shouldOutputJson(flags);
|
|
36
|
+
const db = new MachineDB();
|
|
37
|
+
try {
|
|
38
|
+
const existing = db.getMessagingChannel(args.name);
|
|
39
|
+
if (!existing) {
|
|
40
|
+
if (jsonMode) {
|
|
41
|
+
outputErrorAsJson('CHANNEL_NOT_FOUND', `No channel registered with name "${args.name}"`, createMetadata('gateway disconnect', flags));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.log(styles.error(`No channel registered with name "${args.name}"`));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (flags.deactivate) {
|
|
48
|
+
db.setMessagingChannelActive(args.name, false);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
db.deleteMessagingChannel(args.name);
|
|
52
|
+
}
|
|
53
|
+
if (jsonMode) {
|
|
54
|
+
outputSuccessAsJson({
|
|
55
|
+
channel: args.name,
|
|
56
|
+
action: flags.deactivate ? 'deactivated' : 'deleted',
|
|
57
|
+
}, createMetadata('gateway disconnect', flags));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.log(styles.success(flags.deactivate
|
|
61
|
+
? `Deactivated channel "${args.name}"`
|
|
62
|
+
: `Removed channel "${args.name}"`));
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
db.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=disconnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../src/commands/gateway/disconnect.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,aAAa;IAC1D,MAAM,CAAC,WAAW,GAAG,2CAA2C,CAAA;IAEhE,MAAM,CAAC,QAAQ,GAAG;QAChB,+CAA+C;QAC/C,4DAA4D;KAC7D,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,kBAAkB;QACrB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;YACxB,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAC3D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAExC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,QAAQ,EAAE,CAAC;oBACb,iBAAiB,CACf,mBAAmB,EACnB,oCAAoC,IAAI,CAAC,IAAI,GAAG,EAChD,cAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAC5C,CAAA;oBACD,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;gBACxE,OAAM;YACR,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAChD,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtC,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,mBAAmB,CACjB;oBACE,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;iBACrD,EACD,cAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAC5C,CAAA;gBACD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,UAAU;gBACd,CAAC,CAAC,wBAAwB,IAAI,CAAC,IAAI,GAAG;gBACtC,CAAC,CAAC,oBAAoB,IAAI,CAAC,IAAI,GAAG,CACrC,CACF,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAA;QACZ,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway start — Start the messaging gateway daemon.
|
|
3
|
+
*
|
|
4
|
+
* Loads every active channel from machine.db, wires it up to the
|
|
5
|
+
* MessagingGateway router, and blocks until SIGINT/SIGTERM. Each inbound
|
|
6
|
+
* message is forwarded to its bound agent via `prlt session poke`.
|
|
7
|
+
*
|
|
8
|
+
* MVP note: this runs in the foreground. `--background` is documented on
|
|
9
|
+
* the ticket but intentionally deferred — it will land alongside the
|
|
10
|
+
* generic daemon lifecycle work in a follow-up ticket.
|
|
11
|
+
*/
|
|
12
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
13
|
+
export default class GatewayStart extends PromptCommand {
|
|
14
|
+
static description: string;
|
|
15
|
+
static examples: string[];
|
|
16
|
+
static flags: {
|
|
17
|
+
'default-agent': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
'wait-timeout': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
21
|
+
};
|
|
22
|
+
run(): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway start — Start the messaging gateway daemon.
|
|
3
|
+
*
|
|
4
|
+
* Loads every active channel from machine.db, wires it up to the
|
|
5
|
+
* MessagingGateway router, and blocks until SIGINT/SIGTERM. Each inbound
|
|
6
|
+
* message is forwarded to its bound agent via `prlt session poke`.
|
|
7
|
+
*
|
|
8
|
+
* MVP note: this runs in the foreground. `--background` is documented on
|
|
9
|
+
* the ticket but intentionally deferred — it will land alongside the
|
|
10
|
+
* generic daemon lifecycle work in a follow-up ticket.
|
|
11
|
+
*/
|
|
12
|
+
import { Flags } from '@oclif/core';
|
|
13
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
14
|
+
import { machineOutputFlags } from '../../lib/pmo/index.js';
|
|
15
|
+
import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
16
|
+
import { styles } from '../../lib/styles.js';
|
|
17
|
+
import { MachineDB } from '../../lib/machine-db.js';
|
|
18
|
+
import { MessagingGateway } from '../../lib/gateway/router.js';
|
|
19
|
+
import { ShellSessionPoker } from '../../lib/gateway/session-poker.js';
|
|
20
|
+
import { buildChannelFromRecord } from '../../lib/gateway/channel-factory.js';
|
|
21
|
+
export default class GatewayStart extends PromptCommand {
|
|
22
|
+
static description = 'Start the messaging gateway daemon (foreground)';
|
|
23
|
+
static examples = [
|
|
24
|
+
'<%= config.bin %> gateway start',
|
|
25
|
+
'<%= config.bin %> gateway start --default-agent altman',
|
|
26
|
+
];
|
|
27
|
+
static flags = {
|
|
28
|
+
...machineOutputFlags,
|
|
29
|
+
'default-agent': Flags.string({
|
|
30
|
+
description: 'Agent session id to bind newly-seen users to (required unless a static resolver is configured)',
|
|
31
|
+
}),
|
|
32
|
+
'wait-timeout': Flags.integer({
|
|
33
|
+
description: 'Max seconds to wait for an agent response before giving up',
|
|
34
|
+
default: 90,
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
async run() {
|
|
38
|
+
const { flags } = await this.parse(GatewayStart);
|
|
39
|
+
const jsonMode = shouldOutputJson(flags);
|
|
40
|
+
const db = new MachineDB();
|
|
41
|
+
// Load active channels at startup. A future revision can hot-reload
|
|
42
|
+
// this by watching the table for changes, but the MVP only reads at
|
|
43
|
+
// start time.
|
|
44
|
+
const records = db.listMessagingChannels({ onlyActive: true });
|
|
45
|
+
if (records.length === 0) {
|
|
46
|
+
db.close();
|
|
47
|
+
if (jsonMode) {
|
|
48
|
+
outputErrorAsJson('NO_CHANNELS', 'No active messaging channels registered. Connect one first with `prlt gateway connect`.', createMetadata('gateway start', flags));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.log(styles.error('No active messaging channels registered.'));
|
|
52
|
+
this.log(styles.muted('Connect one with: prlt gateway connect telegram --token ... --allow ...'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const gateway = new MessagingGateway({
|
|
56
|
+
db,
|
|
57
|
+
sessionPoker: new ShellSessionPoker(),
|
|
58
|
+
waitTimeoutSec: flags['wait-timeout'],
|
|
59
|
+
resolveAgentForNewUser: (_msg) => flags['default-agent'] ?? null,
|
|
60
|
+
logger: {
|
|
61
|
+
info: msg => this.log(styles.muted(msg)),
|
|
62
|
+
error: (msg, err) => {
|
|
63
|
+
const errMsg = err instanceof Error ? err.message : err !== undefined ? String(err) : '';
|
|
64
|
+
this.log(styles.error(errMsg ? `${msg}: ${errMsg}` : msg));
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
for (const record of records) {
|
|
69
|
+
try {
|
|
70
|
+
const channel = buildChannelFromRecord(record);
|
|
71
|
+
gateway.registerChannel(channel);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
75
|
+
this.log(styles.error(`Failed to build channel "${record.name}": ${errMsg}`));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (gateway.listChannelNames().length === 0) {
|
|
79
|
+
db.close();
|
|
80
|
+
if (jsonMode) {
|
|
81
|
+
outputErrorAsJson('NO_VALID_CHANNELS', 'No valid messaging channels could be built from storage.', createMetadata('gateway start', flags));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.log(styles.error('No valid messaging channels could be built from storage.'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
await gateway.start();
|
|
88
|
+
if (jsonMode) {
|
|
89
|
+
outputSuccessAsJson({
|
|
90
|
+
started: true,
|
|
91
|
+
channels: gateway.listChannelNames(),
|
|
92
|
+
defaultAgent: flags['default-agent'] ?? null,
|
|
93
|
+
}, createMetadata('gateway start', flags));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.log(styles.success('Messaging gateway started'));
|
|
97
|
+
this.log(styles.muted(` channels: ${gateway.listChannelNames().join(', ')}`));
|
|
98
|
+
if (flags['default-agent']) {
|
|
99
|
+
this.log(styles.muted(` default agent: ${flags['default-agent']}`));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.log(styles.warning(' no --default-agent: new users will be rejected'));
|
|
103
|
+
}
|
|
104
|
+
this.log(styles.muted(' press Ctrl-C to stop'));
|
|
105
|
+
}
|
|
106
|
+
// Block until we're asked to shut down. We install handlers for both
|
|
107
|
+
// SIGINT and SIGTERM so `docker stop` and Ctrl-C both unwind cleanly.
|
|
108
|
+
await waitForShutdownSignal();
|
|
109
|
+
this.log(styles.muted('Shutting down gateway...'));
|
|
110
|
+
try {
|
|
111
|
+
await gateway.stop();
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
db.close();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolve when we receive SIGINT or SIGTERM. Exported-less so tests don't
|
|
120
|
+
* have to shim it — the test suite exercises `MessagingGateway` directly.
|
|
121
|
+
*/
|
|
122
|
+
function waitForShutdownSignal() {
|
|
123
|
+
return new Promise(resolve => {
|
|
124
|
+
const onSignal = () => {
|
|
125
|
+
process.off('SIGINT', onSignal);
|
|
126
|
+
process.off('SIGTERM', onSignal);
|
|
127
|
+
resolve();
|
|
128
|
+
};
|
|
129
|
+
process.on('SIGINT', onSignal);
|
|
130
|
+
process.on('SIGTERM', onSignal);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/gateway/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway status — Show registered messaging channels and routes.
|
|
3
|
+
*
|
|
4
|
+
* Reports one line per channel with its type, active flag, last
|
|
5
|
+
* activity timestamp, and the number of user→agent routes it owns.
|
|
6
|
+
*/
|
|
7
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
8
|
+
export default class GatewayStatus extends PromptCommand {
|
|
9
|
+
static description: string;
|
|
10
|
+
static examples: string[];
|
|
11
|
+
static flags: {
|
|
12
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway status — Show registered messaging channels and routes.
|
|
3
|
+
*
|
|
4
|
+
* Reports one line per channel with its type, active flag, last
|
|
5
|
+
* activity timestamp, and the number of user→agent routes it owns.
|
|
6
|
+
*/
|
|
7
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
8
|
+
import { machineOutputFlags } from '../../lib/pmo/index.js';
|
|
9
|
+
import { shouldOutputJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
10
|
+
import { styles } from '../../lib/styles.js';
|
|
11
|
+
import { MachineDB } from '../../lib/machine-db.js';
|
|
12
|
+
export default class GatewayStatus extends PromptCommand {
|
|
13
|
+
static description = 'Show registered messaging channels and their activity';
|
|
14
|
+
static examples = ['<%= config.bin %> gateway status'];
|
|
15
|
+
static flags = {
|
|
16
|
+
...machineOutputFlags,
|
|
17
|
+
};
|
|
18
|
+
async run() {
|
|
19
|
+
const { flags } = await this.parse(GatewayStatus);
|
|
20
|
+
const jsonMode = shouldOutputJson(flags);
|
|
21
|
+
const db = new MachineDB();
|
|
22
|
+
let statuses = [];
|
|
23
|
+
try {
|
|
24
|
+
const channels = db.listMessagingChannels({ onlyActive: false });
|
|
25
|
+
statuses = channels.map(ch => buildStatus(db, ch));
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
db.close();
|
|
29
|
+
}
|
|
30
|
+
if (jsonMode) {
|
|
31
|
+
outputSuccessAsJson({ channels: statuses }, createMetadata('gateway status', flags));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (statuses.length === 0) {
|
|
35
|
+
this.log(styles.muted('No messaging channels registered.'));
|
|
36
|
+
this.log(styles.muted('Connect one with: prlt gateway connect telegram --token ... --allow ...'));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.log(styles.header('Messaging Gateway Channels'));
|
|
40
|
+
this.log('');
|
|
41
|
+
for (const s of statuses) {
|
|
42
|
+
const active = s.active ? styles.success('active') : styles.muted('inactive');
|
|
43
|
+
const last = s.lastMessageAt ? formatRelative(new Date(s.lastMessageAt)) : 'never';
|
|
44
|
+
this.log(` ${styles.emphasis(s.name)} [${s.type}] — ${active}`);
|
|
45
|
+
this.log(` last activity: ${last}`);
|
|
46
|
+
this.log(` routes: ${s.routeCount}`);
|
|
47
|
+
this.log('');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function buildStatus(db, ch) {
|
|
52
|
+
return {
|
|
53
|
+
name: ch.name,
|
|
54
|
+
type: ch.type,
|
|
55
|
+
active: ch.active,
|
|
56
|
+
lastMessageAt: ch.lastMessageAt ? ch.lastMessageAt.toISOString() : null,
|
|
57
|
+
routeCount: db.countMessagingRoutesForChannel(ch.name),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function formatRelative(d) {
|
|
61
|
+
const deltaMs = Date.now() - d.getTime();
|
|
62
|
+
if (deltaMs < 0)
|
|
63
|
+
return d.toISOString();
|
|
64
|
+
const seconds = Math.floor(deltaMs / 1000);
|
|
65
|
+
if (seconds < 60)
|
|
66
|
+
return `${seconds}s ago`;
|
|
67
|
+
const minutes = Math.floor(seconds / 60);
|
|
68
|
+
if (minutes < 60)
|
|
69
|
+
return `${minutes}m ago`;
|
|
70
|
+
const hours = Math.floor(minutes / 60);
|
|
71
|
+
if (hours < 48)
|
|
72
|
+
return `${hours}h ago`;
|
|
73
|
+
const days = Math.floor(hours / 24);
|
|
74
|
+
return `${days}d ago`;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/gateway/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway test — Send a test message through a registered channel.
|
|
3
|
+
*
|
|
4
|
+
* Loads a channel's config from machine.db, instantiates the adapter,
|
|
5
|
+
* and calls `sendMessage` directly. This doesn't start the polling loop,
|
|
6
|
+
* so it's safe to run alongside a live `gateway start`.
|
|
7
|
+
*/
|
|
8
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
9
|
+
export default class GatewayTest extends PromptCommand {
|
|
10
|
+
static description: string;
|
|
11
|
+
static examples: string[];
|
|
12
|
+
static args: {
|
|
13
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
14
|
+
};
|
|
15
|
+
static flags: {
|
|
16
|
+
to: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
message: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
};
|
|
21
|
+
run(): Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt gateway test — Send a test message through a registered channel.
|
|
3
|
+
*
|
|
4
|
+
* Loads a channel's config from machine.db, instantiates the adapter,
|
|
5
|
+
* and calls `sendMessage` directly. This doesn't start the polling loop,
|
|
6
|
+
* so it's safe to run alongside a live `gateway start`.
|
|
7
|
+
*/
|
|
8
|
+
import { Args, Flags } from '@oclif/core';
|
|
9
|
+
import { PromptCommand } from '../../lib/prompt-command.js';
|
|
10
|
+
import { machineOutputFlags } from '../../lib/pmo/index.js';
|
|
11
|
+
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
12
|
+
import { styles } from '../../lib/styles.js';
|
|
13
|
+
import { MachineDB } from '../../lib/machine-db.js';
|
|
14
|
+
import { buildChannelFromRecord } from '../../lib/gateway/channel-factory.js';
|
|
15
|
+
export default class GatewayTest extends PromptCommand {
|
|
16
|
+
static description = 'Send a test message through a registered messaging channel';
|
|
17
|
+
static examples = [
|
|
18
|
+
'<%= config.bin %> gateway test telegram --to 123456789 --message "hello from prlt"',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
name: Args.string({
|
|
22
|
+
description: 'Channel name (as registered with `gateway connect`)',
|
|
23
|
+
required: true,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static flags = {
|
|
27
|
+
...machineOutputFlags,
|
|
28
|
+
to: Flags.string({
|
|
29
|
+
description: 'Recipient id on the channel (e.g. Telegram chat id)',
|
|
30
|
+
required: true,
|
|
31
|
+
}),
|
|
32
|
+
message: Flags.string({
|
|
33
|
+
description: 'Text to send',
|
|
34
|
+
default: 'hello from prlt',
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
async run() {
|
|
38
|
+
const { args, flags } = await this.parse(GatewayTest);
|
|
39
|
+
const jsonMode = shouldOutputJson(flags);
|
|
40
|
+
const db = new MachineDB();
|
|
41
|
+
const record = db.getMessagingChannel(args.name);
|
|
42
|
+
db.close();
|
|
43
|
+
if (!record) {
|
|
44
|
+
if (jsonMode) {
|
|
45
|
+
outputErrorAsJson('CHANNEL_NOT_FOUND', `No channel registered with name "${args.name}"`, createMetadata('gateway test', flags));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.log(styles.error(`No channel registered with name "${args.name}"`));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let channel;
|
|
52
|
+
try {
|
|
53
|
+
channel = buildChannelFromRecord(record);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
57
|
+
if (jsonMode) {
|
|
58
|
+
outputErrorAsJson('CHANNEL_BUILD_FAILED', errMsg, createMetadata('gateway test', flags));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.log(styles.error(errMsg));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
await channel.sendMessage({ channel: channel.name, id: flags.to }, flags.message);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
69
|
+
if (jsonMode) {
|
|
70
|
+
outputErrorAsJson('SEND_FAILED', errMsg, createMetadata('gateway test', flags));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.log(styles.error(`Failed to send: ${errMsg}`));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (jsonMode) {
|
|
77
|
+
outputSuccessAsJson({ channel: args.name, to: flags.to, message: flags.message }, createMetadata('gateway test', flags));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.log(styles.success(`Sent test message via "${args.name}" to ${flags.to}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/gateway/test.ts"],"names":[],"mappings":"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"}
|