@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.
- package/bin/task-handoff-install-server +31 -7
- package/dist/cli.js +1 -1
- package/package.json +1 -1
- package/ui/assets/{abnfDiagram-VRR7QNED-zpzEGQUU.js → abnfDiagram-VRR7QNED-CFqGI-zP.js} +1 -1
- package/ui/assets/{arc-YlPAcjcA.js → arc-CtRs5c2j.js} +1 -1
- package/ui/assets/{architectureDiagram-ZJ3FMSHR-gKh1GoJ-.js → architectureDiagram-ZJ3FMSHR-Bv9RRoI6.js} +1 -1
- package/ui/assets/{blockDiagram-677ZJIJ3-BPoey46h.js → blockDiagram-677ZJIJ3-DhWEYWLK.js} +1 -1
- package/ui/assets/{c4Diagram-LMCZKHZV-Ba-K1kbG.js → c4Diagram-LMCZKHZV-BT49PUGj.js} +1 -1
- package/ui/assets/channel-I_NjHJ8V.js +1 -0
- package/ui/assets/{chunk-2Q5K7J3B-B21lfJN3.js → chunk-2Q5K7J3B-Dd5D78p7.js} +1 -1
- package/ui/assets/{chunk-32BRIVSS-4DXGAb-p.js → chunk-32BRIVSS-oLbCklmC.js} +1 -1
- package/ui/assets/{chunk-5VM5RSS4-BTJ3QwFs.js → chunk-5VM5RSS4-CpuzYXEm.js} +1 -1
- package/ui/assets/{chunk-EX3LRPZG-BNbiyHtR.js → chunk-EX3LRPZG-8lh_Qh5f.js} +1 -1
- package/ui/assets/{chunk-JWPE2WC7-DCyFrqSV.js → chunk-JWPE2WC7-BWNuUTKy.js} +1 -1
- package/ui/assets/{chunk-MOJQB5TN-CpZLzjfV.js → chunk-MOJQB5TN-4JLfNf2b.js} +1 -1
- package/ui/assets/{chunk-RYQCIY6F-C6An87oR.js → chunk-RYQCIY6F-BujA9Ow9.js} +1 -1
- package/ui/assets/{chunk-V7JOEXUC-BUW8J6c_.js → chunk-V7JOEXUC-CvBDX2sb.js} +1 -1
- package/ui/assets/{chunk-VR4S4FIN-rsqRXVtN.js → chunk-VR4S4FIN-Dc-Wj9PW.js} +1 -1
- package/ui/assets/{chunk-XXDRQBXY-lgeU6p-p.js → chunk-XXDRQBXY-B6RoIPWq.js} +1 -1
- package/ui/assets/classDiagram-OUVF2IWQ-D6nx1o3S.js +1 -0
- package/ui/assets/classDiagram-v2-EOCWNBFH-D6nx1o3S.js +1 -0
- package/ui/assets/{cose-bilkent-JH36ORCC-CI_7H8mu.js → cose-bilkent-JH36ORCC-BSrsfYkn.js} +1 -1
- package/ui/assets/{cynefin-VYW2F7L2-DDtwbU8C.js → cynefin-VYW2F7L2-Dbr0eCIz.js} +1 -1
- package/ui/assets/{cynefinDiagram-TSTJHNR4-uo6P8HiB.js → cynefinDiagram-TSTJHNR4-DP741M5u.js} +1 -1
- package/ui/assets/{dagre-VKFMJZFB-uy3bcf3Q.js → dagre-VKFMJZFB-BzVC3ZFs.js} +1 -1
- package/ui/assets/{diagram-FQU43EPY-BPo9FUjZ.js → diagram-FQU43EPY-BnyymKd6.js} +1 -1
- package/ui/assets/{diagram-G47NLZAW-Bhd3GtJl.js → diagram-G47NLZAW-DHcwA4tv.js} +1 -1
- package/ui/assets/{diagram-NH7WQ7WH-DU-4-6PW.js → diagram-NH7WQ7WH-CyNMAzzs.js} +1 -1
- package/ui/assets/{diagram-OA4YK3LP-DUlbd4mA.js → diagram-OA4YK3LP-C7NDki_B.js} +1 -1
- package/ui/assets/{diagram-WEI45ONY-B7745Zvo.js → diagram-WEI45ONY-2eg4GGO_.js} +1 -1
- package/ui/assets/{ebnfDiagram-CCIWWBDH-Czh6tF4d.js → ebnfDiagram-CCIWWBDH-BDXvo2s_.js} +1 -1
- package/ui/assets/{erDiagram-Q63AITRT-tSICcbbZ.js → erDiagram-Q63AITRT-CIUgrzx2.js} +1 -1
- package/ui/assets/{flowDiagram-23GEKE2U-marftwAR.js → flowDiagram-23GEKE2U-DfVRPkLD.js} +1 -1
- package/ui/assets/{ganttDiagram-NO4QXBWP-BIxUGVA1.js → ganttDiagram-NO4QXBWP-DIzx907v.js} +1 -1
- package/ui/assets/{gitGraphDiagram-IHSO6WYX-BI2zcSR0.js → gitGraphDiagram-IHSO6WYX-BO-0EOCE.js} +1 -1
- package/ui/assets/{index-D5B2b9xz.css → index-FEJwVSw1.css} +1 -1
- package/ui/assets/index-V-ThLVqc.js +396 -0
- package/ui/assets/{infoDiagram-FWYZ7A6U-CTmAl0q0.js → infoDiagram-FWYZ7A6U-aWTlxS7z.js} +1 -1
- package/ui/assets/{ishikawaDiagram-FXEZZL3T-5s86w_qn.js → ishikawaDiagram-FXEZZL3T-DLxGxqCh.js} +1 -1
- package/ui/assets/{journeyDiagram-5HDEW3XC-DOPMLggG.js → journeyDiagram-5HDEW3XC-BicmInSf.js} +1 -1
- package/ui/assets/{kanban-definition-HUTT4EX6-CkYQOpOQ.js → kanban-definition-HUTT4EX6-Cuus2DNT.js} +1 -1
- package/ui/assets/{linear-CVoQiQC3.js → linear-BKK2jQO-.js} +1 -1
- package/ui/assets/{mermaid.core-DZEhnCSw.js → mermaid.core-BPC0nwBJ.js} +4 -4
- package/ui/assets/{mindmap-definition-LN4V7U3C-CQuNaooi.js → mindmap-definition-LN4V7U3C-B-sCjUDM.js} +1 -1
- package/ui/assets/{pegDiagram-2B236MQR-n3onBIHl.js → pegDiagram-2B236MQR-CGHJoTW1.js} +1 -1
- package/ui/assets/{pieDiagram-ENE6RG2P-J7IBjKOF.js → pieDiagram-ENE6RG2P-BkbqntJ2.js} +1 -1
- package/ui/assets/{quadrantDiagram-ABIIQ3AL-CYkD2nd4.js → quadrantDiagram-ABIIQ3AL-DQXbv-TE.js} +1 -1
- package/ui/assets/{railroadDiagram-RFXS5EU6-Dt4WNh5V.js → railroadDiagram-RFXS5EU6-CzD12xdv.js} +1 -1
- package/ui/assets/{requirementDiagram-TGXJPOKE-BjbHEeRV.js → requirementDiagram-TGXJPOKE-RwU9qDjk.js} +1 -1
- package/ui/assets/{sankeyDiagram-HTMAVEWB-CjgeOfZt.js → sankeyDiagram-HTMAVEWB-0l_UrhuE.js} +1 -1
- package/ui/assets/{sequenceDiagram-DBY2YBRQ-DNTG331x.js → sequenceDiagram-DBY2YBRQ-6NcSmOLg.js} +1 -1
- package/ui/assets/{sizeCapture-X5ZJPWSS-5iQGjbbK.js → sizeCapture-X5ZJPWSS-BqF-pWOl.js} +1 -1
- package/ui/assets/{stateDiagram-2N3HPSRC-4BUy2Mph.js → stateDiagram-2N3HPSRC-DavrTL0P.js} +1 -1
- package/ui/assets/stateDiagram-v2-6OUMAXLB-XTqB4H3z.js +1 -0
- package/ui/assets/{swimlanes-5IMT3BWC-DAxbIAlT.js → swimlanes-5IMT3BWC-B5OmFtyK.js} +2 -2
- package/ui/assets/swimlanesDiagram-G3AALYLV-DNTYtDpF.js +8 -0
- package/ui/assets/{timeline-definition-FHXFAJF6-V7g6gVpe.js → timeline-definition-FHXFAJF6-Cm4Swf3C.js} +1 -1
- package/ui/assets/{vennDiagram-L72KCM5P-76wq4_AF.js → vennDiagram-L72KCM5P-DJ0OpGA-.js} +1 -1
- package/ui/assets/{wardleyDiagram-EHGQE667-BHnijYaJ.js → wardleyDiagram-EHGQE667-SsUQrcDN.js} +1 -1
- package/ui/assets/{xychartDiagram-FW5EYKEG-CK8mGMzB.js → xychartDiagram-FW5EYKEG-CWp_a7PG.js} +1 -1
- package/ui/index.html +2 -2
- package/ui/assets/channel-BMVxpPzT.js +0 -1
- package/ui/assets/classDiagram-OUVF2IWQ-C1C_N3Xw.js +0 -1
- package/ui/assets/classDiagram-v2-EOCWNBFH-C1C_N3Xw.js +0 -1
- package/ui/assets/index-D3aR4W1I.js +0 -396
- package/ui/assets/stateDiagram-v2-6OUMAXLB-BhZ5TT1S.js +0 -1
- 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
|
|
90
|
-
echo "
|
|
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
|
|
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=$
|
|
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=$
|
|
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
|
|
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
|