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

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 +31 -7
  2. package/dist/cli.js +1 -1
  3. package/package.json +1 -1
  4. package/ui/assets/{abnfDiagram-VRR7QNED-zpzEGQUU.js → abnfDiagram-VRR7QNED-CFqGI-zP.js} +1 -1
  5. package/ui/assets/{arc-YlPAcjcA.js → arc-CtRs5c2j.js} +1 -1
  6. package/ui/assets/{architectureDiagram-ZJ3FMSHR-gKh1GoJ-.js → architectureDiagram-ZJ3FMSHR-Bv9RRoI6.js} +1 -1
  7. package/ui/assets/{blockDiagram-677ZJIJ3-BPoey46h.js → blockDiagram-677ZJIJ3-DhWEYWLK.js} +1 -1
  8. package/ui/assets/{c4Diagram-LMCZKHZV-Ba-K1kbG.js → c4Diagram-LMCZKHZV-BT49PUGj.js} +1 -1
  9. package/ui/assets/channel-I_NjHJ8V.js +1 -0
  10. package/ui/assets/{chunk-2Q5K7J3B-B21lfJN3.js → chunk-2Q5K7J3B-Dd5D78p7.js} +1 -1
  11. package/ui/assets/{chunk-32BRIVSS-4DXGAb-p.js → chunk-32BRIVSS-oLbCklmC.js} +1 -1
  12. package/ui/assets/{chunk-5VM5RSS4-BTJ3QwFs.js → chunk-5VM5RSS4-CpuzYXEm.js} +1 -1
  13. package/ui/assets/{chunk-EX3LRPZG-BNbiyHtR.js → chunk-EX3LRPZG-8lh_Qh5f.js} +1 -1
  14. package/ui/assets/{chunk-JWPE2WC7-DCyFrqSV.js → chunk-JWPE2WC7-BWNuUTKy.js} +1 -1
  15. package/ui/assets/{chunk-MOJQB5TN-CpZLzjfV.js → chunk-MOJQB5TN-4JLfNf2b.js} +1 -1
  16. package/ui/assets/{chunk-RYQCIY6F-C6An87oR.js → chunk-RYQCIY6F-BujA9Ow9.js} +1 -1
  17. package/ui/assets/{chunk-V7JOEXUC-BUW8J6c_.js → chunk-V7JOEXUC-CvBDX2sb.js} +1 -1
  18. package/ui/assets/{chunk-VR4S4FIN-rsqRXVtN.js → chunk-VR4S4FIN-Dc-Wj9PW.js} +1 -1
  19. package/ui/assets/{chunk-XXDRQBXY-lgeU6p-p.js → chunk-XXDRQBXY-B6RoIPWq.js} +1 -1
  20. package/ui/assets/classDiagram-OUVF2IWQ-D6nx1o3S.js +1 -0
  21. package/ui/assets/classDiagram-v2-EOCWNBFH-D6nx1o3S.js +1 -0
  22. package/ui/assets/{cose-bilkent-JH36ORCC-CI_7H8mu.js → cose-bilkent-JH36ORCC-BSrsfYkn.js} +1 -1
  23. package/ui/assets/{cynefin-VYW2F7L2-DDtwbU8C.js → cynefin-VYW2F7L2-Dbr0eCIz.js} +1 -1
  24. package/ui/assets/{cynefinDiagram-TSTJHNR4-uo6P8HiB.js → cynefinDiagram-TSTJHNR4-DP741M5u.js} +1 -1
  25. package/ui/assets/{dagre-VKFMJZFB-uy3bcf3Q.js → dagre-VKFMJZFB-BzVC3ZFs.js} +1 -1
  26. package/ui/assets/{diagram-FQU43EPY-BPo9FUjZ.js → diagram-FQU43EPY-BnyymKd6.js} +1 -1
  27. package/ui/assets/{diagram-G47NLZAW-Bhd3GtJl.js → diagram-G47NLZAW-DHcwA4tv.js} +1 -1
  28. package/ui/assets/{diagram-NH7WQ7WH-DU-4-6PW.js → diagram-NH7WQ7WH-CyNMAzzs.js} +1 -1
  29. package/ui/assets/{diagram-OA4YK3LP-DUlbd4mA.js → diagram-OA4YK3LP-C7NDki_B.js} +1 -1
  30. package/ui/assets/{diagram-WEI45ONY-B7745Zvo.js → diagram-WEI45ONY-2eg4GGO_.js} +1 -1
  31. package/ui/assets/{ebnfDiagram-CCIWWBDH-Czh6tF4d.js → ebnfDiagram-CCIWWBDH-BDXvo2s_.js} +1 -1
  32. package/ui/assets/{erDiagram-Q63AITRT-tSICcbbZ.js → erDiagram-Q63AITRT-CIUgrzx2.js} +1 -1
  33. package/ui/assets/{flowDiagram-23GEKE2U-marftwAR.js → flowDiagram-23GEKE2U-DfVRPkLD.js} +1 -1
  34. package/ui/assets/{ganttDiagram-NO4QXBWP-BIxUGVA1.js → ganttDiagram-NO4QXBWP-DIzx907v.js} +1 -1
  35. package/ui/assets/{gitGraphDiagram-IHSO6WYX-BI2zcSR0.js → gitGraphDiagram-IHSO6WYX-BO-0EOCE.js} +1 -1
  36. package/ui/assets/{index-D5B2b9xz.css → index-FEJwVSw1.css} +1 -1
  37. package/ui/assets/index-V-ThLVqc.js +396 -0
  38. package/ui/assets/{infoDiagram-FWYZ7A6U-CTmAl0q0.js → infoDiagram-FWYZ7A6U-aWTlxS7z.js} +1 -1
  39. package/ui/assets/{ishikawaDiagram-FXEZZL3T-5s86w_qn.js → ishikawaDiagram-FXEZZL3T-DLxGxqCh.js} +1 -1
  40. package/ui/assets/{journeyDiagram-5HDEW3XC-DOPMLggG.js → journeyDiagram-5HDEW3XC-BicmInSf.js} +1 -1
  41. package/ui/assets/{kanban-definition-HUTT4EX6-CkYQOpOQ.js → kanban-definition-HUTT4EX6-Cuus2DNT.js} +1 -1
  42. package/ui/assets/{linear-CVoQiQC3.js → linear-BKK2jQO-.js} +1 -1
  43. package/ui/assets/{mermaid.core-DZEhnCSw.js → mermaid.core-BPC0nwBJ.js} +4 -4
  44. package/ui/assets/{mindmap-definition-LN4V7U3C-CQuNaooi.js → mindmap-definition-LN4V7U3C-B-sCjUDM.js} +1 -1
  45. package/ui/assets/{pegDiagram-2B236MQR-n3onBIHl.js → pegDiagram-2B236MQR-CGHJoTW1.js} +1 -1
  46. package/ui/assets/{pieDiagram-ENE6RG2P-J7IBjKOF.js → pieDiagram-ENE6RG2P-BkbqntJ2.js} +1 -1
  47. package/ui/assets/{quadrantDiagram-ABIIQ3AL-CYkD2nd4.js → quadrantDiagram-ABIIQ3AL-DQXbv-TE.js} +1 -1
  48. package/ui/assets/{railroadDiagram-RFXS5EU6-Dt4WNh5V.js → railroadDiagram-RFXS5EU6-CzD12xdv.js} +1 -1
  49. package/ui/assets/{requirementDiagram-TGXJPOKE-BjbHEeRV.js → requirementDiagram-TGXJPOKE-RwU9qDjk.js} +1 -1
  50. package/ui/assets/{sankeyDiagram-HTMAVEWB-CjgeOfZt.js → sankeyDiagram-HTMAVEWB-0l_UrhuE.js} +1 -1
  51. package/ui/assets/{sequenceDiagram-DBY2YBRQ-DNTG331x.js → sequenceDiagram-DBY2YBRQ-6NcSmOLg.js} +1 -1
  52. package/ui/assets/{sizeCapture-X5ZJPWSS-5iQGjbbK.js → sizeCapture-X5ZJPWSS-BqF-pWOl.js} +1 -1
  53. package/ui/assets/{stateDiagram-2N3HPSRC-4BUy2Mph.js → stateDiagram-2N3HPSRC-DavrTL0P.js} +1 -1
  54. package/ui/assets/stateDiagram-v2-6OUMAXLB-XTqB4H3z.js +1 -0
  55. package/ui/assets/{swimlanes-5IMT3BWC-DAxbIAlT.js → swimlanes-5IMT3BWC-B5OmFtyK.js} +2 -2
  56. package/ui/assets/swimlanesDiagram-G3AALYLV-DNTYtDpF.js +8 -0
  57. package/ui/assets/{timeline-definition-FHXFAJF6-V7g6gVpe.js → timeline-definition-FHXFAJF6-Cm4Swf3C.js} +1 -1
  58. package/ui/assets/{vennDiagram-L72KCM5P-76wq4_AF.js → vennDiagram-L72KCM5P-DJ0OpGA-.js} +1 -1
  59. package/ui/assets/{wardleyDiagram-EHGQE667-BHnijYaJ.js → wardleyDiagram-EHGQE667-SsUQrcDN.js} +1 -1
  60. package/ui/assets/{xychartDiagram-FW5EYKEG-CK8mGMzB.js → xychartDiagram-FW5EYKEG-CWp_a7PG.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
@@ -18,6 +18,7 @@ CONTROL_PLANE_HOST="0.0.0.0"
18
18
  CONTROL_PLANE_PORT="8081"
19
19
  NODE_AGENT_HOST="127.0.0.1"
20
20
  NODE_AGENT_PORT="8091"
21
+ NODE_AGENT_IPC_PATH="/run/task-handoff/node-agent.sock"
21
22
  AUTH_MODE="password"
22
23
  STATIC_DIR=""
23
24
 
@@ -42,6 +43,7 @@ Options:
42
43
  --control-plane-port <port> Control-plane port, default 8081
43
44
  --node-agent-host <host> Local node-agent bind host, default 127.0.0.1
44
45
  --node-agent-port <port> Local node-agent port, default 8091
46
+ --node-agent-ipc-path <path> Local control socket, default /run/task-handoff/node-agent.sock
45
47
  --auth-mode <mode> Control-plane auth mode: password or disabled
46
48
  --static-dir <path> Built control-plane UI directory
47
49
  USAGE
@@ -68,6 +70,7 @@ while [ "$#" -gt 0 ]; do
68
70
  --control-plane-port) CONTROL_PLANE_PORT="${2:-}"; shift 2 ;;
69
71
  --node-agent-host) NODE_AGENT_HOST="${2:-}"; shift 2 ;;
70
72
  --node-agent-port) NODE_AGENT_PORT="${2:-}"; shift 2 ;;
73
+ --node-agent-ipc-path) NODE_AGENT_IPC_PATH="${2:-}"; shift 2 ;;
71
74
  --auth-mode) AUTH_MODE="${2:-}"; shift 2 ;;
72
75
  --static-dir) STATIC_DIR="${2:-}"; shift 2 ;;
73
76
  -h|--help) usage; exit 0 ;;
@@ -86,8 +89,8 @@ if ! command -v systemctl >/dev/null 2>&1; then
86
89
  echo "systemd is required for this installer." >&2
87
90
  exit 1
88
91
  fi
89
- if ! command -v curl >/dev/null 2>&1; then
90
- echo "curl is required for this installer." >&2
92
+ if ! command -v node >/dev/null 2>&1; then
93
+ echo "node is required for this installer." >&2
91
94
  exit 1
92
95
  fi
93
96
 
@@ -135,6 +138,8 @@ if [ -n "$STATIC_DIR" ]; then
135
138
  CONTROL_PLANE_STATIC_OPTION="--static-dir $STATIC_DIR"
136
139
  fi
137
140
 
141
+ NODE_AGENT_IPC_ENDPOINT="$(node -e 'process.stdout.write(`ipc://${encodeURIComponent(process.argv[1])}`)' "$NODE_AGENT_IPC_PATH")"
142
+
138
143
  if [ "$SERVICE_USER" != "root" ] && ! id "$SERVICE_USER" >/dev/null 2>&1; then
139
144
  useradd --system --create-home --home-dir /var/lib/task-handoff --shell /usr/sbin/nologin "$SERVICE_USER"
140
145
  fi
@@ -142,6 +147,21 @@ if [ "$SERVICE_USER" != "root" ] && getent group docker >/dev/null 2>&1; then
142
147
  usermod -aG docker "$SERVICE_USER" || true
143
148
  fi
144
149
 
150
+ assert_service_command_accessible() {
151
+ command_value="$1"
152
+ command_label="$2"
153
+ executable="${command_value%% *}"
154
+ if [ "$SERVICE_USER" != "root" ] && command -v runuser >/dev/null 2>&1 && ! runuser -u "$SERVICE_USER" -- test -x "$executable"; then
155
+ echo "$command_label is not executable by service user $SERVICE_USER: $executable" >&2
156
+ echo "Install Node.js and TaskHandoff under a system-wide prefix such as /usr/local, not a root-only NVM directory." >&2
157
+ exit 1
158
+ fi
159
+ }
160
+
161
+ assert_service_command_accessible "$CONTROL_PLANE_COMMAND" "Control-plane command"
162
+ assert_service_command_accessible "$NODE_AGENT_COMMAND" "Node-agent command"
163
+ assert_service_command_accessible "$CONTROLLED_INSTANCE_COMMAND" "Controlled-instance command"
164
+
145
165
  mkdir -p "$ENV_DIR" "$CONTROL_PLANE_DATA_DIR" "$NODE_AGENT_DATA_DIR"
146
166
  chown -R "$SERVICE_USER":"$SERVICE_USER" "$CONTROL_PLANE_DATA_DIR" "$NODE_AGENT_DATA_DIR" 2>/dev/null || true
147
167
 
@@ -149,6 +169,8 @@ cat > "$ENV_DIR/node-agent.env" <<EOF
149
169
  TASK_HANDOFF_NODE_AGENT_HOST=$NODE_AGENT_HOST
150
170
  TASK_HANDOFF_NODE_AGENT_PORT=$NODE_AGENT_PORT
151
171
  TASK_HANDOFF_NODE_AGENT_DATA_DIR=$NODE_AGENT_DATA_DIR
172
+ TASK_HANDOFF_NODE_AGENT_CONNECTION_MODE=local-ipc
173
+ TASK_HANDOFF_NODE_AGENT_IPC_PATH=$NODE_AGENT_IPC_PATH
152
174
  TASK_HANDOFF_NODE_AGENT_CONTAINER_URL=http://host.docker.internal:$NODE_AGENT_PORT
153
175
  TASK_HANDOFF_LOCAL_CONTROLLED_COMMAND=$CONTROLLED_INSTANCE_COMMAND
154
176
  EOF
@@ -161,7 +183,7 @@ TASK_HANDOFF_CONTROL_PLANE_DATA_DIR=$CONTROL_PLANE_DATA_DIR
161
183
  TASK_HANDOFF_CONTROL_PLANE_STATIC_DIR=$STATIC_DIR
162
184
  TASK_HANDOFF_CONTROL_PLANE_AUTH_MODE=$AUTH_MODE
163
185
  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
186
+ TASK_HANDOFF_NODE_AGENT_CONTROL_ENDPOINT=$NODE_AGENT_IPC_ENDPOINT
165
187
  TASK_HANDOFF_NODE_AGENT_CONTAINER_URL=http://host.docker.internal:$NODE_AGENT_PORT
166
188
  EOF
167
189
  chmod 0640 "$ENV_DIR/control-plane.env"
@@ -175,9 +197,11 @@ Wants=network-online.target
175
197
  [Service]
176
198
  Type=simple
177
199
  User=$SERVICE_USER
178
- WorkingDirectory=$REPO_DIR
200
+ WorkingDirectory=$NODE_AGENT_DATA_DIR
201
+ RuntimeDirectory=task-handoff
202
+ RuntimeDirectoryMode=0700
179
203
  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
204
+ 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
205
  Restart=always
182
206
  RestartSec=3
183
207
  KillSignal=SIGTERM
@@ -195,9 +219,9 @@ Wants=network-online.target task-handoff-node-agent.service
195
219
  [Service]
196
220
  Type=simple
197
221
  User=$SERVICE_USER
198
- WorkingDirectory=$REPO_DIR
222
+ WorkingDirectory=$CONTROL_PLANE_DATA_DIR
199
223
  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'
224
+ ExecStartPre=/bin/sh -c 'for i in \$(seq 1 30); do [ -S "$NODE_AGENT_IPC_PATH" ] && exit 0; sleep 1; done; exit 1'
201
225
  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
226
  Restart=always
203
227
  RestartSec=3