@positronic/cli 0.0.17 → 0.0.19

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/src/cli.js CHANGED
@@ -601,7 +601,21 @@ export function buildCli(options) {
601
601
  }
602
602
  });
603
603
  })();
604
- }).demandCommand(1, 'You need to specify a brain command (list, history, show, rerun, run, watch).');
604
+ }).command('kill <run-id>', 'Kill a running brain\n', function(yargsKill) {
605
+ return yargsKill.positional('run-id', {
606
+ describe: 'ID of the brain run to kill',
607
+ type: 'string',
608
+ demandOption: true
609
+ }).option('force', {
610
+ describe: 'Skip confirmation prompt',
611
+ type: 'boolean',
612
+ alias: 'f',
613
+ default: false
614
+ }).example('$0 brain kill abc123def', 'Kill a running brain by its run ID').example('$0 brain kill abc123def --force', 'Kill a brain without confirmation');
615
+ }, function(argv) {
616
+ var element = brainCommand.kill(argv);
617
+ render(element);
618
+ }).demandCommand(1, 'You need to specify a brain command (list, history, show, rerun, run, watch, kill).');
605
619
  return yargsBrain;
606
620
  });
607
621
  // --- Resource Management Commands ---
@@ -145,6 +145,7 @@ import { BrainList } from '../components/brain-list.js';
145
145
  import { BrainHistory } from '../components/brain-history.js';
146
146
  import { BrainShow } from '../components/brain-show.js';
147
147
  import { BrainRerun } from '../components/brain-rerun.js';
148
+ import { BrainKill } from '../components/brain-kill.js';
148
149
  import { ErrorComponent } from '../components/error.js';
149
150
  export var BrainCommand = /*#__PURE__*/ function() {
150
151
  "use strict";
@@ -441,6 +442,16 @@ export var BrainCommand = /*#__PURE__*/ function() {
441
442
  });
442
443
  }).apply(this, arguments);
443
444
  }
445
+ },
446
+ {
447
+ key: "kill",
448
+ value: function kill(param) {
449
+ var runId = param.runId, force = param.force;
450
+ return React.createElement(BrainKill, {
451
+ runId: runId,
452
+ force: force
453
+ });
454
+ }
444
455
  }
445
456
  ]);
446
457
  return BrainCommand;
@@ -0,0 +1,172 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import React, { useState, useEffect, useRef } from 'react';
48
+ import { Box, Text, useStdin, useApp } from 'ink';
49
+ import { ErrorComponent } from './error.js';
50
+ import { useApiDelete } from '../hooks/useApi.js';
51
+ export var BrainKill = function(param) {
52
+ var runId = param.runId, force = param.force;
53
+ var _useState = _sliced_to_array(useState(force), 2), confirmed = _useState[0], setConfirmed = _useState[1];
54
+ var _useState1 = _sliced_to_array(useState(false), 2), killed = _useState1[0], setKilled = _useState1[1];
55
+ var _useState2 = _sliced_to_array(useState(''), 2), input = _useState2[0], setInput = _useState2[1];
56
+ var _useStdin = useStdin(), stdin = _useStdin.stdin, setRawMode = _useStdin.setRawMode;
57
+ var exit = useApp().exit;
58
+ var isKilling = useRef(false);
59
+ var _useApiDelete = useApiDelete('brain'), killBrain = _useApiDelete.execute, loading = _useApiDelete.loading, error = _useApiDelete.error;
60
+ useEffect(function() {
61
+ if (stdin && !confirmed && !killed) {
62
+ setRawMode(true);
63
+ var handleData = function(data) {
64
+ var char = data.toString();
65
+ if (char === '\r' || char === '\n') {
66
+ if (input.toLowerCase() === 'yes') {
67
+ setConfirmed(true);
68
+ } else {
69
+ exit();
70
+ }
71
+ } else if (char === '\u0003') {
72
+ exit();
73
+ } else if (char === '\u007F' || char === '\b') {
74
+ setInput(function(prev) {
75
+ return prev.slice(0, -1);
76
+ });
77
+ } else {
78
+ setInput(function(prev) {
79
+ return prev + char;
80
+ });
81
+ }
82
+ };
83
+ stdin.on('data', handleData);
84
+ return function() {
85
+ stdin.off('data', handleData);
86
+ setRawMode(false);
87
+ };
88
+ }
89
+ }, [
90
+ stdin,
91
+ setRawMode,
92
+ confirmed,
93
+ killed,
94
+ exit
95
+ ]);
96
+ useEffect(function() {
97
+ if (confirmed && !killed && !isKilling.current) {
98
+ isKilling.current = true;
99
+ killBrain("/brains/runs/".concat(runId)).then(function() {
100
+ setKilled(true);
101
+ }).catch(function() {
102
+ // Error is already handled by useApiDelete
103
+ }).finally(function() {
104
+ isKilling.current = false;
105
+ });
106
+ }
107
+ }, [
108
+ confirmed,
109
+ killed,
110
+ runId,
111
+ killBrain
112
+ ]);
113
+ if (error) {
114
+ var _error_details, _error_details1;
115
+ // Check if it's a 404 error
116
+ if ((_error_details = error.details) === null || _error_details === void 0 ? void 0 : _error_details.includes('404')) {
117
+ return /*#__PURE__*/ React.createElement(Box, {
118
+ flexDirection: "column"
119
+ }, /*#__PURE__*/ React.createElement(Text, {
120
+ color: "red"
121
+ }, "❌ Brain run not found"), /*#__PURE__*/ React.createElement(Box, {
122
+ marginTop: 1,
123
+ paddingLeft: 2
124
+ }, /*#__PURE__*/ React.createElement(Text, null, "No brain run found with ID: ", runId)));
125
+ }
126
+ // Check if it's a 409 error (conflict - brain already completed)
127
+ if ((_error_details1 = error.details) === null || _error_details1 === void 0 ? void 0 : _error_details1.includes('409')) {
128
+ return /*#__PURE__*/ React.createElement(Box, {
129
+ flexDirection: "column"
130
+ }, /*#__PURE__*/ React.createElement(Text, {
131
+ color: "yellow"
132
+ }, "⚠️ Brain run is not active"), /*#__PURE__*/ React.createElement(Box, {
133
+ marginTop: 1,
134
+ paddingLeft: 2
135
+ }, /*#__PURE__*/ React.createElement(Text, null, "The brain run has already completed or was previously cancelled.")));
136
+ }
137
+ return /*#__PURE__*/ React.createElement(ErrorComponent, {
138
+ error: error
139
+ });
140
+ }
141
+ if (loading) {
142
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "\uD83D\uDED1 Killing brain run..."));
143
+ }
144
+ if (killed) {
145
+ return /*#__PURE__*/ React.createElement(Box, {
146
+ flexDirection: "column"
147
+ }, /*#__PURE__*/ React.createElement(Text, {
148
+ color: "green"
149
+ }, "✅ Brain run killed successfully!"), /*#__PURE__*/ React.createElement(Box, {
150
+ marginTop: 1,
151
+ paddingLeft: 2
152
+ }, /*#__PURE__*/ React.createElement(Text, {
153
+ dimColor: true
154
+ }, "Run ID: ", runId)));
155
+ }
156
+ if (!confirmed) {
157
+ return /*#__PURE__*/ React.createElement(Box, {
158
+ flexDirection: "column"
159
+ }, /*#__PURE__*/ React.createElement(Text, {
160
+ bold: true,
161
+ color: "yellow"
162
+ }, "⚠️ Warning: This will stop the running brain"), /*#__PURE__*/ React.createElement(Box, {
163
+ marginTop: 1,
164
+ marginBottom: 1,
165
+ paddingLeft: 2,
166
+ flexDirection: "column"
167
+ }, /*#__PURE__*/ React.createElement(Text, null, "Run ID: ", runId), /*#__PURE__*/ React.createElement(Text, {
168
+ dimColor: true
169
+ }, "The brain will be cancelled and cannot be resumed.")), /*#__PURE__*/ React.createElement(Text, null, 'Type "yes" to confirm: ', input));
170
+ }
171
+ return null;
172
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,4BAs+B3C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,4BAogC3C"}
@@ -24,6 +24,10 @@ interface BrainWatchArgs {
24
24
  runId?: string;
25
25
  filename?: string;
26
26
  }
27
+ interface BrainKillArgs {
28
+ runId: string;
29
+ force: boolean;
30
+ }
27
31
  export declare class BrainCommand {
28
32
  list(argv: ArgumentsCamelCase<BrainListArgs>): React.ReactElement;
29
33
  history({ filename, limit, }: ArgumentsCamelCase<BrainHistoryArgs>): React.ReactElement;
@@ -31,6 +35,7 @@ export declare class BrainCommand {
31
35
  rerun({ filename, runId, startsAt, stopsAfter, }: ArgumentsCamelCase<BrainRerunArgs>): React.ReactElement;
32
36
  run({ filename, watch, options }: ArgumentsCamelCase<BrainRunArgs>): Promise<React.ReactElement>;
33
37
  watch({ runId, filename, }: ArgumentsCamelCase<BrainWatchArgs>): Promise<React.ReactElement>;
38
+ kill({ runId, force, }: ArgumentsCamelCase<BrainKillArgs>): React.ReactElement;
34
39
  }
35
40
  export {};
36
41
  //# sourceMappingURL=brain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/commands/brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,UAAU,aAAa;CAAG;AAC1B,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIjE,OAAO,CAAC,EACN,QAAQ,EACR,KAAK,GACN,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,YAAY;IAI5D,IAAI,CAAC,EACH,QAAQ,GACT,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIzD,KAAK,CAAC,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,GACX,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY;IASpD,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;IAkEhG,KAAK,CAAC,EACV,KAAK,EACL,QAAQ,GACT,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;CAmFpE"}
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/commands/brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,UAAU,aAAa;CAAG;AAC1B,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIjE,OAAO,CAAC,EACN,QAAQ,EACR,KAAK,GACN,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,YAAY;IAI5D,IAAI,CAAC,EACH,QAAQ,GACT,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIzD,KAAK,CAAC,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,GACX,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY;IASpD,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;IAkEhG,KAAK,CAAC,EACV,KAAK,EACL,QAAQ,GACT,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;IAmFnE,IAAI,CAAC,EACH,KAAK,EACL,KAAK,GACN,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;CAI1D"}
@@ -0,0 +1,7 @@
1
+ interface BrainKillProps {
2
+ runId: string;
3
+ force: boolean;
4
+ }
5
+ export declare const BrainKill: ({ runId, force }: BrainKillProps) => import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=brain-kill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-kill.d.ts","sourceRoot":"","sources":["../../../src/components/brain-kill.tsx"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,GAAI,kBAAkB,cAAc,mDAoHzD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cli",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -23,9 +23,9 @@
23
23
  "clean": "rm -rf tsconfig.tsbuildinfo dist node_modules"
24
24
  },
25
25
  "dependencies": {
26
- "@positronic/core": "^0.0.17",
27
- "@positronic/spec": "^0.0.17",
28
- "@positronic/template-new-project": "^0.0.17",
26
+ "@positronic/core": "^0.0.19",
27
+ "@positronic/spec": "^0.0.19",
28
+ "@positronic/template-new-project": "^0.0.19",
29
29
  "caz": "^2.0.0",
30
30
  "chokidar": "^3.6.0",
31
31
  "eventsource": "^3.0.6",