@formant/formant-cli 0.3.1 → 0.4.3
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/README.md +193 -142
- package/dist/commands/{commands → command}/for-device.js +2 -2
- package/dist/commands/command/for-device.js.map +1 -0
- package/dist/commands/{commands → command}/get.js +2 -2
- package/dist/commands/command/get.js.map +1 -0
- package/dist/commands/{commands → command}/history.js +3 -3
- package/dist/commands/command/history.js.map +1 -0
- package/dist/commands/{commands → command}/list.js +2 -2
- package/dist/commands/command/list.js.map +1 -0
- package/dist/commands/{commands → command}/send.js +5 -5
- package/dist/commands/command/send.js.map +1 -0
- package/dist/commands/{devices → device}/config.js +2 -2
- package/dist/commands/device/config.js.map +1 -0
- package/dist/commands/{devices → device}/create.js +3 -3
- package/dist/commands/device/create.js.map +1 -0
- package/dist/commands/{devices → device}/delete.js +2 -2
- package/dist/commands/device/delete.js.map +1 -0
- package/dist/commands/{devices → device}/get.js +2 -2
- package/dist/commands/device/get.js.map +1 -0
- package/dist/commands/{devices → device}/list.d.ts +7 -1
- package/dist/commands/{devices → device}/list.js +67 -13
- package/dist/commands/device/list.js.map +1 -0
- package/dist/commands/{devices → device}/rename.js +2 -2
- package/dist/commands/device/rename.js.map +1 -0
- package/dist/commands/{devices → device}/streams.d.ts +1 -0
- package/dist/commands/device/streams.js +155 -0
- package/dist/commands/device/streams.js.map +1 -0
- package/dist/commands/{devices → device}/tag.js +3 -3
- package/dist/commands/device/tag.js.map +1 -0
- package/dist/commands/{devices → device}/untag.js +3 -3
- package/dist/commands/device/untag.js.map +1 -0
- package/dist/commands/{events → event}/get.js +2 -2
- package/dist/commands/event/get.js.map +1 -0
- package/dist/commands/{events → event}/list.js +4 -4
- package/dist/commands/event/list.js.map +1 -0
- package/dist/commands/{event-triggers → event-trigger}/get.js +2 -2
- package/dist/commands/event-trigger/get.js.map +1 -0
- package/dist/commands/{event-triggers → event-trigger}/list.js +2 -2
- package/dist/commands/event-trigger/list.js.map +1 -0
- package/dist/commands/{fleets → fleet}/get.js +2 -2
- package/dist/commands/fleet/get.js.map +1 -0
- package/dist/commands/{fleets → fleet}/list.js +2 -2
- package/dist/commands/fleet/list.js.map +1 -0
- package/dist/commands/{investigations → investigation}/analytics.js +3 -3
- package/dist/commands/investigation/analytics.js.map +1 -0
- package/dist/commands/{investigations → investigation}/get.js +2 -2
- package/dist/commands/investigation/get.js.map +1 -0
- package/dist/commands/{investigations → investigation}/list.js +3 -3
- package/dist/commands/investigation/list.js.map +1 -0
- package/dist/commands/{investigations → investigation}/run.js +3 -3
- package/dist/commands/investigation/run.js.map +1 -0
- package/dist/commands/{investigations → investigation}/runs-list.js +3 -3
- package/dist/commands/investigation/runs-list.js.map +1 -0
- package/dist/commands/{investigations → investigation}/runs.js +2 -2
- package/dist/commands/investigation/runs.js.map +1 -0
- package/dist/commands/{investigations → investigation}/stats.js +2 -2
- package/dist/commands/investigation/stats.js.map +1 -0
- package/dist/commands/{investigations → investigation}/trigger.js +2 -2
- package/dist/commands/investigation/trigger.js.map +1 -0
- package/dist/commands/persona/delegate-task.d.ts +14 -0
- package/dist/commands/persona/delegate-task.js +50 -0
- package/dist/commands/persona/delegate-task.js.map +1 -0
- package/dist/commands/persona/get.d.ts +10 -0
- package/dist/commands/persona/get.js +98 -0
- package/dist/commands/persona/get.js.map +1 -0
- package/dist/commands/{signals → persona}/list.d.ts +1 -1
- package/dist/commands/persona/list.js +31 -0
- package/dist/commands/persona/list.js.map +1 -0
- package/dist/commands/persona/task-status.d.ts +12 -0
- package/dist/commands/persona/task-status.js +57 -0
- package/dist/commands/persona/task-status.js.map +1 -0
- package/dist/commands/{schedules → schedule}/get.js +2 -2
- package/dist/commands/schedule/get.js.map +1 -0
- package/dist/commands/{schedules → schedule}/list.js +2 -2
- package/dist/commands/schedule/list.js.map +1 -0
- package/dist/commands/{signals → signal}/count.js +3 -3
- package/dist/commands/signal/count.js.map +1 -0
- package/dist/commands/signal/create.d.ts +16 -0
- package/dist/commands/signal/create.js +95 -0
- package/dist/commands/signal/create.js.map +1 -0
- package/dist/commands/{signals → signal}/get.js +3 -3
- package/dist/commands/signal/get.js.map +1 -0
- package/dist/commands/signal/list.d.ts +12 -0
- package/dist/commands/signal/list.js +85 -0
- package/dist/commands/signal/list.js.map +1 -0
- package/dist/commands/{signals → signal}/query.d.ts +1 -0
- package/dist/commands/signal/query.js +100 -0
- package/dist/commands/signal/query.js.map +1 -0
- package/dist/commands/signal/set-ground-truth.d.ts +12 -0
- package/dist/commands/signal/set-ground-truth.js +46 -0
- package/dist/commands/signal/set-ground-truth.js.map +1 -0
- package/dist/commands/{users → user}/get.js +2 -2
- package/dist/commands/user/get.js.map +1 -0
- package/dist/commands/{users → user}/list.js +2 -2
- package/dist/commands/user/list.js.map +1 -0
- package/dist/help.js +53 -47
- package/dist/help.js.map +1 -1
- package/dist/lib/api.d.ts +1 -1
- package/dist/lib/api.js +3 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.js +3 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/presence.d.ts +46 -0
- package/dist/lib/presence.js +95 -0
- package/dist/lib/presence.js.map +1 -0
- package/oclif.manifest.json +1192 -790
- package/package.json +28 -25
- package/dist/commands/commands/for-device.js.map +0 -1
- package/dist/commands/commands/get.js.map +0 -1
- package/dist/commands/commands/history.js.map +0 -1
- package/dist/commands/commands/list.js.map +0 -1
- package/dist/commands/commands/send.js.map +0 -1
- package/dist/commands/devices/config.js.map +0 -1
- package/dist/commands/devices/create.js.map +0 -1
- package/dist/commands/devices/delete.js.map +0 -1
- package/dist/commands/devices/get.js.map +0 -1
- package/dist/commands/devices/last-seen.d.ts +0 -10
- package/dist/commands/devices/last-seen.js +0 -25
- package/dist/commands/devices/last-seen.js.map +0 -1
- package/dist/commands/devices/list.js.map +0 -1
- package/dist/commands/devices/rename.js.map +0 -1
- package/dist/commands/devices/streams.js +0 -100
- package/dist/commands/devices/streams.js.map +0 -1
- package/dist/commands/devices/tag.js.map +0 -1
- package/dist/commands/devices/untag.js.map +0 -1
- package/dist/commands/event-triggers/get.js.map +0 -1
- package/dist/commands/event-triggers/list.js.map +0 -1
- package/dist/commands/events/get.js.map +0 -1
- package/dist/commands/events/list.js.map +0 -1
- package/dist/commands/fleets/get.js.map +0 -1
- package/dist/commands/fleets/list.js.map +0 -1
- package/dist/commands/investigations/analytics.js.map +0 -1
- package/dist/commands/investigations/get.js.map +0 -1
- package/dist/commands/investigations/list.js.map +0 -1
- package/dist/commands/investigations/run.js.map +0 -1
- package/dist/commands/investigations/runs-list.js.map +0 -1
- package/dist/commands/investigations/runs.js.map +0 -1
- package/dist/commands/investigations/stats.js.map +0 -1
- package/dist/commands/investigations/trigger.js.map +0 -1
- package/dist/commands/schedules/get.js.map +0 -1
- package/dist/commands/schedules/list.js.map +0 -1
- package/dist/commands/signals/count.js.map +0 -1
- package/dist/commands/signals/get.js.map +0 -1
- package/dist/commands/signals/list.js +0 -30
- package/dist/commands/signals/list.js.map +0 -1
- package/dist/commands/signals/query.js +0 -52
- package/dist/commands/signals/query.js.map +0 -1
- package/dist/commands/users/get.js.map +0 -1
- package/dist/commands/users/list.js.map +0 -1
- /package/dist/commands/{commands → command}/for-device.d.ts +0 -0
- /package/dist/commands/{commands → command}/get.d.ts +0 -0
- /package/dist/commands/{commands → command}/history.d.ts +0 -0
- /package/dist/commands/{commands → command}/list.d.ts +0 -0
- /package/dist/commands/{commands → command}/send.d.ts +0 -0
- /package/dist/commands/{devices → device}/config.d.ts +0 -0
- /package/dist/commands/{devices → device}/create.d.ts +0 -0
- /package/dist/commands/{devices → device}/delete.d.ts +0 -0
- /package/dist/commands/{devices → device}/get.d.ts +0 -0
- /package/dist/commands/{devices → device}/rename.d.ts +0 -0
- /package/dist/commands/{devices → device}/tag.d.ts +0 -0
- /package/dist/commands/{devices → device}/untag.d.ts +0 -0
- /package/dist/commands/{events → event}/get.d.ts +0 -0
- /package/dist/commands/{events → event}/list.d.ts +0 -0
- /package/dist/commands/{event-triggers → event-trigger}/get.d.ts +0 -0
- /package/dist/commands/{event-triggers → event-trigger}/list.d.ts +0 -0
- /package/dist/commands/{fleets → fleet}/get.d.ts +0 -0
- /package/dist/commands/{fleets → fleet}/list.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/analytics.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/get.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/list.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/run.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/runs-list.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/runs.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/stats.d.ts +0 -0
- /package/dist/commands/{investigations → investigation}/trigger.d.ts +0 -0
- /package/dist/commands/{schedules → schedule}/get.d.ts +0 -0
- /package/dist/commands/{schedules → schedule}/list.d.ts +0 -0
- /package/dist/commands/{signals → signal}/count.d.ts +0 -0
- /package/dist/commands/{signals → signal}/get.d.ts +0 -0
- /package/dist/commands/{users → user}/get.d.ts +0 -0
- /package/dist/commands/{users → user}/list.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count.js","sourceRoot":"","sources":["../../../src/commands/signal/count.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAA;AAEpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAgC;IACxE,MAAM,CAAU,WAAW,GAAG;;sFAEsD,CAAA;IAEpF,MAAM,CAAU,QAAQ,GAAG;QACzB,gCAAgC;QAChC,oEAAoE;QACpE,uCAAuC;KACxC,CAAA;IAED,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,qBAAqB;SACnC,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,uBAAuB;SACrC,CAAC;KACH,CAAA;IAED,MAAM,CAAU,OAAO,GAAG,2BAA2B,CAAA;IAE9C,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;QACvD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;QAEjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,WAAW,EACX,eAAe,EACf,EAAC,IAAI,EAAC,CACP,CAAA;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAA;YACxD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE;gBAC7C,YAAY,EAAE,eAAe;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf,CAAC,CAAC,CAAA;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command.js';
|
|
2
|
+
export default class SignalCreate extends BaseCommand<typeof SignalCreate> {
|
|
3
|
+
static args: {
|
|
4
|
+
goal: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: {
|
|
9
|
+
device: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
'ground-truth': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
investigation: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
persona: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
static summary: string;
|
|
15
|
+
run(): Promise<Record<string, unknown>>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import { formatDetail } from '../../lib/formatters.js';
|
|
4
|
+
export default class SignalCreate extends BaseCommand {
|
|
5
|
+
static args = {
|
|
6
|
+
goal: Args.string({ description: 'Goal or description for the signal', required: true }),
|
|
7
|
+
};
|
|
8
|
+
static description = `Create a manual signal.
|
|
9
|
+
|
|
10
|
+
Signals are points of interest that can trigger AI-powered investigations. Use this to
|
|
11
|
+
manually create a signal with a goal description, optionally targeting a specific device
|
|
12
|
+
or persona.`;
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> signal create "Robot arm jammed at joint 3"',
|
|
15
|
+
'<%= config.bin %> signal create "Battery draining fast" --device <device-id>',
|
|
16
|
+
'<%= config.bin %> signal create "Investigate sensor anomaly" --persona <persona-id>',
|
|
17
|
+
'<%= config.bin %> signal create "Test alarm scenario" --investigation <taskflow-id>',
|
|
18
|
+
'<%= config.bin %> signal create "Motor overheated" --investigation <id> --ground-truth "Should identify motor thermal fault"',
|
|
19
|
+
];
|
|
20
|
+
static flags = {
|
|
21
|
+
device: Flags.string({
|
|
22
|
+
char: 'd',
|
|
23
|
+
description: 'Device ID to associate with this signal',
|
|
24
|
+
}),
|
|
25
|
+
'ground-truth': Flags.string({
|
|
26
|
+
char: 'g',
|
|
27
|
+
dependsOn: ['investigation'],
|
|
28
|
+
description: 'Expected outcome (ground truth) for this signal — requires --investigation',
|
|
29
|
+
}),
|
|
30
|
+
investigation: Flags.string({
|
|
31
|
+
char: 'i',
|
|
32
|
+
description: 'Investigation (taskflow) ID this signal targets',
|
|
33
|
+
}),
|
|
34
|
+
persona: Flags.string({
|
|
35
|
+
char: 'p',
|
|
36
|
+
description: 'Persona ID to handle this signal',
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
static summary = 'Create a manual signal';
|
|
40
|
+
async run() {
|
|
41
|
+
const body = {
|
|
42
|
+
goal: this.args.goal,
|
|
43
|
+
type: 'manual',
|
|
44
|
+
};
|
|
45
|
+
if (this.flags.device)
|
|
46
|
+
body.deviceId = this.flags.device;
|
|
47
|
+
if (this.flags.persona)
|
|
48
|
+
body.personaId = this.flags.persona;
|
|
49
|
+
if (this.flags.investigation)
|
|
50
|
+
body.createdForTaskFlowId = this.flags.investigation;
|
|
51
|
+
const signal = await this.api('theopolis', 'signals', { body });
|
|
52
|
+
// If ground truth specified, create it for this signal + investigation
|
|
53
|
+
let groundTruth;
|
|
54
|
+
if (this.flags['ground-truth'] && this.flags.investigation) {
|
|
55
|
+
groundTruth = await this.api('theopolis', `taskflows/${this.flags.investigation}/eval/ground-truths`, {
|
|
56
|
+
body: {
|
|
57
|
+
expectedOutcome: this.flags['ground-truth'],
|
|
58
|
+
signalId: signal.id,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (!this.jsonEnabled()) {
|
|
63
|
+
this.log(`\nSignal created (${this.env}):\n`);
|
|
64
|
+
const detail = {
|
|
65
|
+
createdAt: signal.createdAt,
|
|
66
|
+
deviceId: signal.deviceId ?? '—',
|
|
67
|
+
goal: signal.goal,
|
|
68
|
+
id: signal.id,
|
|
69
|
+
personaId: signal.personaId ?? '—',
|
|
70
|
+
status: signal.status,
|
|
71
|
+
type: signal.type,
|
|
72
|
+
};
|
|
73
|
+
const labels = {
|
|
74
|
+
createdAt: 'Created',
|
|
75
|
+
deviceId: 'Device',
|
|
76
|
+
goal: 'Goal',
|
|
77
|
+
id: 'ID',
|
|
78
|
+
personaId: 'Persona',
|
|
79
|
+
status: 'Status',
|
|
80
|
+
type: 'Type',
|
|
81
|
+
};
|
|
82
|
+
if (groundTruth) {
|
|
83
|
+
detail.groundTruth = groundTruth.expectedOutcome;
|
|
84
|
+
labels.groundTruth = 'Ground Truth';
|
|
85
|
+
}
|
|
86
|
+
this.log(formatDetail(detail, labels));
|
|
87
|
+
this.log('');
|
|
88
|
+
}
|
|
89
|
+
const result = { ...signal };
|
|
90
|
+
if (groundTruth)
|
|
91
|
+
result.groundTruth = groundTruth;
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/signal/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAA;AAEpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,WAAgC;IACxE,MAAM,CAAU,IAAI,GAAG;QACrB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,oCAAoC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KACvF,CAAA;IAED,MAAM,CAAU,WAAW,GAAG;;;;YAIpB,CAAA;IAEV,MAAM,CAAU,QAAQ,GAAG;QACzB,+DAA+D;QAC/D,8EAA8E;QAC9E,qFAAqF;QACrF,qFAAqF;QACrF,8HAA8H;KAC/H,CAAA;IAED,MAAM,CAAU,KAAK,GAAG;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,yCAAyC;SACvD,CAAC;QACF,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;YAC3B,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,CAAC,eAAe,CAAC;YAC5B,WAAW,EAAE,4EAA4E;SAC1F,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,iDAAiD;SAC/D,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kCAAkC;SAChD,CAAC;KACH,CAAA;IAED,MAAM,CAAU,OAAO,GAAG,wBAAwB,CAAA;IAE3C,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,IAAI,EAAE,QAAQ;SACf,CAAA;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;QACxD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA;QAC3D,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa;YAAE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAA;QAElF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,WAAW,EACX,SAAS,EACT,EAAC,IAAI,EAAC,CACP,CAAA;QAED,uEAAuE;QACvE,IAAI,WAAgD,CAAA;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3D,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAC1B,WAAW,EACX,aAAa,IAAI,CAAC,KAAK,CAAC,aAAa,qBAAqB,EAC1D;gBACE,IAAI,EAAE;oBACJ,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;oBAC3C,QAAQ,EAAE,MAAM,CAAC,EAAE;iBACpB;aACF,CACF,CAAA;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;YAC7C,MAAM,MAAM,GAA4B;gBACtC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;gBAClC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAA;YAED,MAAM,MAAM,GAA2B;gBACrC,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,IAAI;gBACR,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,MAAM;aACb,CAAA;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,eAAe,CAAA;gBAChD,MAAM,CAAC,WAAW,GAAG,cAAc,CAAA;YACrC,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAED,MAAM,MAAM,GAA4B,EAAC,GAAG,MAAM,EAAC,CAAA;QACnD,IAAI,WAAW;YAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;QACjD,OAAO,MAAM,CAAA;IACf,CAAC"}
|
|
@@ -11,9 +11,9 @@ Shows signal details including the triggering event, goal, status, and type (man
|
|
|
11
11
|
eventTrigger, schedule, slack). Use --trace to also fetch the event and event trigger
|
|
12
12
|
information.`;
|
|
13
13
|
static examples = [
|
|
14
|
-
'<%= config.bin %>
|
|
15
|
-
'<%= config.bin %>
|
|
16
|
-
'<%= config.bin %>
|
|
14
|
+
'<%= config.bin %> signal get <signal-id>',
|
|
15
|
+
'<%= config.bin %> signal get <signal-id> --trace',
|
|
16
|
+
'<%= config.bin %> signal get <signal-id> --json',
|
|
17
17
|
];
|
|
18
18
|
static flags = {
|
|
19
19
|
trace: Flags.boolean({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/signal/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command.js';
|
|
2
|
+
export default class SignalsList extends BaseCommand<typeof SignalsList> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
investigation: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
8
|
+
static summary: string;
|
|
9
|
+
run(): Promise<{
|
|
10
|
+
items: unknown[];
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import { formatTable } from '../../lib/formatters.js';
|
|
4
|
+
export default class SignalsList extends BaseCommand {
|
|
5
|
+
static description = `List all signals in your organization.
|
|
6
|
+
|
|
7
|
+
Signals are points of interest that trigger AI-powered investigations. They can be
|
|
8
|
+
created manually, generated from device events, scheduled, or from Slack/Teams integrations.
|
|
9
|
+
|
|
10
|
+
Use --investigation to also show ground truth (expected outcome) for each signal
|
|
11
|
+
that has one assigned for that investigation.`;
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> signal list',
|
|
14
|
+
'<%= config.bin %> signal list --investigation <taskflow-id>',
|
|
15
|
+
'<%= config.bin %> signal list --json',
|
|
16
|
+
];
|
|
17
|
+
static flags = {
|
|
18
|
+
investigation: Flags.string({
|
|
19
|
+
char: 'i',
|
|
20
|
+
description: 'Investigation (taskflow) ID — shows ground truth for signals that have one',
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
static summary = 'List all signals';
|
|
24
|
+
async run() {
|
|
25
|
+
const result = await this.api('theopolis', 'signals', { method: 'GET' });
|
|
26
|
+
// If investigation flag set, fetch ground truths and merge
|
|
27
|
+
let groundTruthMap;
|
|
28
|
+
if (this.flags.investigation) {
|
|
29
|
+
try {
|
|
30
|
+
const gtResult = await this.api('theopolis', `taskflows/${this.flags.investigation}/eval/ground-truths`, { method: 'GET' });
|
|
31
|
+
groundTruthMap = new Map();
|
|
32
|
+
for (const gt of gtResult.groundTruths ?? []) {
|
|
33
|
+
groundTruthMap.set(gt.signalId, gt.expectedOutcome);
|
|
34
|
+
}
|
|
35
|
+
// Enrich signal items with ground truth
|
|
36
|
+
for (const signal of result.items ?? []) {
|
|
37
|
+
const expectedOutcome = groundTruthMap.get(signal.id);
|
|
38
|
+
if (expectedOutcome) {
|
|
39
|
+
signal.expectedOutcome = expectedOutcome;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Investigation may not exist or have no ground truths — continue without
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!this.jsonEnabled()) {
|
|
48
|
+
const hasGt = this.flags.investigation && groundTruthMap && groundTruthMap.size > 0;
|
|
49
|
+
const columns = [
|
|
50
|
+
{ key: 'id', label: 'ID', width: 40 },
|
|
51
|
+
{ key: 'type', label: 'TYPE', width: 14 },
|
|
52
|
+
{ key: 'status', label: 'STATUS', width: 12 },
|
|
53
|
+
{ key: 'goal', label: 'GOAL', width: 36 },
|
|
54
|
+
{ key: 'createdAt', label: 'CREATED', width: 22 },
|
|
55
|
+
];
|
|
56
|
+
if (hasGt) {
|
|
57
|
+
columns.push({ key: 'hasGroundTruth', label: 'GT', width: 4 });
|
|
58
|
+
}
|
|
59
|
+
// Mark signals that have ground truth
|
|
60
|
+
const items = (result.items ?? []).map((s) => ({
|
|
61
|
+
...s,
|
|
62
|
+
hasGroundTruth: groundTruthMap?.has(s.id) ? '*' : '',
|
|
63
|
+
}));
|
|
64
|
+
this.log(`\nSignals (${this.env}):\n`);
|
|
65
|
+
this.log(formatTable(items, columns));
|
|
66
|
+
// Print full ground truths below the table
|
|
67
|
+
if (hasGt) {
|
|
68
|
+
this.log(`\nGround Truths:\n`);
|
|
69
|
+
for (const signal of result.items ?? []) {
|
|
70
|
+
const gt = groundTruthMap.get(signal.id);
|
|
71
|
+
if (gt) {
|
|
72
|
+
const goal = String(signal.goal ?? '').slice(0, 60);
|
|
73
|
+
this.log(` ${signal.id}`);
|
|
74
|
+
this.log(` Goal: ${goal}`);
|
|
75
|
+
this.log(` Ground Truth: ${gt}`);
|
|
76
|
+
this.log('');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.log('');
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/signal/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export default class SignalsQuery extends BaseCommand<typeof SignalsQuery> {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
end: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
investigation: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
8
|
start: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
9
|
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
10
|
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import { formatTable } from '../../lib/formatters.js';
|
|
4
|
+
export default class SignalsQuery extends BaseCommand {
|
|
5
|
+
static description = `Query signals by time range and type.
|
|
6
|
+
|
|
7
|
+
Signal types: manual, eventTrigger, schedule, slack.
|
|
8
|
+
|
|
9
|
+
Use --investigation to also show ground truth (expected outcome) for each signal.`;
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> signal query --start 2026-01-01',
|
|
12
|
+
'<%= config.bin %> signal query --start 2026-01-01 --end 2026-02-01 --type eventTrigger',
|
|
13
|
+
'<%= config.bin %> signal query --start 2026-01-01 --investigation <taskflow-id>',
|
|
14
|
+
'<%= config.bin %> signal query --start 2026-01-01 --json',
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
end: Flags.string({
|
|
18
|
+
description: 'End time (ISO 8601)',
|
|
19
|
+
}),
|
|
20
|
+
investigation: Flags.string({
|
|
21
|
+
char: 'i',
|
|
22
|
+
description: 'Investigation (taskflow) ID — shows ground truth for signals that have one',
|
|
23
|
+
}),
|
|
24
|
+
start: Flags.string({
|
|
25
|
+
description: 'Start time (ISO 8601)',
|
|
26
|
+
required: true,
|
|
27
|
+
}),
|
|
28
|
+
type: Flags.string({
|
|
29
|
+
description: 'Filter by signal type',
|
|
30
|
+
options: ['manual', 'eventTrigger', 'schedule', 'slack'],
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
static summary = 'Query signals by time range';
|
|
34
|
+
async run() {
|
|
35
|
+
// Normalize dates to ISO 8601 datetime format
|
|
36
|
+
const body = {
|
|
37
|
+
startTime: this.normalizeDateTime(this.flags.start),
|
|
38
|
+
};
|
|
39
|
+
if (this.flags.end)
|
|
40
|
+
body.endTime = this.normalizeDateTime(this.flags.end);
|
|
41
|
+
if (this.flags.type)
|
|
42
|
+
body.type = this.flags.type;
|
|
43
|
+
const result = await this.api('theopolis', 'signals/query', { body });
|
|
44
|
+
// If investigation flag set, fetch ground truths and merge
|
|
45
|
+
let groundTruthMap;
|
|
46
|
+
if (this.flags.investigation) {
|
|
47
|
+
try {
|
|
48
|
+
const gtResult = await this.api('theopolis', `taskflows/${this.flags.investigation}/eval/ground-truths`, { method: 'GET' });
|
|
49
|
+
groundTruthMap = new Map();
|
|
50
|
+
for (const gt of gtResult.groundTruths ?? []) {
|
|
51
|
+
groundTruthMap.set(gt.signalId, gt.expectedOutcome);
|
|
52
|
+
}
|
|
53
|
+
for (const signal of result.items ?? []) {
|
|
54
|
+
const expectedOutcome = groundTruthMap.get(signal.id);
|
|
55
|
+
if (expectedOutcome) {
|
|
56
|
+
signal.expectedOutcome = expectedOutcome;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Continue without ground truths
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!this.jsonEnabled()) {
|
|
65
|
+
const hasGt = this.flags.investigation && groundTruthMap && groundTruthMap.size > 0;
|
|
66
|
+
const columns = [
|
|
67
|
+
{ key: 'id', label: 'ID', width: 40 },
|
|
68
|
+
{ key: 'type', label: 'TYPE', width: 14 },
|
|
69
|
+
{ key: 'status', label: 'STATUS', width: 12 },
|
|
70
|
+
{ key: 'goal', label: 'GOAL', width: 36 },
|
|
71
|
+
{ key: 'createdAt', label: 'CREATED', width: 22 },
|
|
72
|
+
];
|
|
73
|
+
if (hasGt) {
|
|
74
|
+
columns.push({ key: 'hasGroundTruth', label: 'GT', width: 4 });
|
|
75
|
+
}
|
|
76
|
+
const items = (result.items ?? []).map((s) => ({
|
|
77
|
+
...s,
|
|
78
|
+
hasGroundTruth: groundTruthMap?.has(s.id) ? '*' : '',
|
|
79
|
+
}));
|
|
80
|
+
this.log(`\nSignals (${this.env}):\n`);
|
|
81
|
+
this.log(formatTable(items, columns));
|
|
82
|
+
if (hasGt) {
|
|
83
|
+
this.log(`\nGround Truths:\n`);
|
|
84
|
+
for (const signal of result.items ?? []) {
|
|
85
|
+
const gt = groundTruthMap.get(signal.id);
|
|
86
|
+
if (gt) {
|
|
87
|
+
const goal = String(signal.goal ?? '').slice(0, 60);
|
|
88
|
+
this.log(` ${signal.id}`);
|
|
89
|
+
this.log(` Goal: ${goal}`);
|
|
90
|
+
this.log(` Ground Truth: ${gt}`);
|
|
91
|
+
this.log('');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.log('');
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/signal/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command.js';
|
|
2
|
+
export default class SignalSetGroundTruth extends BaseCommand<typeof SignalSetGroundTruth> {
|
|
3
|
+
static args: {
|
|
4
|
+
signalId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
investigationId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
expectedOutcome: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static description: string;
|
|
9
|
+
static examples: string[];
|
|
10
|
+
static summary: string;
|
|
11
|
+
run(): Promise<Record<string, unknown>>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import { formatDetail } from '../../lib/formatters.js';
|
|
4
|
+
export default class SignalSetGroundTruth extends BaseCommand {
|
|
5
|
+
static args = {
|
|
6
|
+
signalId: Args.string({ description: 'Signal ID (UUID)', required: true }),
|
|
7
|
+
investigationId: Args.string({ description: 'Investigation (taskflow) ID', required: true }),
|
|
8
|
+
expectedOutcome: Args.string({ description: 'The expected outcome / ground truth for this signal', required: true }),
|
|
9
|
+
};
|
|
10
|
+
static description = `Assign a ground truth (expected outcome) to a signal for an investigation.
|
|
11
|
+
|
|
12
|
+
Ground truths define what the correct outcome should be when an investigation processes
|
|
13
|
+
a given signal. They are used for evaluation and quality measurement of investigation
|
|
14
|
+
workflows.`;
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> signal set-ground-truth <signal-id> <investigation-id> "The alarm should be dismissed as a false positive"',
|
|
17
|
+
'<%= config.bin %> signal set-ground-truth <signal-id> <investigation-id> "Root cause: overheated motor in joint 3" --json',
|
|
18
|
+
];
|
|
19
|
+
static summary = 'Assign ground truth to a signal';
|
|
20
|
+
async run() {
|
|
21
|
+
const { expectedOutcome, investigationId, signalId } = this.args;
|
|
22
|
+
const groundTruth = await this.api('theopolis', `taskflows/${investigationId}/eval/ground-truths`, {
|
|
23
|
+
body: {
|
|
24
|
+
expectedOutcome,
|
|
25
|
+
signalId,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if (!this.jsonEnabled()) {
|
|
29
|
+
this.log(`\nGround truth assigned (${this.env}):\n`);
|
|
30
|
+
this.log(formatDetail({
|
|
31
|
+
expectedOutcome: groundTruth.expectedOutcome,
|
|
32
|
+
id: groundTruth.id,
|
|
33
|
+
investigation: investigationId,
|
|
34
|
+
signalId: groundTruth.signalId,
|
|
35
|
+
}, {
|
|
36
|
+
expectedOutcome: 'Expected Outcome',
|
|
37
|
+
id: 'Ground Truth ID',
|
|
38
|
+
investigation: 'Investigation',
|
|
39
|
+
signalId: 'Signal',
|
|
40
|
+
}));
|
|
41
|
+
this.log('');
|
|
42
|
+
}
|
|
43
|
+
return groundTruth;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=set-ground-truth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-ground-truth.js","sourceRoot":"","sources":["../../../src/commands/signal/set-ground-truth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAA;AAEpD,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,WAAwC;IACxF,MAAM,CAAU,IAAI,GAAG;QACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;QACxE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;QAC1F,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,qDAAqD,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KACnH,CAAA;IAED,MAAM,CAAU,WAAW,GAAG;;;;WAIrB,CAAA;IAET,MAAM,CAAU,QAAQ,GAAG;QACzB,8HAA8H;QAC9H,2HAA2H;KAC5H,CAAA;IAED,MAAM,CAAU,OAAO,GAAG,iCAAiC,CAAA;IAEpD,KAAK,CAAC,GAAG;QACd,MAAM,EAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAE9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAChC,WAAW,EACX,aAAa,eAAe,qBAAqB,EACjD;YACE,IAAI,EAAE;gBACJ,eAAe;gBACf,QAAQ;aACT;SACF,CACF,CAAA;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;YACpD,IAAI,CAAC,GAAG,CAAC,YAAY,CACnB;gBACE,eAAe,EAAE,WAAW,CAAC,eAAe;gBAC5C,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,EACD;gBACE,eAAe,EAAE,kBAAkB;gBACnC,EAAE,EAAE,iBAAiB;gBACrB,aAAa,EAAE,eAAe;gBAC9B,QAAQ,EAAE,QAAQ;aACnB,CACF,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAED,OAAO,WAAW,CAAA;IACpB,CAAC"}
|
|
@@ -9,8 +9,8 @@ export default class UsersGet extends BaseCommand {
|
|
|
9
9
|
|
|
10
10
|
Shows user details including email, name, roles, and account settings.`;
|
|
11
11
|
static examples = [
|
|
12
|
-
'<%= config.bin %>
|
|
13
|
-
'<%= config.bin %>
|
|
12
|
+
'<%= config.bin %> user get <user-id>',
|
|
13
|
+
'<%= config.bin %> user get <user-id> --json',
|
|
14
14
|
];
|
|
15
15
|
static summary = 'Get user details';
|
|
16
16
|
async run() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/user/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAA;AAEpD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAA4B;IAChE,MAAM,CAAU,IAAI,GAAG;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KACjE,CAAA;IAED,MAAM,CAAU,WAAW,GAAG;;uEAEuC,CAAA;IAErE,MAAM,CAAU,QAAQ,GAAG;QACzB,sCAAsC;QACtC,6CAA6C;KAC9C,CAAA;IAED,MAAM,CAAU,OAAO,GAAG,kBAAkB,CAAA;IAErC,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAA0B,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE;YACrF,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;YAC3C,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;YAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC"}
|
|
@@ -5,8 +5,8 @@ export default class UsersList extends BaseCommand {
|
|
|
5
5
|
|
|
6
6
|
Shows user accounts, their email addresses, and account status.`;
|
|
7
7
|
static examples = [
|
|
8
|
-
'<%= config.bin %>
|
|
9
|
-
'<%= config.bin %>
|
|
8
|
+
'<%= config.bin %> user list',
|
|
9
|
+
'<%= config.bin %> user list --json',
|
|
10
10
|
];
|
|
11
11
|
static summary = 'List users';
|
|
12
12
|
async run() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/user/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAc,WAAW,EAAC,MAAM,yBAAyB,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAA6B;IAClE,MAAM,CAAU,WAAW,GAAG;;gEAEgC,CAAA;IAE9D,MAAM,CAAU,QAAQ,GAAG;QACzB,6BAA6B;QAC7B,oCAAoC;KACrC,CAAA;IAED,MAAM,CAAU,OAAO,GAAG,YAAY,CAAA;IAE/B,KAAK,CAAC,GAAG;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,OAAO,EACP,OAAO,EACP,EAAC,MAAM,EAAE,KAAK,EAAC,CAChB,CAAA;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,GAAa;gBACxB,EAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAC;gBACzC,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAC;gBACvC,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAC;gBACnC,EAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAC;aAC7C,CAAA;YAED,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;YACpC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;YAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC"}
|