@task-handoff/control-plane 0.0.2 → 0.0.3-alpha.2

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 (67) hide show
  1. package/bin/task-handoff-install-server +44 -10
  2. package/dist/cli.js +2 -2
  3. package/package.json +1 -1
  4. package/ui/assets/{abnfDiagram-VRR7QNED-zpzEGQUU.js → abnfDiagram-VRR7QNED-C2DFVHTB.js} +1 -1
  5. package/ui/assets/{arc-YlPAcjcA.js → arc-B23lNuqV.js} +1 -1
  6. package/ui/assets/{architectureDiagram-ZJ3FMSHR-gKh1GoJ-.js → architectureDiagram-ZJ3FMSHR-CCeHPqV9.js} +1 -1
  7. package/ui/assets/{blockDiagram-677ZJIJ3-BPoey46h.js → blockDiagram-677ZJIJ3-BHqx8hiT.js} +1 -1
  8. package/ui/assets/{c4Diagram-LMCZKHZV-Ba-K1kbG.js → c4Diagram-LMCZKHZV-CHxgUZXO.js} +1 -1
  9. package/ui/assets/channel-CwBaevdx.js +1 -0
  10. package/ui/assets/{chunk-2Q5K7J3B-B21lfJN3.js → chunk-2Q5K7J3B-DQg8sYXD.js} +1 -1
  11. package/ui/assets/{chunk-32BRIVSS-4DXGAb-p.js → chunk-32BRIVSS-Nz1uCs-o.js} +1 -1
  12. package/ui/assets/{chunk-5VM5RSS4-BTJ3QwFs.js → chunk-5VM5RSS4-C0YPGOEu.js} +1 -1
  13. package/ui/assets/{chunk-EX3LRPZG-BNbiyHtR.js → chunk-EX3LRPZG-Dx_81j7e.js} +1 -1
  14. package/ui/assets/{chunk-JWPE2WC7-DCyFrqSV.js → chunk-JWPE2WC7-BwbaAEMm.js} +1 -1
  15. package/ui/assets/{chunk-MOJQB5TN-CpZLzjfV.js → chunk-MOJQB5TN-BJTOPlyz.js} +1 -1
  16. package/ui/assets/{chunk-RYQCIY6F-C6An87oR.js → chunk-RYQCIY6F-C1V9MScB.js} +1 -1
  17. package/ui/assets/{chunk-V7JOEXUC-BUW8J6c_.js → chunk-V7JOEXUC-DZQwK7JJ.js} +1 -1
  18. package/ui/assets/{chunk-VR4S4FIN-rsqRXVtN.js → chunk-VR4S4FIN-BnW-O0wh.js} +1 -1
  19. package/ui/assets/{chunk-XXDRQBXY-lgeU6p-p.js → chunk-XXDRQBXY-CW7TuXcT.js} +1 -1
  20. package/ui/assets/classDiagram-OUVF2IWQ-jFPWTL01.js +1 -0
  21. package/ui/assets/classDiagram-v2-EOCWNBFH-jFPWTL01.js +1 -0
  22. package/ui/assets/{cose-bilkent-JH36ORCC-CI_7H8mu.js → cose-bilkent-JH36ORCC-D8wSgbob.js} +1 -1
  23. package/ui/assets/{cynefin-VYW2F7L2-DDtwbU8C.js → cynefin-VYW2F7L2-DLB4f3WL.js} +1 -1
  24. package/ui/assets/{cynefinDiagram-TSTJHNR4-uo6P8HiB.js → cynefinDiagram-TSTJHNR4-DOAzdQop.js} +1 -1
  25. package/ui/assets/{dagre-VKFMJZFB-uy3bcf3Q.js → dagre-VKFMJZFB-B_ktUiZt.js} +1 -1
  26. package/ui/assets/{diagram-FQU43EPY-BPo9FUjZ.js → diagram-FQU43EPY-z1MSSNBR.js} +1 -1
  27. package/ui/assets/{diagram-G47NLZAW-Bhd3GtJl.js → diagram-G47NLZAW-djjCoaLI.js} +1 -1
  28. package/ui/assets/{diagram-NH7WQ7WH-DU-4-6PW.js → diagram-NH7WQ7WH-CXnb1aJP.js} +1 -1
  29. package/ui/assets/{diagram-OA4YK3LP-DUlbd4mA.js → diagram-OA4YK3LP-C4qRmYaG.js} +1 -1
  30. package/ui/assets/{diagram-WEI45ONY-B7745Zvo.js → diagram-WEI45ONY-DWb5vKEa.js} +1 -1
  31. package/ui/assets/{ebnfDiagram-CCIWWBDH-Czh6tF4d.js → ebnfDiagram-CCIWWBDH-DiCaLbft.js} +1 -1
  32. package/ui/assets/{erDiagram-Q63AITRT-tSICcbbZ.js → erDiagram-Q63AITRT-C7rJg7Ao.js} +1 -1
  33. package/ui/assets/{flowDiagram-23GEKE2U-marftwAR.js → flowDiagram-23GEKE2U-DYUHamFI.js} +1 -1
  34. package/ui/assets/{ganttDiagram-NO4QXBWP-BIxUGVA1.js → ganttDiagram-NO4QXBWP-T9YKDP0C.js} +1 -1
  35. package/ui/assets/{gitGraphDiagram-IHSO6WYX-BI2zcSR0.js → gitGraphDiagram-IHSO6WYX-Cwfl9QTk.js} +1 -1
  36. package/ui/assets/index-D-ULKJw8.js +396 -0
  37. package/ui/assets/{index-D5B2b9xz.css → index-kEDnS4kw.css} +1 -1
  38. package/ui/assets/{infoDiagram-FWYZ7A6U-CTmAl0q0.js → infoDiagram-FWYZ7A6U-ErRnZtVT.js} +1 -1
  39. package/ui/assets/{ishikawaDiagram-FXEZZL3T-5s86w_qn.js → ishikawaDiagram-FXEZZL3T-DAL_K3v8.js} +1 -1
  40. package/ui/assets/{journeyDiagram-5HDEW3XC-DOPMLggG.js → journeyDiagram-5HDEW3XC-ibb743qB.js} +1 -1
  41. package/ui/assets/{kanban-definition-HUTT4EX6-CkYQOpOQ.js → kanban-definition-HUTT4EX6-BAL3CAqR.js} +1 -1
  42. package/ui/assets/{linear-CVoQiQC3.js → linear-XHhFdX__.js} +1 -1
  43. package/ui/assets/{mermaid.core-DZEhnCSw.js → mermaid.core-DnXS5uVL.js} +4 -4
  44. package/ui/assets/{mindmap-definition-LN4V7U3C-CQuNaooi.js → mindmap-definition-LN4V7U3C-CbTfTIim.js} +1 -1
  45. package/ui/assets/{pegDiagram-2B236MQR-n3onBIHl.js → pegDiagram-2B236MQR-D7c59pvL.js} +1 -1
  46. package/ui/assets/{pieDiagram-ENE6RG2P-J7IBjKOF.js → pieDiagram-ENE6RG2P-Cv8I6g5K.js} +1 -1
  47. package/ui/assets/{quadrantDiagram-ABIIQ3AL-CYkD2nd4.js → quadrantDiagram-ABIIQ3AL-CGr0avyU.js} +1 -1
  48. package/ui/assets/{railroadDiagram-RFXS5EU6-Dt4WNh5V.js → railroadDiagram-RFXS5EU6-DIKISc4w.js} +1 -1
  49. package/ui/assets/{requirementDiagram-TGXJPOKE-BjbHEeRV.js → requirementDiagram-TGXJPOKE-Dz4JarKO.js} +1 -1
  50. package/ui/assets/{sankeyDiagram-HTMAVEWB-CjgeOfZt.js → sankeyDiagram-HTMAVEWB-3EUlVVm-.js} +1 -1
  51. package/ui/assets/{sequenceDiagram-DBY2YBRQ-DNTG331x.js → sequenceDiagram-DBY2YBRQ-DdmkFk1p.js} +1 -1
  52. package/ui/assets/{sizeCapture-X5ZJPWSS-5iQGjbbK.js → sizeCapture-X5ZJPWSS-Y1qm02jF.js} +1 -1
  53. package/ui/assets/{stateDiagram-2N3HPSRC-4BUy2Mph.js → stateDiagram-2N3HPSRC-CzAfp8c_.js} +1 -1
  54. package/ui/assets/stateDiagram-v2-6OUMAXLB-r2HIPp3R.js +1 -0
  55. package/ui/assets/{swimlanes-5IMT3BWC-DAxbIAlT.js → swimlanes-5IMT3BWC-C8RyXjnt.js} +2 -2
  56. package/ui/assets/swimlanesDiagram-G3AALYLV-D8CUuap1.js +8 -0
  57. package/ui/assets/{timeline-definition-FHXFAJF6-V7g6gVpe.js → timeline-definition-FHXFAJF6-CPQFPS34.js} +1 -1
  58. package/ui/assets/{vennDiagram-L72KCM5P-76wq4_AF.js → vennDiagram-L72KCM5P-BXUysS3C.js} +1 -1
  59. package/ui/assets/{wardleyDiagram-EHGQE667-BHnijYaJ.js → wardleyDiagram-EHGQE667-D849OiZr.js} +1 -1
  60. package/ui/assets/{xychartDiagram-FW5EYKEG-CK8mGMzB.js → xychartDiagram-FW5EYKEG-ynHQMIJQ.js} +1 -1
  61. package/ui/index.html +2 -2
  62. package/ui/assets/channel-BMVxpPzT.js +0 -1
  63. package/ui/assets/classDiagram-OUVF2IWQ-C1C_N3Xw.js +0 -1
  64. package/ui/assets/classDiagram-v2-EOCWNBFH-C1C_N3Xw.js +0 -1
  65. package/ui/assets/index-D3aR4W1I.js +0 -396
  66. package/ui/assets/stateDiagram-v2-6OUMAXLB-BhZ5TT1S.js +0 -1
  67. package/ui/assets/swimlanesDiagram-G3AALYLV-BrfWPmrM.js +0 -8
@@ -1,7 +1,8 @@
1
1
  #!/bin/sh
2
2
  set -eu
3
3
 
4
- REPO_DIR="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)"
4
+ INSTALLER_BIN_DIR="$(CDPATH= cd -- "$(dirname "$0")" && pwd)"
5
+ REPO_DIR="$(CDPATH= cd -- "$INSTALLER_BIN_DIR/.." && pwd)"
5
6
  TASK_HANDOFF_BIN=""
6
7
  TASK_HANDOFF_COMMAND=""
7
8
  CONTROL_PLANE_BIN=""
@@ -10,7 +11,7 @@ CONTROLLED_INSTANCE_BIN=""
10
11
  CONTROL_PLANE_COMMAND=""
11
12
  NODE_AGENT_COMMAND=""
12
13
  CONTROLLED_INSTANCE_COMMAND=""
13
- SERVICE_USER="task-handoff"
14
+ SERVICE_USER="root"
14
15
  ENV_DIR="/etc/task-handoff"
15
16
  CONTROL_PLANE_DATA_DIR="/var/lib/task-handoff/control-plane"
16
17
  NODE_AGENT_DATA_DIR="/var/lib/task-handoff/node-agent"
@@ -18,6 +19,7 @@ CONTROL_PLANE_HOST="0.0.0.0"
18
19
  CONTROL_PLANE_PORT="8081"
19
20
  NODE_AGENT_HOST="127.0.0.1"
20
21
  NODE_AGENT_PORT="8091"
22
+ NODE_AGENT_IPC_PATH="/run/task-handoff/node-agent.sock"
21
23
  AUTH_MODE="password"
22
24
  STATIC_DIR=""
23
25
 
@@ -35,13 +37,14 @@ Options:
35
37
  --control-plane-bin <path> Control-plane executable
36
38
  --node-agent-bin <path> Node-agent executable
37
39
  --controlled-instance-bin <path> Controlled-instance executable for local runtimes
38
- --service-user <user> systemd service user, default task-handoff
40
+ --service-user <user> systemd service user, default root
39
41
  --control-plane-data-dir <path> Control-plane data directory
40
42
  --node-agent-data-dir <path> Node-agent data directory
41
43
  --control-plane-host <host> Control-plane bind host, default 0.0.0.0
42
44
  --control-plane-port <port> Control-plane port, default 8081
43
45
  --node-agent-host <host> Local node-agent bind host, default 127.0.0.1
44
46
  --node-agent-port <port> Local node-agent port, default 8091
47
+ --node-agent-ipc-path <path> Local control socket, default /run/task-handoff/node-agent.sock
45
48
  --auth-mode <mode> Control-plane auth mode: password or disabled
46
49
  --static-dir <path> Built control-plane UI directory
47
50
  USAGE
@@ -68,6 +71,7 @@ while [ "$#" -gt 0 ]; do
68
71
  --control-plane-port) CONTROL_PLANE_PORT="${2:-}"; shift 2 ;;
69
72
  --node-agent-host) NODE_AGENT_HOST="${2:-}"; shift 2 ;;
70
73
  --node-agent-port) NODE_AGENT_PORT="${2:-}"; shift 2 ;;
74
+ --node-agent-ipc-path) NODE_AGENT_IPC_PATH="${2:-}"; shift 2 ;;
71
75
  --auth-mode) AUTH_MODE="${2:-}"; shift 2 ;;
72
76
  --static-dir) STATIC_DIR="${2:-}"; shift 2 ;;
73
77
  -h|--help) usage; exit 0 ;;
@@ -86,8 +90,8 @@ if ! command -v systemctl >/dev/null 2>&1; then
86
90
  echo "systemd is required for this installer." >&2
87
91
  exit 1
88
92
  fi
89
- if ! command -v curl >/dev/null 2>&1; then
90
- echo "curl is required for this installer." >&2
93
+ if ! command -v node >/dev/null 2>&1; then
94
+ echo "node is required for this installer." >&2
91
95
  exit 1
92
96
  fi
93
97
 
@@ -125,6 +129,15 @@ if [ -n "$TASK_HANDOFF_COMMAND" ]; then
125
129
  STATIC_DIR="$REPO_DIR/packages/control-plane-ui/dist"
126
130
  fi
127
131
  else
132
+ if [ -z "$CONTROL_PLANE_BIN" ] && [ -f "$INSTALLER_BIN_DIR/task-handoff-control-plane" ]; then
133
+ CONTROL_PLANE_BIN="$INSTALLER_BIN_DIR/task-handoff-control-plane"
134
+ fi
135
+ if [ -z "$NODE_AGENT_BIN" ] && [ -f "$INSTALLER_BIN_DIR/task-handoff-node-agent" ]; then
136
+ NODE_AGENT_BIN="$INSTALLER_BIN_DIR/task-handoff-node-agent"
137
+ fi
138
+ if [ -z "$CONTROLLED_INSTANCE_BIN" ] && [ -f "$INSTALLER_BIN_DIR/task-handoff-controlled-instance" ]; then
139
+ CONTROLLED_INSTANCE_BIN="$INSTALLER_BIN_DIR/task-handoff-controlled-instance"
140
+ fi
128
141
  CONTROL_PLANE_COMMAND="$(resolve_command "${CONTROL_PLANE_BIN:-task-handoff-control-plane}")"
129
142
  NODE_AGENT_COMMAND="$(resolve_command "${NODE_AGENT_BIN:-task-handoff-node-agent}")"
130
143
  CONTROLLED_INSTANCE_COMMAND="$(resolve_command "${CONTROLLED_INSTANCE_BIN:-task-handoff-controlled-instance}") web"
@@ -135,6 +148,8 @@ if [ -n "$STATIC_DIR" ]; then
135
148
  CONTROL_PLANE_STATIC_OPTION="--static-dir $STATIC_DIR"
136
149
  fi
137
150
 
151
+ NODE_AGENT_IPC_ENDPOINT="$(node -e 'process.stdout.write(`ipc://${encodeURIComponent(process.argv[1])}`)' "$NODE_AGENT_IPC_PATH")"
152
+
138
153
  if [ "$SERVICE_USER" != "root" ] && ! id "$SERVICE_USER" >/dev/null 2>&1; then
139
154
  useradd --system --create-home --home-dir /var/lib/task-handoff --shell /usr/sbin/nologin "$SERVICE_USER"
140
155
  fi
@@ -142,6 +157,21 @@ if [ "$SERVICE_USER" != "root" ] && getent group docker >/dev/null 2>&1; then
142
157
  usermod -aG docker "$SERVICE_USER" || true
143
158
  fi
144
159
 
160
+ assert_service_command_accessible() {
161
+ command_value="$1"
162
+ command_label="$2"
163
+ executable="${command_value%% *}"
164
+ if [ "$SERVICE_USER" != "root" ] && command -v runuser >/dev/null 2>&1 && ! runuser -u "$SERVICE_USER" -- test -x "$executable"; then
165
+ echo "$command_label is not executable by service user $SERVICE_USER: $executable" >&2
166
+ echo "Install Node.js and TaskHandoff under a system-wide prefix such as /usr/local, not a root-only NVM directory." >&2
167
+ exit 1
168
+ fi
169
+ }
170
+
171
+ assert_service_command_accessible "$CONTROL_PLANE_COMMAND" "Control-plane command"
172
+ assert_service_command_accessible "$NODE_AGENT_COMMAND" "Node-agent command"
173
+ assert_service_command_accessible "$CONTROLLED_INSTANCE_COMMAND" "Controlled-instance command"
174
+
145
175
  mkdir -p "$ENV_DIR" "$CONTROL_PLANE_DATA_DIR" "$NODE_AGENT_DATA_DIR"
146
176
  chown -R "$SERVICE_USER":"$SERVICE_USER" "$CONTROL_PLANE_DATA_DIR" "$NODE_AGENT_DATA_DIR" 2>/dev/null || true
147
177
 
@@ -149,6 +179,8 @@ cat > "$ENV_DIR/node-agent.env" <<EOF
149
179
  TASK_HANDOFF_NODE_AGENT_HOST=$NODE_AGENT_HOST
150
180
  TASK_HANDOFF_NODE_AGENT_PORT=$NODE_AGENT_PORT
151
181
  TASK_HANDOFF_NODE_AGENT_DATA_DIR=$NODE_AGENT_DATA_DIR
182
+ TASK_HANDOFF_NODE_AGENT_CONNECTION_MODE=local-ipc
183
+ TASK_HANDOFF_NODE_AGENT_IPC_PATH=$NODE_AGENT_IPC_PATH
152
184
  TASK_HANDOFF_NODE_AGENT_CONTAINER_URL=http://host.docker.internal:$NODE_AGENT_PORT
153
185
  TASK_HANDOFF_LOCAL_CONTROLLED_COMMAND=$CONTROLLED_INSTANCE_COMMAND
154
186
  EOF
@@ -161,7 +193,7 @@ TASK_HANDOFF_CONTROL_PLANE_DATA_DIR=$CONTROL_PLANE_DATA_DIR
161
193
  TASK_HANDOFF_CONTROL_PLANE_STATIC_DIR=$STATIC_DIR
162
194
  TASK_HANDOFF_CONTROL_PLANE_AUTH_MODE=$AUTH_MODE
163
195
  TASK_HANDOFF_NODE_AGENT_ENDPOINT=http://$NODE_AGENT_HOST:$NODE_AGENT_PORT
164
- TASK_HANDOFF_NODE_AGENT_CONTROL_ENDPOINT=http://$NODE_AGENT_HOST:$NODE_AGENT_PORT
196
+ TASK_HANDOFF_NODE_AGENT_CONTROL_ENDPOINT=$NODE_AGENT_IPC_ENDPOINT
165
197
  TASK_HANDOFF_NODE_AGENT_CONTAINER_URL=http://host.docker.internal:$NODE_AGENT_PORT
166
198
  EOF
167
199
  chmod 0640 "$ENV_DIR/control-plane.env"
@@ -175,9 +207,11 @@ Wants=network-online.target
175
207
  [Service]
176
208
  Type=simple
177
209
  User=$SERVICE_USER
178
- WorkingDirectory=$REPO_DIR
210
+ WorkingDirectory=$NODE_AGENT_DATA_DIR
211
+ RuntimeDirectory=task-handoff
212
+ RuntimeDirectoryMode=0700
179
213
  EnvironmentFile=-$ENV_DIR/node-agent.env
180
- ExecStart=$NODE_AGENT_COMMAND --host $NODE_AGENT_HOST --port $NODE_AGENT_PORT --data-dir $NODE_AGENT_DATA_DIR
214
+ ExecStart=$NODE_AGENT_COMMAND --host $NODE_AGENT_HOST --port $NODE_AGENT_PORT --data-dir $NODE_AGENT_DATA_DIR --connection-mode local-ipc --ipc-path $NODE_AGENT_IPC_PATH
181
215
  Restart=always
182
216
  RestartSec=3
183
217
  KillSignal=SIGTERM
@@ -195,9 +229,9 @@ Wants=network-online.target task-handoff-node-agent.service
195
229
  [Service]
196
230
  Type=simple
197
231
  User=$SERVICE_USER
198
- WorkingDirectory=$REPO_DIR
232
+ WorkingDirectory=$CONTROL_PLANE_DATA_DIR
199
233
  EnvironmentFile=-$ENV_DIR/control-plane.env
200
- ExecStartPre=/bin/sh -c 'for i in \$(seq 1 30); do curl -fsS http://$NODE_AGENT_HOST:$NODE_AGENT_PORT/api/node-agent/health >/dev/null 2>&1 && exit 0; sleep 1; done; exit 1'
234
+ ExecStartPre=/bin/sh -c 'for i in \$(seq 1 30); do [ -S "$NODE_AGENT_IPC_PATH" ] && exit 0; sleep 1; done; exit 1'
201
235
  ExecStart=$CONTROL_PLANE_COMMAND --host $CONTROL_PLANE_HOST --port $CONTROL_PLANE_PORT --data-dir $CONTROL_PLANE_DATA_DIR $CONTROL_PLANE_STATIC_OPTION --auth-mode $AUTH_MODE
202
236
  Restart=always
203
237
  RestartSec=3